你好
在sendgrid nodejs npm软件包中,我遇到了一个问题。 我可以发送带有替换项和模板的电子邮件,但是问题出在客户端的电子邮件中,例如%name%,%company%等。替换项没有替换为该值。
程式码片段
const sgMail = require('@ sendgrid / mail');
sgMail.setApiKey(sendgrid_key);
var msg =
{
“个性化”:[{
“至”: [{
“ email”:“ [email protected] ”,
“名称”:“某些公司”
}],
“替代”:{
“%name%”:“约翰”,
“%company%”:“某些公司”,
“%business%”:“ Faster Pheny”
},
“ subject”:“某公司的发票!”
}],
“来自”:{
“ email”:“ CompanyA [email protected] ”,
“名称”:“ CompanyA”
},
“回复”: {
“ email”:“ [email protected] ”,
“名称”:“客户服务”
},
“ subject”:“某公司的发票!”,
“ template_id”:“ 93f052da-08d4-46f2-8f0c-f2a193bceea0”
};
邮件
.send(msg)
.then(()=> {
console.log('SendGrid ::成功发送电子邮件后的响应!')
})
.catch(错误=> {
console.error('Error SendGrid :::'+ error.toString());
});
代码将被执行并接收电子邮件,而不用替换%name%,%business%,%company%
现在我尝试使用sengrid网站https://sendgrid.com/docs/API_Reference/api_v3.html
它发送完美的电子邮件,没有任何问题,并且所有替换均正确完成。
我用来设置sgMail.send(msg)中的值的javascript npm代码有什么问题?
请求您的帮助。
似乎您缺少替代包装器。 我只是通过一个简单的模板使用了他们在此用例中使用的示例,它可以工作。
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
sgMail.setSubstitutionWrappers('{{', '}}'); // Configure the substitution tag wrappers globally
const msg = {
to: '[email protected]',
from: '[email protected]',
subject: 'Hello world',
text: 'Notification',
html: '<p></p>',
templateId: 'your-id-goes-here',
substitutions: {
name: 'John'
},
};
sgMail.send(msg);
我的模板仅包含以下代码片段:
<%body%> {{name}}
显然, <%body%>
部分是必需的。
也许您可以尝试将包装器设置为{{
, }}
东西(或%
,在您的情况下%
),也请注意该示例在替代对象中没有包含包装,而只是替代名称。
尝试这样的事情:
"substitutions": {
name: "John",
company: "Some Company",
business: "Faster Pheny"
},
太棒了有效。 万分感谢。 替代包装纸是丢失的。
感谢您的完整答案。 编码愉快!
@adamreisnz ,
也许我们应该默认调用sgMail.setSubstitutionWrappers('{{', '}}');
以避免将来出现此类问题。 你有什么感想?
@thinkingserious我们确实做到了; 参见https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/mail/src/classes/mail-service.js#L21
@adamreisnz ,
也许我们尝试检测一些常见的包装器,例如%或_?
那太好了。 当用户通过Sendgrid门户创建/设计模板时,门户默认情况下会插入替换%body%和%name%。 因此,用户自然会认为不更改%字符,并会继续使用模板,因为他不完全了解其功能。 如果Sendgrid可以建议将%更改为任何字符,或者该功能首选{{}},那么用户将使用它,或者加载默认设置的模板首先将%替换为{{。 这样可以避免我遇到的问题。
我不希望自动检测,除非它是一种非常强大的算法。 尝试使流程过于智能的麻烦在于,它可能导致潜在的难以调试的错误。 如果有人使用_
进行强调怎么办? 例如,确实强调。 这并不意味着_
符号是替代包装器。 与%
,您可以将其用于百分比,并且可能使算法误以为您将其用作替代包装,而您没有使用它。
由于Sendgrid正在转向使用{{
和}}
作为替换包装器的车把模板,因此我认为这是明智的默认设置。 这些字符在诸如把手之类的语言中用作替换包装的原因是有原因的,因为它们在普通语言中不是很常见。 下划线和百分比更常见,因此可能容易产生误解。
我认为这只是很好地记录下来以便清楚说明的问题。 可以选择指定自己的包装器,用户应该拥有使其工作所需的一切。
如果有人确实对鲁棒的自动检测有所了解,我很乐意看到一种伪算法,该算法可以很好地处理所有方案和所有可能的包装,同时避免误报。
有什么想法吗?
同意。 文档更新将是最好的选择。
@adamreisnz @vinvantest同意,请参阅https://github.com/sendgrid/sendgrid-nodejs/issues/681了解进度。
Sendgrid v3需要使用dynamic_template_data替换替换,如下所示:
const msg = {
to: email,
from: '[email protected]',
subject: 'Sample Email Subject',
templateId: 'your_template_id_here,
substitutionWrappers: ['{{', '}}'],
dynamic_template_data: {
"data_item": "value"
}
};
非常困惑,您必须使用dynamic_template_data
最好更新文档https://sendgrid.com/docs/API_Reference/api_v3.html
我尝试了以下@goelmk最新示例。 不为我工作:(
我的模板是使用您的WYSIWYG编辑器构建的,我尝试将{{verifyUrl}}放在文本组件和按钮组件的url链接中。 都不起作用。
@shawnkoh解决了吗? 我还使用视觉设计器创建了模板,但替换无效。
最有用的评论
Sendgrid v3需要使用dynamic_template_data替换替换,如下所示: