Sendgrid-nodejs: As substituições não funcionam

Criado em 10 abr. 2018  ·  43Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

Resumo do problema

Seguiu o exemplo de uso de substituições em emails transacionais , sem fazer nenhuma alteração. As tags de substituição são removidas, mas o texto não é inserido. Aqui está uma captura de tela do e-mail que recebo:

image

Passos para reproduzir

  1. Clone https://github.com/panayi/test-sg/
  2. Copie o corpo do modelo do exemplo e crie um modelo transacional na IU do SendGrid.
  3. Edite test.js para inserir sua chave API, seu endereço de e-mail e templateId você criou acima.
  4. Execute node test.js .

Detalhes técnicos:

unknown or a help wanted question

Comentários muito úteis

Olá, depois de ler o comentário de @himanshupnt , testei com um template legado e funcionou. Obrigado @himanshupnt .

Mais tarde eu encontrei a documentação do Sendgrid Mail Send com Dynamic Transactional Templates , eu meio que tenho o novo template (não o legado) funcionando. Usei o mesmo modelo HTML e meu código foi atualizado para:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Observe que substituí "substituições" por "dynamic_template_data" e coloquei "para" dentro de "personalizações" conforme exigido pelos documentos. E também tratei o assunto como um dos "dynamic_template_data" e funciona. (coloque {{assunto}} no campo de assunto do modelo)

Obrigado.

Todos 43 comentários

Olá @panayi ,

Algumas coisas para verificar:

  1. Verifique se o ID do modelo está correto
  2. Verifique se o modelo está marcado como ativo na IU

Você também pode compartilhar a aparência do seu HTML?

Obrigado!

Obrigado pela atenção,

Elmer

Olá, @thinkingserious , consegui reproduzir o mesmo problema mencionado por @panayi .
Meu código Html se parece com isto

Olá first_name (funcionário: employee_id)
Algum código HTML

Código

sgMail.setApiKey('apikey');
sgMail.setSubstitutionWrappers('{{', '}}'); // Triied sgMail.setSubstitutionWrappers('-', '-'); as well`

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: 'Hello HTML world!',
  templateId: 'template-id',
  substitutions: {
    first_name: 'Tejas',
    employee_id: 'emp123',
  },
};
sgMail.send(msg);

Nota: Eu até tentei usar substitutionWrappers: ['{{', '}}']
dentro de msg, mas sem sorte.

Detalhes técnicos:

Qualquer ajuda / correção apreciada, pois investi muito tempo neste problema

Olá @tjstlekr ,

Em seu código HTML, altere first_name para {{first_name}} e employee_id para {{employee_id}} .

Obrigado!

Obrigado pela atenção,

Elmer

Olá @thinkingserious ,
Por código HTML, você quer dizer o código do modelo?
Por que a tag de substituição funcionaria bem quando especificada no corpo da solicitação aqui , mas não ao usar os exemplos predefinidos na página ?
Obrigado!

Sim, @tjstlekr , quero dizer o código do modelo conforme descrito neste exemplo .

Não posso responder à sua segunda pergunta sem exemplos concretos. (por exemplo, corpo da solicitação e código do modelo).

Obrigado pela atenção,

Elmer

Infelizmente! Não tenho acesso ao código do modelo. Vou ficar com outra versão.
Obrigado de qualquer maneira @thinkingserious

Você tentou:

substitutions: {
    'first_name': 'Tejas',
    'employee_id': 'emp123',
  },

Sim, @thinkingserious tentou isso. Eu também tentei as seguintes maneiras


substitutions: {
    '-first_name-': 'Tejas',
    '-employee_id-': 'emp123',
  },

substitutions: {
    '%first_name%': 'Tejas',
    '%employee_id%': 'emp123',
  },

substitutions: {
    '=first_name=': 'Tejas',
    '=employee_id'=: 'emp123',
  },

@tjstlekr ,

Acho que sua solução é fazer com que quem pode alterar o código do modelo HTML envolva as variáveis ​​com um (s) caractere (s) de substituição.

Obrigado pela atenção,

Elmer

@thinkingserious está correto. As variáveis ​​do modelo DEVEM ser colocadas entre colchetes duplos {{nome}}. Caso contrário, o SendGrid não saberá onde descartar as substituições que você enviou.

as variáveis ​​realmente precisam de colchetes duplos? Vou tentar, mas um post diferente da mesma pessoa mostrou as substituições funcionando com travessões, não colchetes duplos:
screenshot 2018-06-26 14 08 12

Olá @tetreault ,

Por padrão, usamos colchetes duplos. setSubstitutionWrappers permite que você os modifique como você demonstrou.

Obrigado!

Obrigado pela atenção,

Elmer

Encontrei o mesmo problema que @panayi .

