【问题标题】:How to substitute Sendgrid template variables? (in node-js)如何替换 Sendgrid 模板变量? (在节点 js 中)
【发布时间】:2018-04-17 03:47:17
【问题描述】:

这似乎是我缺少的一个简单参数,但我无法弄清楚它到底是什么。

这是我使用“@sendgrid/mail”发送的请求:

email.js:

const sgMail = require('@sendgrid/mail');

function emailRequest() {
    msg = {
      to: 'test+10@gmail.com
      from: 'info@owner.io',
      subject: 'Receipt for Business Expenses',
      template_id: 'db6d11ae-41e4-4e1a-a71b-f5368eb21c9c',
      personalizations: [
        {
          to: 'test+10@gmail.com,
          from: 'info@ownr.io,
          subject: 'Receipt for Business Expenses,
          template_id: 'db6d11ae-41e4-4e1a-a71b-f5368eb21c9c',
          substitutions: {
            ':firstname': 'Bobba',
            ':ordernumber': 'WHAAA',
            ':orderdate': 'today',
            ':ordertime': 'NOW!',
          },
          custom_args: {
            ':firstname': 'Bobba',
            ':ordernumber': 'WHAAA',
            ':orderdate': 'today',
            ':ordertime': 'NOW!',
          },
        },
      ],
      sub: {
        ':firstname': 'Bobba',
        ':ordernumber': 'WHAAA',
        ':orderdate': 'today',
        ':ordertime': 'NOW!',
      },
      substitutions: {
        ':firstname': 'Bobba',
        ':ordernumber': 'WHAAA',
        ':orderdate': 'today',
        ':ordertime': 'NOW!',
      },
    };

  sgMail.setApiKey(process.env.SENDGRID_API_KEY);

  return sgMail
    .send(msg)
    .then(response => {
      return response;
    })
    .catch(err => {
      throw err;
    });
}

电子邮件已发送,但我仍然收到未替换的模板:

sendgrid-nodejs mail.js 的源代码似乎说只要有“替换”,它就会用这些替换初始化邮件类,但它不起作用:

https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/helpers/classes/mail.js

https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html

如何正确地将变量替换为模板?我是不是用错包了?

【问题讨论】:

  • 感谢发帖。近两周来,我一直试图从他们的支持中得到答案。他们的文档很糟糕,支持也好不到哪里去。感谢您的发帖,将在下面尝试您的答案!
  • 很高兴我能帮上忙。文档非常分散,但是在挖掘了有关这些替换包装器的 Github 问题后,我能够在其中找到一些小块:github.com/sendgrid/sendgrid-nodejs/blob/master/packages/mail/…

标签: javascript node.js email templates sendgrid


【解决方案1】:

无需指定替换包装器,因为它会假定您默认使用 Handlebars 模板。

const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
const msg = {
  to: 'recipient@example.org',
  from: 'sender@example.org',
  templateId: 'd-f43daeeaef504760851f727007e0b5d0',
  dynamicTemplateData: {
    subject: 'Testing Templates',
    name: 'Some One',
    city: 'Denver',
  },
};
sgMail.send(msg);

Check documentation to learn more

【讨论】:

    【解决方案2】:

    经过一番挖掘,我在他们 github 的问题部分找到了答案。我错过了'substitutionWrappers'。为了让它工作,我所要做的就是在消息中添加“substitutionWrappers”以及“substitutions”:

    const msg = {
        to: 'test@email.com'
        from: 'info@gmail.io',
        subject: 'Receipt for Business Expenses',
        template_id: 'da6db3ae-41e4-4e1a-a71b-f5368ab41c9c',
        substitutionWrappers: [':', ''],
        substitutions: {
          firstname: 'Bobba',
          ordernumber: 'WHAAA',
          orderdate: 'today',
          ordertime: 'NOW!',
        },
      };
    

    【讨论】:

    • 成功了!您解决了两周内 4 名 SendGrid 员工尚未为我解答的问题。我可以将我的赞成票提高 2 倍。一个跟进,当我在 Gmail 中收到它时,我的电子邮件不是以 HTML 形式出现的(尽管我使用的是 html 模板)。您是否能够收到 HTML 格式的电子邮件?
    • 希望我能在 HTML 方面提供帮助,但我们只是收到了模板,他们毫无疑问地工作了。虽然我不确定他们是怎么做的,但肯定是格式化和样式化的。
    • 不用担心,只是想通了。支持给我的示例在 sendmail 调用中有“文本”参数。删除它后,模板使用了预期的 HTML 版本。我猜发送“文本”替代方案会篡夺模板。我还刚刚注意到模板生成器有一个“文本版本”作为选项,所以我可以在那里编辑它。感谢您的快速回复!
    • 这是一个完整的例子:github.com/sendgrid/sendgrid-nodejs/blob/master/packages/mail/… 如果您对我们如何更好地记录这一点有任何想法,请告诉我,或者接受 swag 的 PR ;)
    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2012-09-28
    • 2019-06-20
    • 2022-12-01
    相关资源
    最近更新 更多