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

使用@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模板的动态主题

  1. 登录SendGrid后台,找到对应的动态模板
  2. 进入模板的设置页面,在主题输入框中填写带变量的内容,例如:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:48:25