邮件从本地主机发送,而不是从数字海洋上的实时站点发送

Mail sends from localhost but not from live site on digital ocean

我正在使用 Sendgrid API 从我的 Node.js 项目发送电子邮件。当 运行 在我的本地机器上时,这工作正常,但现在我已经部署到 Digital Ocean (Ubuntu) 邮件不发送。我读过 Digital Ocean 默认情况下会阻止 smtp 端口,您显然可以通过命令行打开它们,但我找不到关于如何执行此操作的易于理解的解释。

const nodemailer = require("nodemailer");
const sendgridTransport = require('nodemailer-sendgrid-transport');

    const transporter = nodemailer.createTransport(sendgridTransport({
      auth: {
          api_key: process.env.SENDGRID_API
      }
    }));

    return transporter.sendMail({
      to: 'info@example.com',
      from: email,
      subject: subject,
      html: `<h1>Contact Form</h1>
            <p>Name: ${name}</p>
            <p>Email: ${email}</p>
            <p>${comments}</p>
    `
    });

更新

如果我删除 api 密钥的 .env 并实际将其硬编码在例如:

const transporter = nodemailer.createTransport(sendgridTransport({
  auth: {
      api_key: '12345677788999'
  }
}));

然后我的电子邮件发送。这是我的 .env 文件(我正在使用 dotenv)

DB_USER=username
DB_PASSWORD=password
DB_NAME=mydbname
SENDGRID_API=12345677788999

那么,不确定为什么会这样?

你在环境中导出了这个"SENDGRID_API"。那么只有你可以使用 process.env.SomeEnvironmentVar.

如果您使用的是 PM2.您必须将其添加到生态系统文件中。然后它将使用该配置并启动您的应用程序。使所有变量可用。

我在使用 SendGrid、Digitalocean (Ubuntu) 和 PM2 时遇到了同样的问题。

PM2 似乎没有像@himank 在他的回答中提到的那样自动检测 .env 文件的变化,所以我不得不从 PM2 中删除项目,然后重新启动它。

请注意: