Vercel部署后Nodemailer无法收邮件求助(日志显示发送成功)
Nodemailer部署到Vercel后无法接收邮件的解决方案
检查邮件服务商安全策略
很多邮箱服务商(比如Gmail、QQ邮箱)会拦截Vercel这类云平台发出的邮件,因为平台IP可能被纳入垃圾邮件池。- 先去邮箱的垃圾邮件文件夹看看,说不定邮件被归类到那了。
- 务必开启SMTP服务的授权码(不是登录密码):Gmail需要开启两步验证后生成应用专用密码;QQ邮箱要先开启POP3/SMTP服务,再获取授权码。
确认Vercel环境变量配置
本地测试时可能直接硬编码了邮箱账号和密码,但部署到Vercel必须用环境变量,硬编码的信息不会生效。- 进入Vercel项目的
Settings -> Environment Variables,添加EMAIL_USER(发件人邮箱)、EMAIL_PASS(授权码)这两个变量。 - 确保Nodemailer配置里正确读取这些变量,示例代码:
const transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS } }); - 添加完变量后必须重新部署项目,否则新变量不会生效。
- 进入Vercel项目的
验证Nodemailer配置细节
不同邮箱服务商的SMTP端口和加密方式要求不同,配置错了会导致邮件发不出去。- 比如Gmail的正确配置:用465端口+SSL,或者587端口+TLS,示例:
const transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, // 465端口设为true,其他端口设为false auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS } }); - 发件人邮箱必须和
EMAIL_USER一致,部分服务商不允许使用不同的发件人地址。
- 比如Gmail的正确配置:用465端口+SSL,或者587端口+TLS,示例:
排查Vercel无服务器函数限制
Vercel的Serverless Functions最长执行时间是10秒,如果邮件发送过程超时,日志可能显示200,但实际发送没完成。- 查看函数的详细日志,确认
transporter.sendMail的回调里是否有隐藏错误,别只看HTTP状态码。 - 优化邮件发送逻辑,确保在10秒内完成;如果需要更长时间,考虑用异步任务队列(免费版Vercel可能不支持,可自行评估)。
- 查看函数的详细日志,确认
配置邮件验证记录(DKIM/SPF/DMARC)
缺少这些记录的邮件很容易被拒收或归为垃圾邮件。- 登录域名服务商后台,添加SPF记录:比如用Gmail+Vercel的话,可设为
v=spf1 include:_spf.google.com include:vercel.com ~all。 - 添加DKIM记录:从你的邮件服务商获取公钥,在域名解析里添加对应的TXT记录。
- 添加DMARC记录:设置邮件的处理规则,比如
v=DMARC1; p=none; sp=none; rua=mailto:dmarc@yourdomain.com。
- 登录域名服务商后台,添加SPF记录:比如用Gmail+Vercel的话,可设为
内容的提问来源于stack exchange,提问作者Nabeel
相关产品推荐
相关产品推荐

