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

如何用Node.js Handlebars结合SendGrid Rest API发送自定义HTML邮件?遇403错误

问题描述

我用Node.js、Handlebars和Twilio SendGrid Rest API发送动态邮件,已创建自定义模板文件template.html,该模板通过Nodemailer+SMTP-transport可正常使用,但用SendGrid发送时出现403禁止错误:

ResponseError: Forbidden
at node_modules/@sendgrid/client/src/classes/client.js:146:29
at processTicksAndRejections (internal/process/task_queues.js:95:5) {
  code: 403,
  response: {
    headers: {
      server: 'nginx',
      date: 'Wed, 07 Sep 2022 17:03:16 GMT',
      'content-type': 'application/json',
      'content-length': '281',
      connection: 'close',
      'access-control-allow-origin': 'https://sendgrid.api-docs.io',
      'access-control-allow-methods': 'POST',
      'access-control-allow-headers': 'Authorization, Content-Type, On-behalf-of, x-sg-elas-acl',
      'access-control-max-age': '600',
      'x-no-cors-reason': 'https://sendgrid.com/docs/Classroom/Basics/API/cors.html',
      'strict-transport-security': 'max-age=600; includeSubDomains'
    },
    body: { errors: [Array] }
  }
}

我的Node.js代码如下:

const handlebars = require('handlebars');
const path = require('path');
const fs = require('fs');
const sendgrid = require('@sendgrid/mail')
sendgrid.setApiKey(sendgrid_api_key);

// 读取HTML文件
var readHTMLFile = function (path, callback) {
  fs.readFile(path, { encoding: 'utf-8' }, function (err, html) {
    if (err) {
      throw err;
      callback(err);
    } else {
      callback(null, html);
    }
  });
};

// 从客户端接收的动态变量
var name = 'John Doe';

// 发送邮件
readHTMLFile(path.join(__dirname, '/', 'template.html'), function (err, html) {
  var template = handlebars.compile(html);
  var replacements = {
    email_title: 'Welcome email',
    email_body: 'Welcome to our website ' + name
  };
  var htmlToSend = template(replacements);
  var mailOptions = {
    from: '"Company Website" <verified_sendgrid_email@company.com>', // 发件人地址
    to: email, // 收件人列表
    subject: "Welcome email ", // 邮件主题
    html: htmlToSend, // HTML内容
  };
  sendgrid.send(mailOptions, function (error, response) {
    if (error) {
      console.log(error);
    } else {
      console.log(response);
    }
  });
});
可能的原因与解决方案
  • API密钥权限不足:登录SendGrid后台,检查你的API密钥是否开启了Mail Send权限。创建密钥时必须勾选该权限,仅拥有只读或其他权限的密钥会触发403。
  • 发件地址未验证:确认from字段里的邮箱已在SendGrid完成验证,支持单发件人验证或域名验证。未验证的发件地址会被SendGrid拦截,返回403。
  • API密钥错误:检查sendgrid_api_key的值是否正确,有没有多余空格、拼写错误,或是误填了环境变量名。
  • 账户状态异常:如果是新注册的SendGrid账户,可能存在初始发送限制,或是账户被标记为可疑。登录SendGrid后台查看账户状态,是否有未处理的验证或警告。
  • 请求格式问题:from字段的格式可简化,把&quot;和&lt;换成普通引号和尖括号,比如from: "Company Website <verified_sendgrid_email@company.com>",避免转义字符导致的格式识别问题。
  • 查看详细错误信息:在错误回调里打印完整的错误详情,比如console.log(error.response.body.errors),SendGrid会返回具体的错误原因(如“发件人未验证”“权限不足”),能更快定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:40:17