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

部署至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:40:29