Eu segui o exemplo de modelos transacionais . Eu defini os invólucros de substituição e, no modelo, as substituições entre colchetes duplos. No entanto, o e-mail que recebi removeu todas as substituições sem substituir pelas que forneci.

Tentei com o editor de código e o editor de design para o modelo.

Detalhes técnicos:

Obrigado!

Olá @nrator ,

Se as substituições foram substituídas por strings em branco, eu verificaria novamente se as variáveis ​​nas quais você está iterando não estão vazias. Se você verificar que eles não estão vazios, poderia compartilhar o snippit de código junto com o HTML relevante para que eu possa tentar reproduzir?

Obrigado!

Obrigado pela atenção,

Elmer

Olá @thinkingserious

Não estou usando variáveis, mas string, portanto, não estão vazias. Abaixo estão o snippet de código, HTML e o resultado que obtive:

Código

const sgMail = require("@sendgrid/mail");
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

const msg = {
  from: "[email protected]", // my personal email
  to: "[email protected]", // my another personal email
  subject: "Hello world",
  text: "Hello plain world!",
  html: "<p>Hello HTML world!</p>",
  templateId: "d-27e7d954368c46519eddc806e5cf8156",
  substitutions: {
    name: "Some One",
    city: "Denver"
  }
};

  sgMail.send(msg).catch(err => console.error(err.message));

Template HTML

<html>
<head>
    <title></title>
</head>
<body>
Hello {{name}},
<br /><br/>
I'm glad you are trying out the template feature!
<br /><br/>
<%body%>
<br /><br/>
I hope you are having a great day in {{city}} :)
<br /><br/>
</body>
</html>

E-mail que recebi

Hello , 

I'm glad you are trying out the template feature! 

<%body%> 

I hope you are having a great day in :) 

Detalhes técnicos
Sendgrid-nodejs Versão: @ sendgrid / [email protected]
Versão Node.js: 8.11.2

Cumprimentos,
Jason

Olá, estou tendo o mesmo problema com modelos transacionais. As variáveis ​​não irão pegar. Usando dados de teste para visualizar o modelo no painel SG, tudo parece correto.
Os e-mails são enviados para a pessoa certa e com o modelo correto, exceto valores de variáveis ​​ausentes.
Eu criei um modelo legado há 2 dias que funcionou bem e hoje mudei para o mais novo
modelos transacionais e não funciona. Acabei de duplicar o antigo modelo legado que era
trabalhando bem.
"@ sendgrid / mail": "6.3.1" | Node.js 8.10
Aqui está o meu código:

async function sendEmail({ email, firstName, password }) {
  const msg = {
    to: [{ email, firstName }],
    from: {
      email: "[email protected]",
      name: "name"
    },
    asm: {
      group_id: 1234
    },
    templateId: "d-64b15a042b2d41d7a4b5b6a4eea649c5",
    substitutions: {
      userName: firstName,
      email,
      password
    }
  }
  try {
    await sgMail.send(msg);
  } catch(e){
    e.message
  }

  };

E aqui está o modelo html:

<h3>Hi {{userName}},</h3>

<div><span style="font-size:16px;">Your account has been setup. To login please use</span></div>

<div><span style="font-size:16px;">the credentials below.</span></div>

<div>&nbsp;</div>

<div><span style="font-size:16px;"><strong>Email:</strong>&nbsp;{{email}}</span></div>

<div><strong><span style="font-size:16px;">Password:&nbsp;</span></strong><span style="color: rgb(0, 0, 0); font-family: arial; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400;">{{password}}</span></div>

<div><span style="font-weight: 600; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-family: arial; font-size: 14px; color: rgb(0, 0, 0);"><span style="font-size: 16px;">SignIn Url: <a href="https://a.abc.com">https://a.abc.com/</a></span></span></div>

<div>&nbsp;</div>

<div>&nbsp;</div>

<div><span style="font-size:16px;">Please let us know if you need any help, email us at <a href="mailto:[email protected]">[email protected]</a></span></div>

Felicidades

Acabei de mudar para o modelo legado com o mesmo código html e funciona. Pode ser devido a novas mudanças na API V3?

Olá, depois de ler o comentário de @himanshupnt , testei com um template legado e funcionou. Obrigado @himanshupnt .

Mais tarde eu encontrei a documentação do Sendgrid Mail Send com Dynamic Transactional Templates , eu meio que tenho o novo template (não o legado) funcionando. Usei o mesmo modelo HTML e meu código foi atualizado para:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Observe que substituí "substituições" por "dynamic_template_data" e coloquei "para" dentro de "personalizações" conforme exigido pelos documentos. E também tratei o assunto como um dos "dynamic_template_data" e funciona. (coloque {{assunto}} no campo de assunto do modelo)

Obrigado.

