You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生产环境下使用Nodemailer无法发送邮件问题求助

Nodemailer本地发送正常,生产环境返回成功但收不到邮件

本地Node.js服务使用Nodemailer发送邮件完全正常,但部署到生产服务器后,接口返回发送成功日志,却始终收不到邮件。已检查防火墙、SMTP端口配置,甚至关闭防火墙测试,问题依旧。

以下是发送邮件的代码:

export const securityEmailSender = async (
  senderEmail: string,
  subject: string,
  body: string
): Promise<void> => {
  const transporter: Transporter = nodemailer.createTransport({
    host: appConfig.host,
    port: appConfig.port,
    // secure: true,
    auth: {
      user: "***",
      pass: "***",
    },
  });

  // setup email data with unicode symbols
  const mailOptions = {
    from: `${appConfig.brandName} <***>`,
    to: senderEmail,
    subject: subject,
    html: body,
  };

  // send mail with defined transport object
  try {
    const info = await transporter.sendMail(mailOptions);
    console.log("Message sent: " + info.response);
  } catch (error) {
    console.log(error);
  }
};

排查方向:

  • 修正secure配置:生产环境SMTP服务对加密要求更严格,若端口是465,必须开启secure: true;若为587,需设secure: false并添加requireTLS: true。本地环境可能宽松所以不受影响,但生产环境会因为加密不规范导致邮件被拦截。
  • 核对发件人地址:mailOptions.from必须和SMTP auth的user地址完全一致,多数邮件服务商(如Gmail、企业邮箱)会拦截发件人与认证账号不符的邮件,且不会返回错误。
  • 开启SMTP调试日志:给createTransport添加debug: true,或者监听log事件获取详细交互日志,确认邮件是否真的被SMTP服务器接收:
    transporter.on('log', (data) => {
      console.log('SMTP交互日志:', data);
    });
    
  • 检查邮件服务商的IP白名单/域名配置:很多邮件服务要求生产服务器IP加入发信白名单,或配置DKIM、SPF记录。本地IP可能已在白名单内,生产IP未备案则会被拦截。
  • 排查收件人垃圾邮件文件夹:部分邮件会被判定为垃圾邮件,直接进入收件人的垃圾站或订阅邮件目录,而非被拒收。
  • 验证生产环境配置:确认appConfig的生产环境参数(host、port)与本地一致,避免因环境变量配置错误连接到错误的SMTP服务器。

内容的提问来源于stack exchange,提问作者Dillip Kumar Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:07:43