如何用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字段的格式可简化,把"和<换成普通引号和尖括号,比如from: "Company Website <verified_sendgrid_email@company.com>",避免转义字符导致的格式识别问题。 - 查看详细错误信息:在错误回调里打印完整的错误详情,比如
console.log(error.response.body.errors),SendGrid会返回具体的错误原因(如“发件人未验证”“权限不足”),能更快定位问题。
内容的提问来源于stack exchange,提问作者Grogu
相关产品推荐
相关产品推荐