@nrator Isso funcionou para mim também. Obrigado por postar!

Estou tendo o mesmo problema e também abri um problema (após experimentar as soluções mencionadas no início). No entanto, fui capaz de adicionar name e city ao modelo a seguir mencionado por @nrator . Mas não foi possível substituir <%subject%> e <%body%> porque eles estão incluídos no e-mail que recebo. Como posso substituir <%body%> e <%subject%> ? @himanshupnt como você resolveu isso?

Olá @ pankaja92 , não consegui fazer o <% subject%> funcionar também. Agora, minha maneira de lidar com o assunto é tratá-lo como um dos "dynamic_template_data", o que significa que eu envolvo em {{}} em vez de <%%> e o manuseio dentro de "dynamic_template_data".

Encontrei esta documentação do sendgrid que pode ajudar. O parâmetro assunto não parece funcionar, no entanto.

@nrator Obrigado. Funcionou. Portanto, não há necessidade de <% body%> também, certo (pois também não funcionará como o exemplo dado).

Aliás, não é o problema específico - mas, você tem alguma experiência ou exemplo para enviar uma lista de detalhes por meio desta biblioteca? Estou procurando algo que possa me ajudar a construir meu aplicativo :)

@ pankaja92 Não tenho certeza do que você quer dizer com o envio de uma lista de detalhes. Você pode ler esta postagem do blog sendgrid sobre os novos recursos dos modelos dinâmicos, basicamente, agora você pode iterar em listas de itens ou usar condicionais básicos para gerar conteúdos dinâmicos.

Para códigos reais, você pode consultar este repo .

Espero que ajude!

Olá a todos, também dediquei algumas horas a este assunto.

Em vez de usar substitutions , use dynamicTemplateData no objeto msg :

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

sgMail.setApiKey(process.env.SENDGRID_API_KEY)
sgMail.setSubstitutionWrappers('{{', '}}')

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  templateId: 'd-27e7d954368c46519eddc806e5cf8156',
  dynamicTemplateData: {
    name: 'Some One',
    city: 'Denver',
  },
}

sgMail.send(msg)

Referência: https://github.com/sendgrid/sendgrid-nodejs/pull/691

De acordo com aquele PR, quando o templateId é um modelo dinâmico (prefixado com d- ), o substitutions não é enviado, então o dynamicTemplateData objeto deve ser usado.

Eles criaram um problema aqui para melhorar o uso de modelos dinâmicos de adição aos documentos, mas até então espero que isso ajude. 🎉

Siga este problema: # 703

altere 'substituições' para 'dynamic_template_data'

@jseyfert não deveria ser dynamic_template_data ?

@aroach você está correto. Eu atualizei meu comentário.

No começo também não funcionou do meu lado.
Percebi que minha versão estava um pouco desatualizada (estava usando @ sendgrid / mail @ 6.2.1)
Eu atualizei o pacote, mudei meu código e agora está funcionando:

usando @ sendgrid / [email protected]

const result = await this.sgMail.send({
                personalizations: [{
                    to: this._to
                }],
                dynamicTemplateData: {
                    test: 'test' <== working (code in template: {{ test }})
                },
                templateId: this._templateId,
            });

Devo observar que o código abaixo não está funcionando:

const result = await this.sgMail.send({
                personalizations: [{
                    to: this._to,
                dynamicTemplateData: {
                    test: 'test' <== NOT working (code in template: {{ test }})
                }
                }],
                templateId: this._templateId,
            });

Sim, você precisa usar a v6.3.1 para suporte a dynamic_template_data.

Na terça-feira, 11 de dezembro de 2018 às 4:15 da manhã, Roy Milder [email protected] escreveu:

No começo também não funcionou do meu lado.
Notei que minha versão estava um pouco desatualizada (eu estava usando
@ sendgrid / mail @ 6.2.1)
Eu atualizei o pacote, mudei meu código e agora está funcionando:

usando @ sendgrid / [email protected]

const result = await this.sgMail.send ({
personalizações: [{
para: this._to
}],
dynamicTemplateData: {
test: 'test' <== working (code in template: {{test}})
},
templateId: this._templateId,
});

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/676#issuecomment-446166152 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ACL-sjFRFP8txUETNWFVLs0chW5yyL1Nks5u35OzgaJpZM4TOB5l
.

Oi nao esquece
não crie um modelo transacional, crie um modelo legado e faça uma cópia dele.
então, todas as etapas que você fizer funcionarão.

dynamicTemplateData

Funciona para mim. Tenho a versão mais recente da biblioteca SendGrid e a estou usando por meio do Firebase (funções). O principal problema agora é a falta de suporte TypeScript - e a documentação.

@roymilder , muito obrigado. Sua resposta fez o meu dia - as substituições de modelos dinâmicos não são muito claras.
Kudos!

