Next.JS 和 Nodemailer,通过联系表单发送电子邮件

15

我在Next.js中使用联系表格遇到了问题,在部署到Vercel后,我没有任何错误(显示的),一切都正常。我获取我的表格,并获得状态200,但我没有在Gmail上收到我的电子邮件。而且我没有收到任何其他信息。 当我在“dev”和“build”上测试我的应用程序时,我收到了电子邮件。 我也在Gmail帐户中拥有“不太安全的应用程序”选项。

以下是我的Next.JS代码:

contact.js中的fetch方法:

 fetch("/api/contact", {
        method: "POST",
        headers: {
          Accept: "application/json, text/plain, */*",
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          name: mailName,
          email: mailAddress,
          text: mailText,
        }),
      }).then((res) => {
        console.log("Fetch: ", res);
        res.status === 200
        ?
        router.push("/success")
          : router.push("/error");

在api/contact.js中

require("dotenv").config();
const nodemailer = require("nodemailer");

export default (req, res) => {

  const { name, email, text } = req.body;

  const transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: process.env.EMAIL,
      pass: process.env.PASSWORD,
    },
  });

  const mailOption = {
    from: `${email}`,
    to: `${process.env.EMAIL}`,
    subject: `New mail from ${email}`,
    text: `
    ${name} wrote:
    ${text}
    `,
  };

  transporter.sendMail(mailOption, (err, data) => {
    if (err) {
      console.log(err);
    } else {
      console.log("mail send");
    }
  });

  console.log(name, email, text);
  res.send("success");
};
请帮忙。

1
你找到解决方案了吗?我也遇到了同样的问题,很让人沮丧,因为在开发中一切都正常,但在生产环境中却出现问题。 - Basit Minhas
1个回答

15

由于您的代码在本地运行良好而在部署环境中无法运行,我有两个建议。

首先,请确保您设置了所有环境变量。

其次,您编写代码的方式将始终返回成功,因为transporter.sendMail是异步的,而res.send在其外部。

请更改如下,

<code>transporter.sendMail(mailOption, (err, data) => {
    if (err) {
      console.log(err);
      res.send("error" + JSON.stringify(err));
    } else {
      console.log("mail send");
      res.send("success");
    }
});
</code>

1
很高兴能帮忙.. :) - sidthesloth
1
谢谢。我刚遇到了同样的问题,这指引了我正确的方向。 - Darryl Young
非常感谢你! - AbdulAzeez Olanrewaju
非常感谢。同样的问题。 - Dmytro Cheglakov
谢谢,兄弟!!你应该得到更多的赞扬!!! - Shamxeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接