为什么 Nodemailer 可以在本地运行,但不能在生产环境中运行?

问题描述 投票:0回答:1

当我尝试在本地发送电子邮件时,它可以工作,但在生产中,在网络选项卡中,我一切正常,只是电子邮件不想发送,并且我没有收到任何错误。

  try {
    const { name, email, message } = req.body;

    const transporter = nodemailer.createTransport({
      port: 465,
      host: "smtp.gmail.com",
      auth: {
        user: process.env.NEXT_PUBLIC_GMAIL_EMAIL,
        pass: process.env.NEXT_PUBLIC_GMAIL_PASSWORD,
      },
      secure: true,
    });

    const mailData = {
      from: process.env.NEXT_PUBLIC_GMAIL_EMAIL,
      to: process.env.NEXT_PUBLIC_EMAIL_WHICH_RECIEVES_CONTACT_INFO,
      subject: `Message From ${email}`,
      text: message,
    };

    transporter.sendMail(mailData, function (err, info) {
      if (err) console.log(err);
      else console.log(info);
    });

    res.status(200).json({ message: "Email sent" });
  } catch (error: any) {
    res.status(500).json({ message: error.message });
  }

node.js reactjs next.js nodemailer
1个回答
9
投票

我对 Nodemailer 和 Next.js 也有类似的问题,尝试将

transporter
包装在 Promise 中,希望它也适合你:

await new Promise((resolve, reject) => {
    transporter.sendMail(mailData, (err, info) => {
      if (err) {
        console.error(err);
        reject(err);
      } else {
        resolve(info);
      }
    });
  });

解释:由于无服务功能的性质,我们必须先

await
才能发送电子邮件,然后才能继续。如果我们不这样做,无服务器功能将在发送电子邮件之前结束(因为它是短暂的)

但是,您应该注意,此解决方案适合发送几封电子邮件,如果您打算批量发送电子邮件,您最好使用专门的电子邮件服务,例如 sendgrid

© www.soinside.com 2019 - 2024. All rights reserved.