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

部署在Vercel上的Node.js应用使用SendGrid Email API无法投递邮件的问题求助

解决Vercel部署后SendGrid邮件返回200但无法投递的问题

我来帮你排查这个问题,这种本地正常、部署后发不出邮件但API返回200的情况在Vercel的Serverless环境里挺常见的,咱们一步步拆解问题:

1. 异步代码处理不规范导致进程提前终止

你提供的两段代码都存在异步处理的问题:

  • 第一段代码里,sgMail.send()返回的Promise没有被等待,在Vercel的Serverless函数中,函数执行完后进程会立即销毁,导致SendGrid的请求还没完成就被中断——本地环境进程不会马上结束,所以能正常发送,但部署后不行。
  • 第二段代码混用了await和.then(),写法冗余且容易导致逻辑混乱,同样可能出现进程提前退出的情况。

修正后的异步代码:

const sgMail = require("@sendgrid/mail");
sgMail.setApiKey(process.env.SENDGRID_API_KEY);

const sendMail = async (mail) => {
  try {
    // 等待SendGrid API请求完成
    await sgMail.send(mail);
    console.log("邮件请求已成功提交至SendGrid");
  } catch (error) {
    console.error("邮件发送失败:", error);
    if (error.response) {
      console.error("SendGrid响应详情:", error.response.body);
    }
    // 抛出错误让Vercel捕获,避免静默失败
    throw error;
  }
};

这样修改后,能确保Vercel的Serverless函数等待SendGrid的API请求完全完成后再结束进程,避免中途中断。

2. 确认Vercel环境变量配置正确

虽然你提到已经配置了验证过的域名,但一定要检查Vercel上的SENDGRID_API_KEY环境变量:

  • 进入Vercel项目的 Settings → Environment Variables
  • 确认生产环境(Production)的变量值正确,没有拼写错误(API Key是一串长字符,很容易输错)
  • 修改环境变量后必须重新部署项目,否则新的变量不会生效

3. 查看SendGrid的投递日志定位具体原因

SendGrid返回200状态码只代表它成功接收了你的请求,不代表邮件一定能投递到收件人邮箱。你需要登录SendGrid后台查看Mail → Activity日志:

  • 找到对应邮件的状态(比如Bounced、Blocked、Delivered)
  • 如果是Bounced,可能是收件人邮箱不存在或被标记为无效;如果是Blocked,可能是你的域名DKIM/SPF配置有问题(即使你验证了域名,也要确认发件人邮箱属于该验证域名)

4. 调整Vercel函数超时时间

Vercel的Serverless Functions默认超时时间是10秒,如果SendGrid的API请求加上你的业务逻辑执行时间接近这个阈值,可能会被强制中断。你可以在项目根目录创建vercel.json文件,延长超时时间(最大支持90秒):

{
  "functions": {
    "api/*.js": {
      "maxDuration": 30
    }
  }
}

按照上面的步骤排查,应该能解决你的问题。

内容的提问来源于stack exchange,提问作者Omega Uwedia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:57:52