Olá @OleksiiM ,

Este exemplo ajuda?

@ darren-dev,

Obrigado por ajudar! Com relação à falta de suporte e documentação do TypeScript, você está se referindo ao lado do Firebase?

@uups ,

Obrigado por ajudar!

Obrigado pela atenção,

Elmer

@pensar sério , sim. Obrigado.

@OleksiiM ,

Onde você olhou primeiro? Estou tentando descobrir como garantir que as pessoas que precisam usar modelos dinâmicos acessem o link que enviei primeiro.

@thinkingserious
Começou aqui .

Diz:
"Enviando Modelos Transacionais
Você pode enviar modelos transacionais usando uma das três maneiras:
Usando o SMTP Relay
Incluindo o ID do modelo no parâmetro de modelos do terminal de envio de email da API Web v3
Usando o parâmetro x-smtpapi no endpoint de envio de email da API Web v2 "

Então, pulei para "Incluindo o ID do modelo no parâmetro de modelos do terminal de envio de email da API Web v3 ".

Por que não estava claro:
A última página mostra a lista de possíveis "Parâmetros do corpo do pedido", que mostra o template_id, mas não diz nada sobre o campo "dynamic_template_data". Eu tentei ir com "personalizations" + "substituutions" + "template_id" e não funcionou.
Além disso, como sou um novo usuário do Sendgrid, não estava ciente dos modelos "antigos" e "novos" (dinâmicos) e da diferença entre eles (as páginas de documentos do sendgrid acima não dizem nada sobre isso).

Obrigado por perguntar e tornar os documentos melhores. Espero que outras pessoas evitem esse tipo de problema.

@thinkingserious se posso acrescentar:
Atualmente, estou usando estes documentos: https://sendgrid.com/docs/API_Reference/api_v3.html

As instruções sobre como enviar e-mail (https://sendgrid.api-docs.io/v3.0/mail-send) não mencionam dynamic_template_data em personalizações.

Portanto, isso também não está claro.

Espero que ajude!

@Whatthefoxsays ^^

Obrigado @OleksiiM & @roymilder! Agradecemos suas contribuições para a comunidade Twilio SendGrid :)

Olá a todos, também dediquei algumas horas a este assunto.

Em vez de usar substitutions , use dynamicTemplateData no objeto msg :

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

sgMail.setApiKey(process.env.SENDGRID_API_KEY)
sgMail.setSubstitutionWrappers('{{', '}}')

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  templateId: 'd-27e7d954368c46519eddc806e5cf8156',
  dynamicTemplateData: {
    name: 'Some One',
    city: 'Denver',
  },
}

sgMail.send(msg)

Referência: # 691

De acordo com aquele PR, quando o templateId é um modelo dinâmico (prefixado com d- ), o substitutions não é enviado, então o dynamicTemplateData objeto deve ser usado.

Eles criaram um problema aqui para melhorar o uso de modelos dinâmicos de adição aos documentos, mas até então espero que isso ajude. 🎉

Apressado desde 2 dias eu vi isso e fiz isso funcionar.

Olá @Travotics ,

Com que documentação você começou antes de encontrar a acima? Estou tentando melhorar essa experiência. Obrigado!

Obrigado pela atenção,

Elmer

@thinkingserious https://github.com/sendgrid/sendgrid-nodejs/blob/master/use-cases/kitchen-sink.md

Não tem dynamicTemplateData mas tem substitutionWrappers e substitutions .

Além de atualizar os documentos, também seria uma boa ideia atualizar a interface de tipo MailData (https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/helpers/classes/ mail.d.ts # L117). Para versões @ sendgrid / e-mail que não suportam o substitutions , eles devem esperar um V2MailData parâmetro que tem o substititons e substitutionWrappers campos omitido.

Olá, depois de ler o comentário de @himanshupnt , testei com um template legado e funcionou. Obrigado @himanshupnt .

Mais tarde eu encontrei a documentação do Sendgrid Mail Send com Dynamic Transactional Templates , eu meio que tenho o novo template (não o legado) funcionando. Usei o mesmo modelo HTML e meu código foi atualizado para:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Observe que substituí "substituições" por "dynamic_template_data" e coloquei "para" dentro de "personalizações" conforme exigido pelos documentos. E também tratei o assunto como um dos "dynamic_template_data" e funciona. (coloque {{assunto}} no campo de assunto do modelo)

Obrigado.

Muito obrigado por isso! Passei um tempo considerável depurando isso. : /

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

thidasapankaja picture thidasapankaja  ·  4Comentários

agostonbonomi picture agostonbonomi  ·  3Comentários

murphman300 picture murphman300  ·  4Comentários

Chrischuck picture Chrischuck  ·  3Comentários

nicoasp picture nicoasp  ·  3Comentários