使用@sendgrid/mail+Express后端发送邮件时主题不显示问题
问题:SendGrid动态模板邮件主题不显示,无法动态插入订单确认号
在Express后端使用@sendgrid/mail库发送用户下单确认邮件时,无论设置静态还是动态主题,邮件都不显示主题。代码结构符合官方文档要求,希望主题能动态包含订单确认号,例如Order Confirmation #${confirmationNumber}。
相关代码:
await sgMail.send({ to: result.contactEmail.trim(), from: "no-reply@mailinator.com", subject: "Order Confirmation", templateId: sendgrid_template_id, dynamicTemplateData: { ...result, }, });
补充信息:
- dynamicTemplateData已正确传入其他邮件数据,result对象和模板中无覆盖主题的
subject字段 - 未使用personalizations配置
环境详情:
- Node.js版本:16.20.2
- Express版本:~4.17.1
- @sendgrid/mail版本:7.7.0
已参考StackOverflow上类似问题,但未找到完全匹配的解决方案。
解决方案
原因分析
使用SendGrid动态模板时,模板后台设置的主题优先级高于代码中传入的subject字段。如果模板未设置主题或主题为空,即使代码里指定了subject,邮件也不会显示主题。
步骤1:配置SendGrid模板的动态主题
- 登录SendGrid后台,找到对应的动态模板
- 进入模板的设置页面,在主题输入框中填写带变量的内容,例如:
这里的Order Confirmation #{{confirmationNumber}}confirmationNumber要和你代码中dynamicTemplateData里的字段名完全一致(大小写敏感)
步骤2:修改代码传入动态数据
确保dynamicTemplateData中包含confirmationNumber字段,示例代码:
await sgMail.send({ to: result.contactEmail.trim(), from: "no-reply@mailinator.com", templateId: sendgrid_template_id, dynamicTemplateData: { ...result, confirmationNumber: result.orderConfirmationNumber // 替换为实际的确认号取值逻辑 }, });
注:此时可以删除代码中的
subject字段,因为模板主题会优先生效;若保留,代码中的subject会被模板主题覆盖。
额外排查点
- 确认模板主题中的变量名和代码里
dynamicTemplateData的字段名完全一致(大小写、拼写都不能错) - 查看SendGrid邮件日志,检查发送请求的
personalizations节点是否正确携带了主题变量 - 你的
@sendgrid/mail版本(7.7.0)完全支持动态模板主题变量,版本无问题
内容的提问来源于stack exchange,提问作者Lilit Mazmanyan
相关产品推荐
相关产品推荐

