Nodemailer在本地可以正常工作,但在Render的生产环境中会超时(Gmail的 SMTP端口465/587)

前端开发 2026-07-12

我有一个基于Node.js + Express的应用,使用Nodemailer。
在本地使用Gmail的 SMTP可以正常发送邮件,但在Render的生产环境里总是超时。

设置:

  • 主机:smtp.gmail.com
  • 主要端口:465(secure: true)
  • 备用端口:587(secure: false,STARTTLS)
  • 与本地相同的凭据和应用密码
  • 将超时设置增至30秒

生产日志:

Primary SMTP send failed, retrying on fallback SMTP port: SMTP primary send timeout after 30000ms
Failed to send verification email: Error: SMTP fallback send timeout after 30000ms

我的传输设置(简化):

const transporter = nodemailer.createTransport({
  host: process.env.SMTP_HOST, // smtp.gmail.com
  port: Number(process.env.SMTP_PORT), // 465
  secure: true,
  auth: {
    user: process.env.SMTP_USER,
    pass: process.env.SMTP_PASS,
  },
  connectionTimeout: 30000,
  greetingTimeout: 30000,
  socketTimeout: 30000,
});

发送函数:

await transporter.sendMail({  
  from: process.env.MAIL_FROM,  
  to,  
  subject,  
  text,  
  html,  
});

说明:

  • 应用不是无服务器的;它是一个在Render上长期运行的Web服务。
  • 生产环境中的HTTP端点工作正常。
  • 这似乎只有出站SMTP出问题。
  • 如果使用一个HTTP邮件API(Resend),在生产中发送就能成功。

在这个环境里,是否还可以尝试Nodemailer/Gmail SMTP的其他方法,还是很可能是Render对 Gmail(465/587)的出站SMTP/网络限制?
如果是环境相关,推荐的生产方案是什么?

解决方案

这篇来自2025年 9月的Render更新日志看起来相关:https://render.com/changelog/free-web-services-will-no-longer-allow-outbound-traffic-to-smtp-ports

免费网络服务将不再允许出站流量访问SMTP端口

从下周开始,免费的Render网络服务将阻止对SMTP端口25、465和 587的出站网络流量。

这一变更将在所有区域于9 月26日(星期五)上线。 如要继续向SMTP端口发送流量,您可以将免费网络服务升级到任意付费实例类型。

如果这是你的问题,你的选项似乎是:

  • 将Render实例升级为付费版本
  • 使用类似Mailgun或 Sendgrid的 HTTP邮件API
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章