Oi,
No pacote npm sendgrid nodejs, encontrei um problema. Posso enviar e-mails com substituições e modelo, mas o problema está no e-mail do cliente final% name%,% company% etc. as substituições não são substituídas pelo valor.
Fragmento de código
const sgMail = require ('@ sendgrid / mail');
sgMail.setApiKey (sendgrid_key);
var msg =
{
"personalizações": [{
"para": [{
"email": " [email protected] ",
"name": "Alguma Empresa"
}],
"substituições": {
"% name%": "John",
"% company%": "Alguma empresa",
"% business%": "Faster Pheny"
},
"assunto": "Fatura para alguma empresa!"
}],
"a partir de": {
"email": "CompanyA [email protected] ",
"nome": "Empresa A"
},
"responder a": {
"email": " [email protected] ",
"nome": "Atendimento ao cliente"
},
"subject": "Invoice For Some Company!",
"template_id": "93f052da-08d4-46f2-8f0c-f2a193bceea0"
};
sgMail
.send (msg)
.então (() => {
console.log ('SendGrid :: Resposta após envio de email com sucesso!');
})
.catch (erro => {
console.error ('Erro SendGrid :::' + error.toString ());
});
O código é executado e recebe e-mail sem substituições para% name%,% business%,% company%
Agora tentei usar o site sengrid https://sendgrid.com/docs/API_Reference/api_v3.html
Envia e-mail perfeito sem problemas e todas as substituições são feitas corretamente.
O que há de errado no código javascript npm que estou usando para definir os valores em sgMail.send (msg)?
Peça sua ajuda.
Parece que você está perdendo os wrappers de substituição. Acabei de usar o exemplo que eles usaram neste caso de uso com um modelo simples e funciona.
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);
Meu modelo consiste apenas neste snippet de código:
<%body%> {{name}}
Aparentemente, a parte <%body%>
é obrigatória.
Talvez você possa tentar definir seus invólucros para algo como {{
, }}
ou outra coisa (ou %
, %
no seu caso), também, observe que o exemplo não inclui os invólucros no objeto de substituição, apenas o nome da substituição.
Experimente algo assim:
"substitutions": {
name: "John",
company: "Some Company",
business: "Faster Pheny"
},
Fantástico. Funcionou. Muito obrigado. Wrapper de substituição é o que estava faltando.
Obrigado pela resposta completa. Boa codificação!
@adamreisnz ,
Talvez devêssemos chamar sgMail.setSubstitutionWrappers('{{', '}}');
por padrão para evitar esse tipo de problema no futuro. O que você acha?
@thinkingserious Nós fazemos exatamente isso; consulte https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/mail/src/classes/mail-service.js#L21
@adamreisnz ,
Talvez tentemos detectar alguns wrappers comuns, como% ou _?
Isso vai ser incrível. Quando o usuário através do portal Sendgrid cria / projeta o modelo, o portal por padrão insere a substituição% body% e% name%. Então, naturalmente, o usuário pensará em não alterar o caractere% e continuará com o modelo, pois ele não está totalmente ciente da funcionalidade. Se Sendgrid pode sugerir que% pode ser alterado para qualquer caractere ou o recurso preferir {{}} então o usuário irá usá-lo ou o modelo que carrega as configurações padrão substituirá% por {{em primeiro lugar. Isso vai evitar o problema que enfrentei.
Não gosto muito de detecção automática, a menos que seja um algoritmo muito robusto. O problema de tentar tornar o processo muito inteligente é que isso pode levar a erros potencialmente difíceis de depurar. E se alguém usar _
para dar ênfase? Por exemplo, _realmente_ enfatizado. Isso não significa que o símbolo _
seja o invólucro de substituição. O mesmo com %
, você pode usá-lo para porcentagens e pode enganar o algoritmo fazendo-o pensar que você o está usando como um wrapper de substituição, onde não está.
Como Sendgrid está mudando para modelos de guidão, que usam {{
e }}
como wrappers de substituição, acho que esse é um padrão sensato de se ter. Há uma razão para esses caracteres serem usados como wrappers de substituição em linguagens como o guidão, porque eles não são muito comuns na linguagem normal. O sublinhado e a porcentagem são mais comuns e, portanto, potencialmente sujeitos a erros de interpretação.
Acho que é apenas uma questão de documentar bem isso para deixar claro. Com a opção de especificar seu próprio wrapper, o usuário deve ter tudo o que precisa para fazê-lo funcionar.
Se alguém tiver uma ideia para detecção automática robusta, adoraria ver um pseudo algoritmo que pode lidar bem com todos os cenários e todos os envoltórios possíveis, evitando falsos positivos.
Pensamentos?
Aceita. Atualizações de documentação serão a melhor opção.
@adamreisnz @vinvantest concordou, consulte https://github.com/sendgrid/sendgrid-nodejs/issues/681 para ver o progresso.
Sendgrid v3 requer a substituição de substituições por dynamic_template_data algo assim:
const msg = {
to: email,
from: '[email protected]',
subject: 'Sample Email Subject',
templateId: 'your_template_id_here,
substitutionWrappers: ['{{', '}}'],
dynamic_template_data: {
"data_item": "value"
}
};
Muito confuso que você tenha que usar dynamic_template_data
Seria bom atualizar a documentação https://sendgrid.com/docs/API_Reference/api_v3.html
Tentei seguir o exemplo mais recente de
Meu modelo foi construído usando seu editor WYSIWYG e tentei colocar {{verifyUrl}} em um componente de texto e um link de url do componente de botão. nem funciona.
@shawnkoh Você resolveu? Também criei o modelo com o designer visual e a substituição não está funcionando.
Comentários muito úteis
Sendgrid v3 requer a substituição de substituições por dynamic_template_data algo assim: