部署至Vercel后Nodemailer无法发送Gmail邮件求助
问题:Vercel部署后Nodemailer无法通过Gmail发送邮件
问题详情
网页表单使用Nodemailer发送邮件至Gmail账号,开发环境下完全正常,但部署到Vercel后无法收到邮件。Vercel函数日志报错如下:
Error: Greeting never received at SMTPConnection._formatError (/var/task/node_modules/nodemailer/lib/smtp-connection/index.js:790:19) at SMTPConnection._onError (/var/task/node_modules/nodemailer/lib/smtp-connection/index.js:776:20) at Timeout.<anonymous> (/var/task/node_modules/nodemailer/lib/smtp-connection/index.js:710:22) at listOnTimeout (node:internal/timers:564:17) at processTimers (node:internal/timers:507:7) { code: 'ETIMEDOUT', command: 'CONN' }
当前Transporter配置:
const transporter = NodeMailer.createTransport({ service: 'gmail', secure: true, auth: { user: 'fifthtribe05@gmail.com', pass: <secretPass> } });
发送邮件代码:
const mailOptions = { from: email, to: 'email@gmail.com', subject: 'Subject', text: `${message} from ${email}` }; const sendMessage = async(mailOptions:any)=> { await transporter.sendMail(mailOptions, function(error: any, info: { response: string; }{ console.log("sending"); console.log(error); if (error) { console.log(error); } else { console.log('Email sent: ' + info.response); } })}; await sendMessage(mailOptions);
已尝试的方案:
- 添加async/await处理异步逻辑
- 设置
secure: true - 确认开发环境正常,排除代码基础逻辑问题
解决方法
1. 调整Gmail账号安全设置
Gmail默认会拦截非信任设备的登录请求,需做以下操作:
- 若开启了两步验证,创建应用专用密码(仅两步验证用户可创建,安全性更高),替代原密码用于Nodemailer配置。
- 注意:Gmail已移除“允许不太安全的应用访问”选项,请勿尝试寻找该设置。
2. 优化Nodemailer Transporter配置
显式指定SMTP主机、端口并增加超时配置,适配Vercel网络环境:
const transporter = NodeMailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, auth: { user: 'fifthtribe05@gmail.com', pass: '你的应用专用密码' }, connectionTimeout: 10000, // 连接超时时间,单位毫秒 greetingTimeout: 10000 // 等待问候超时时间 });
3. 修正发送邮件的代码逻辑
当前代码混用了async/await与回调函数,导致异步逻辑混乱,改用纯async/await写法:
const sendMessage = async (mailOptions) => { try { const info = await transporter.sendMail(mailOptions); console.log('Email sent: ' + info.response); return info; } catch (error) { console.error('邮件发送失败:', error); throw error; } }; await sendMessage(mailOptions);
4. 使用Vercel环境变量存储敏感信息
避免硬编码密码,在Vercel项目的「Settings -> Environment Variables」中添加GMAIL_USER和GMAIL_PASS变量,代码中通过环境变量引用:
auth: { user: process.env.GMAIL_USER, pass: process.env.GMAIL_PASS }
替代方案
若Gmail的安全限制仍无法解决问题,可改用以下邮件服务:
- SendGrid:免费额度满足个人项目需求,配置简单,与Vercel兼容性好
- Mailgun:提供免费试用额度,SMTP配置稳定可靠
- Resend:面向开发者的邮件服务,集成便捷,适合表单通知类场景
内容的提问来源于stack exchange,提问作者Joshysmart
相关产品推荐
相关产品推荐

