Sendgrid-nodejs: 添加动态模板支持

创建于 2018-07-24  ·  30评论  ·  资料来源: sendgrid/sendgrid-nodejs

问题摘要

2018 年 7 月 24 日,我们的团队公开发布了交易模板的动态内容。 它现在可供所有通过我们的 Mail Send API v3 发送的客户使用。 由于对 Handlebars 语法子集的本机支持,迭代列表、处理条件等等!

更多信息可以在我们的博客文章公告中找到

您目前可以通过手动创建请求正文来使用此功能,如下所示

现在,我们需要为此 SDK 创建帮助程序代码(已完成)和示例。

验收标准

  • [[完成](https://github.com/sendgrid/sendgrid-nodejs/pull/691#issuecomment-407490342)] [实现一个类似于我们为遗留模板所拥有的帮助程序](https://github.com /sendgrid/sendgrid-nodejs/blob/master/packages/mail/USE_CASES.md#transactional-templates)
  • 更新USE_CASES.md示例以使用帮助程序演示新的动态模板并将当前示例重命名为Legacy

文档

medium docs update

最有用的评论

请更新您的文档 - 我只是花了一个小时试图弄清楚为什么替换不能与 v3 API 一起使用。

所有30条评论

请更新您的文档 - 我只是花了一个小时试图弄清楚为什么替换不能与 v3 API 一起使用。

对于@jharris-code 的糟糕体验,我深表歉意。

我已将您的投票添加到此问题以帮助它获得优先权。 我认为它很快就会更新,因为我们有 PR #711。

文档的缺失阻碍了实际代码的发布,这是非常愚蠢的。

@catamphetamine ,

该代码在v6.3.1中发布。 希望能帮到你,谢谢!

最诚挚的问候,

埃尔默

@thinkingserious哦,
我会试试的,谢谢。

用户注意:使用模板时传递dynamic_template_data而不是substitutions

现在您必须将“替换:”更改为“dynamic_template_data:”

并且模板使用把手不再需要指定“substitutionWrappers”

您的用例中的示例仍然使用替换而不是 dynamic_template_data。 请更新,在我找到这个线程之前,我确实花了几个小时来玩 SDK 和搜索。 (此外,您的api 文档没有提及任何关于此的内容,这也无济于事。
此外,substitutionWrappers 似乎根本不适用于 dynamic_template_data。 不管在我的消息对象中包含键值对substitutionWrappers: ['*|', '|*'] ,只填充了用大括号包裹的模板变量。(你们现在是不是故意强迫每个人都对模板使用把手语法?)

我很抱歉@josh-yonomi,

我已经根据您的反馈更新了文​​档。

对于我们的新模板,它们使用把手语法。 旧模板仍然像以前一样工作。

最诚挚的问候,

埃尔默

我收到电子邮件,但替换不起作用。 什么会导致问题?

const msg = {
    to: email,
    from: sendGridMail,
    templateId: emailTemplate.confirmationEmail,
    dynamic_template_data: {
      firstName: firstName,
      lastName: lastName,
      link: link
    }
  };

通过@thinkingserious编辑

你介意让我们知道问题出在哪里吗? 我们很想了解您的不满,以便我们改进。

@drav96

你介意分享你的模板是什么样的吗?

最诚挚的问候,

埃尔默

为什么要在替换包装器中去除特殊字符?

dynamic_template_data: {
      'foo-bar': 'wtf',
      'bar_baz': 'wtf',
      'baz.bro': 'wtf',
      'foo': 'wtf'
    }

只有{{foo}}在电子邮件中返回wtf字符串。

我不确定@larafale ,但这当然似乎不合理。 查看此 SDK 的源代码,我没有看到这些键在哪里被修改。

您介意为此问题创建一个单独的问题并包含您的 HTML 模板的外观吗? 我会将新问题标记为错误,并在必要时尝试重现和修复。

你好,

因此,我正在尝试发送动态模板电子邮件,但是,我无法使用替换或dynamic_template_data
我的模板有{{fullname}}{{date}}等标签,这些属性被发送到send函数:

const msg = {
        to,
        from,
        templateId: template.id,
        dynamic_template_data: substitutions,
    };

    return sgMail.send(msg)

我确认substitutions对象具有正确的属性和正确的值,但替换不起作用。

知道我做错了什么吗?

谢谢。

@gianfelipe93
结构是正确的。 我有同样的问题。
我的解决方案是从我的项目中卸载@sendgrid包并重新安装
请让我知道这对你有没有用
const msg= { to: email, from: sendGridMail, templateId: emailTemplate.requestDemoEmail, dynamic_template_data: { name: data.name, email: data.email, } };

@drav96谢谢伙计,现在可以使用了

在浪费了我一个小时的时间之后,添加我希望将成为一些权威文档的内容。 (首先,感谢在我之前浪费时间的所有人。)

  1. 如果您的模板 id 以d-开头,则substitutions将不起作用,您应该使用 CAMEL-CASE dynamicTemplateData (请参阅此处,他们将snake_case 键转换为camelCase )
  2. 如果您的模板以d-开头,则setSubstitutionWrappers被静默忽略,并且您必须在模板中使用{{}}

在浪费了我一个小时的时间之后,添加我希望将成为一些权威文档的内容。 (首先,感谢在我之前浪费时间的所有人。)

  1. 如果您的模板 id 以d-开头,则substitutions将不起作用,您应该使用 CAMEL-CASE dynamicTemplateData (请参阅此处,他们将snake_case 键转换为camelCase )
  2. 如果您的模板以d-开头,则setSubstitutionWrappers被静默忽略,并且您必须在模板中使用{{}}

在我的情况下,它适用于dynamic_template_data即使在模板 id 中有字母d-

是的,它确实适用于蛇盒钥匙,但似乎开发人员已在内部承诺使用骆驼盒(请参阅我在上面的报告中链接的行)。 因此,我建议所有新代码都使用驼峰式大小写。

你好@kael-shipman,

感谢您抽出宝贵时间提供帮助,我们非常感谢!

你有没有看到这个文档? 如果没有,您是否介意描述导致浪费时间的发现路径。 我希望这种情况不再发生,并为这次糟糕的经历深表歉意。

最诚挚的问候,

埃尔默

@thinkingserious ,感谢您的理解和改善情况的意愿。 很抱歉在那里得到了一些片段。 有一个looooooooooooooong 一天;)。

无论如何,问题不在于某个地方存在正确的(ish)文档,而是许多旧文档仍然存在于 Google 搜索中。 我搜索了“sendgrid 模板字段”(刚才),第一个非广告结果是this ,所有迹象表明这是官方文档,但显然已经过时了。 不仅如此,它还具有两种不同的替换格式( -firstName-%firstName% ),并且只说“您使用的内容可能取决于您使用的 SDK 库”,考虑到这一点,这似乎真的不合适所有 SDK 库都可能指向同一个寺庙(只有一种样式的替换标签)。

根据我使用 sendgrid 的经验,虽然我非常欣赏已经构建的内容,但这种文档混乱实际上是规则,而不是例外。 我知道它可能和软件世界的其他部分一样快速发展,但最好花一个月左右的时间来规范化所有文档,在上面放上版本号等等,也许可以做点什么谷歌热门搜索。

无论如何,再次感谢!

此外,您链接的文档仍然在蛇的情况下显示dynamic_template_data ,如果这是正确的,那么我不确定为什么代码本身似乎将其转换为驼峰式。 如上所述,我承认蛇案例有效,但鉴于代码,文档似乎不建议使用它。

你好@kael-shipman,

感谢您抽出宝贵时间提供详细的反馈!

关于您提供的链接,该文档参考了我们的 SendGrid SMTP API,而不是此 SDK 支持的 SendGrid v3 REST API。 也就是说,您不应期望知道这一点。 我会将这个问题提请我们的文档团队注意,看看是否有办法将其弄清楚。

我们最近刚刚更新并重新发布了我们的开源文档。 我希望你能更轻松地导航。

我将修复 README 以使用驼峰命名以保持一致性。 感谢您发现并引起我们的注意!

再次感谢并感谢您提供详细的反馈,我们想为您提供一些赃物。 享受!

最诚挚的问候,

埃尔默

嘿酷,谢谢:D

2018 年 9 月 18 日,星期二,下午 6:09,Elmer Thomas通知@github.com
写道:

你好 @kael-shipman https://github.com/kael-shipman

感谢您抽出宝贵时间提供详细的反馈!

关于您提供的链接,该文档是参考
到我们的 SendGrid SMTP API,而不是这个 SDK 的 SendGrid v3 REST API
支持。 也就是说,您不应期望知道这一点。 我会带
提请我们的文档团队注意这个问题,看看是否有
方法说清楚。

我们最近更新并重新发布了我们的开源文档
https://sendgrid.com/blog/how-to-get-the-most-from-sendgrids-new-knowledge-center/
我希望你能更轻松地导航。

我将修复 README 以使用驼峰命名以保持一致性。 感谢
抓住它并引起我们的注意!

再次感谢并感谢您提供详细的
反馈,我们想为您提供一些赃物
https://dx.sendgrid.com/swag 。 享受!

最诚挚的问候,

埃尔默


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/sendgrid/sendgrid-nodejs/issues/703#issuecomment-422588492
或静音线程
https://github.com/notifications/unsubscribe-auth/ADUIglZIH2d7imy-H7dekTo5A-v2Xau8ks5ucX0agaJpZM4Vev8b
.

我可以让dynamic_template_data用于一般电子邮件变量,但是如果我们还需要为每个收件人添加动态数据怎么办? 例如订单号、订单数量等。我在文档中没有看到这方面的用例,但也许我忽略了它。

用户注意:使用模板时传递dynamic_template_data而不是substitutions

@catamphetamine不幸的是,我对你的评论dynamicTemplateData ,但在我的情况下,替换被简单地删除了。 我只是希望其他人有更好的体验。

我的版本:
"@sendgrid/mail": "^6.3.1"

事实证明,对我来说,我必须执行以下操作(与人们所说的相反):

// This seems to be the default, however, to avoid unexpected API changes,
// I'd rather set this manually
setSubstitutionWrappers("{{", "}}");

{
      subject: EMAIL_SUBJECT_ONBOARDING,
      templateId: "templateId",
      personalizations: [{
        to,
        // NOT WORKING WITH THIS ❌
        // dynamicTemplateData: {
        //   senderName: EMAIL_FROM_NAME,
        //   senderAddress: "an actual adress",
        // },

        // WORKS WITH THIS ✅
        substitutions: {
            senderName: EMAIL_FROM_NAME,
            senderAddress: "an actual adress",
        },
    }],
}

@thinkingserious喜欢这个工具。 请继续改进文档,覆盖边缘情况等。🎉❤️


更新:

感谢@catamphetamine 投反对票。 这让我想到substitutions有效,因为我做了setSubstitutionWrappers("{{", "}}"); 。 唉,没有。 我不知道发生了什么我可能累了,但是dynamicTemplateData确实有效。 请注意,这是camelCase _(请参阅@kael-shipman 评论)_ 我看到了大多数蛇形案例。 另外,我正在使用 TS 类型的 sendgrid。 定义中没有可用的 snake_case 键。


更新 2:

关于可用的类型。 我在PersonalizationJSON类型中找到了dynamic_template_data 。 如果您使用以下内容:
import { send } from "@sendgrid/mail";
然后在检查发送的第一个参数后,您将看到MailData具有以下定义:

export interface MailData {
  // ...
  personalizations?: PersonalizationData[],
  // ...
}

然后我偶然发现了以下两种类型:

export interface PersonalizationData {
  // omitted keys...
  dynamicTemplateData?: { [key: string]: string; };
  customArgs?: { [key: string]: string };
  sendAt?: number;
}

export interface PersonalizationJSON {
  // same omitted keys...
  dynamic_template_data?: { [key: string]: string; };
  custom_args?: { [key: string]: string; };
  send_at?: number;
}

最后,我让dynamic_template_data像这样始终如一地工作:

{
    templateId: "d-templateId",
    dynamic_template_data: { name: "elton yet again"}, // <-- either here
    personalizations: [{
        to,
        dynamic_template_data: { name: "Elton again" }, // <-- or here
    }],
}

@thinkingserious显然,存在需要修复的类型定义问题。 稍后我可能会创建一个 PR。

好的,我需要再次调查。 我很震惊,因为现在dynamicTemplateDatasubstitutions都不适合我。

更新:
翻转了一些表格,但让它工作并更新了我之前的评论。

最后,我让dynamic_template_data像这样始终如一地工作:

{
    templateId: "d-templateId",
    dynamic_template_data: { name: "elton yet again"}, // <-- either here
    personalizations: [{
        to,
        dynamic_template_data: { name: "Elton again" }, // <-- or here
    }],
}

这对我来说很重要。 我试图在交易模板中设置与 to vs cc 电子邮件不同的主题。 当我按照上面的方法将 dynamic_template_data 属性放入个性化数组时,它就起作用了。

    const msg = {


         personalizations: [
            {
              to: req.body.to,
              dynamic_template_data : {
                subject: "Just to adsf...",
                full_name_from: req.body.full_name_from,
                full_name_to: req.body.full_name_to,
                manager: req.body.manager,
                message: req.body.message,
                badge: req.body.badge,
                badge_image: 'https://asdf' + req.body.badge_image
             }
            },
            {
              to: req.body.manager,
              dynamic_template_data : {
                subject: req.body.full_name_from + ' received a asdf asdf',
                full_name_from: req.body.full_name_from,
                full_name_to: req.body.full_name_to,
                manager: req.body.manager,
                message: req.body.message,
                badge: req.body.badge,
                badge_image: 'https://asdf' + req.body.badge_image
             }
            }
          ]
    };

对我有用的解决方案是以如下所示的确切方式将 dynamic_template_data 放在个性化对象中:

    "personalizations": [
        {
              "dynamic_template_data": {
            "fullname": "full Name",
            "useremail": ":[email protected]",
            "userphone": "56456",
            "usermsg": "tex fdsfgasdf t"
    },
            "to": [
                {
                    "email": "[email protected]"
                }
            ],
            "cc": [
                {
                    "email": "[email protected]"
                }
            ]
        }
]
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Loriot-n picture Loriot-n  ·  4评论

nicoasp picture nicoasp  ·  3评论

thinkingserious picture thinkingserious  ·  4评论

TobiahRex picture TobiahRex  ·  3评论

umarhussain15 picture umarhussain15  ·  3评论