Nodemailer在本地可以正常工作,但在Render的生产环境中会超时(Gmail的 SMTP端口465/587)
我有一个基于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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。