Sendgrid-nodejs: Les substitutions ne fonctionnent pas

Créé le 10 avr. 2018  ·  43Commentaires  ·  Source: sendgrid/sendgrid-nodejs

Résumé de la question

Suivez l' exemple d'utilisation de substitutions dans les e -

image

Étapes à suivre pour reproduire

  1. Cloner https://github.com/panayi/test-sg/
  2. Copiez le corps du modèle de l'exemple et créez un modèle transactionnel sur l'interface utilisateur SendGrid.
  3. Modifiez test.js pour insérer votre clé API, votre adresse e-mail et templateId vous avez créés ci-dessus.
  4. Exécutez node test.js .

Détails techniques:

unknown or a help wanted question

Commentaire le plus utile

Bonjour, après avoir lu le commentaire de @himanshupnt , j'ai testé avec un ancien modèle et cela a fonctionné. Merci @himanshupnt .

Plus tard, j'ai trouvé la documentation Sendgrid Mail Send avec des modèles transactionnels dynamiques , j'ai en quelque sorte le nouveau modèle (pas hérité) qui fonctionne. J'ai utilisé le même modèle HTML et mon code a été mis à jour pour:

  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));

Notez que j'ai remplacé "substitutions" par "dynamic_template_data", et placé "à" à l'intérieur de "personnalisations" comme requis par la documentation. Et j'ai également traité le sujet comme l'un des "dynamic_template_data" et cela fonctionne. (mettre {{subject}} dans le champ d'objet du modèle)

Merci.

Tous les 43 commentaires

Bonjour @panayi ,

Quelques points à vérifier:

  1. Vérifiez que l'ID du modèle est correct
  2. Vérifiez que le modèle est marqué comme actif dans l'interface utilisateur

Pouvez-vous également partager à quoi ressemble votre HTML?

Merci!

Meilleures salutations,

Elmer

Bonjour, @thinkingserious , j'ai pu reproduire le même problème que @panayi mentionné.
Mon code Html ressemble à ceci

Bonjour first_name (Employee: employee_id)
Du code HTML

Code

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);

Remarque: j'ai même essayé d'utiliser substitutionWrappers: ['{{', '}}']
dans msg mais sans chance.

Détails techniques:

Toute aide / correction appréciée car j'ai investi beaucoup de temps dans ce problème

Bonjour @tjstlekr ,

Dans votre code HTML, veuillez changer first_name en {{first_name}} et employee_id en {{employee_id}} .

Merci!

Meilleures salutations,

Elmer

Bonjour @thinkingserious ,
Par code HTML, voulez-vous dire le code du modèle?
Pourquoi la balise de substitution fonctionnerait-elle correctement lorsqu'elle est spécifiée dans le corps de la requête ici , mais pas lors de l'utilisation des exemples prédéfinis sur la page ?
Merci!

Oui @tjstlekr , je veux dire le code du modèle tel que décrit dans cet exemple .

Je ne peux pas répondre à votre deuxième question sans exemples concrets. (par exemple, le corps de la demande et le code du modèle).

Meilleures salutations,

Elmer

Tristement! Je n'ai pas accès au code du modèle. Je m'en tiendrai à une autre version.
Merci quand même @thinkingserious

As-tu essayé:

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

Oui, @thinkingserious a essayé cela. J'ai également essayé les méthodes suivantes


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

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

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

@tjstlekr ,

Je pense que votre solution consiste à amener quiconque peut changer le code du modèle HTML à envelopper les variables avec un ou plusieurs caractères de substitution.

Meilleures salutations,

Elmer

@thinkingserious est correct. Les variables du modèle DOIVENT être entourées de doubles crochets {{name}}. Sinon, SendGrid ne saura pas où déposer les substitutions que vous avez envoyées.

les variables ont vraiment besoin de doubles crochets? Je vais essayer, mais un article différent de la même personne a montré que les substitutions fonctionnaient avec des tirets, pas des doubles crochets:
screenshot 2018-06-26 14 08 12

Bonjour @tetreault ,

Par défaut, nous utilisons des crochets doubles. setSubstitutionWrappers vous permet de les modifier comme vous l'avez démontré.

Merci!

Meilleures salutations,

Elmer

J'ai rencontré le même problème que @panayi .

J'ai suivi l' exemple de modèles transactionnels . J'ai défini des wrappers de substitution et dans le modèle, des substitutions enveloppées entre crochets doubles. Cependant, l'e-mail que j'ai reçu avait supprimé toutes les substitutions sans les remplacer par celles que j'avais fournies.

J'ai essayé avec l'éditeur de code et l'éditeur de conception pour le modèle.

Détails techniques:

Merci!

Salut @nrator ,

Si les substitutions étaient remplacées par des chaînes vides, je vérifierais à nouveau que les variables sur lesquelles vous effectuez une itération ne sont pas vides. Si vous vérifiez qu'ils ne sont pas vides, pourriez-vous partager l'extrait de code avec le code HTML correspondant afin que je puisse essayer de le reproduire?

Merci!

Meilleures salutations,

Elmer

Salut @thinkingserious

Je n'utilise pas de variables mais de chaînes afin qu'elles ne soient pas vides. Vous trouverez ci-dessous l'extrait de code, le HTML et le résultat que j'ai obtenu:

Code

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));

Modèle 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 j'ai reçu

Hello , 

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

<%body%> 

I hope you are having a great day in :) 

Détails techniques
Version de sendgrid-nodejs: @ sendgrid / [email protected]
Version Node.js: 8.11.2

Meilleures salutations,
Jason

Salut, j'ai le même problème avec les modèles transactionnels. Les variables ne seront pas captées. En utilisant les données de test pour prévisualiser le modèle dans le tableau de bord SG, tout semble correct.
Les e-mails sont envoyés à la bonne personne et avec le bon modèle, sauf s'il manque des valeurs de variable.
J'ai créé un modèle hérité il y a 2 jours qui fonctionnait bien et aujourd'hui je suis passé à un modèle plus récent
modèles transactionnels et cela ne fonctionne pas. Je viens de dupliquer l'ancien modèle qui était
fonctionne bien.
"@ sendgrid / mail": "6.3.1" | Node.js 8.10
Voici mon code:

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
  }

  };

Et voici le modèle 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>

À votre santé

Je viens de passer au modèle hérité avec le même code html et cela fonctionne. Cela peut-il être dû à de nouveaux changements dans l'API V3?

Bonjour, après avoir lu le commentaire de @himanshupnt , j'ai testé avec un ancien modèle et cela a fonctionné. Merci @himanshupnt .

Plus tard, j'ai trouvé la documentation Sendgrid Mail Send avec des modèles transactionnels dynamiques , j'ai en quelque sorte le nouveau modèle (pas hérité) qui fonctionne. J'ai utilisé le même modèle HTML et mon code a été mis à jour pour:

  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));

Notez que j'ai remplacé "substitutions" par "dynamic_template_data", et placé "à" à l'intérieur de "personnalisations" comme requis par la documentation. Et j'ai également traité le sujet comme l'un des "dynamic_template_data" et cela fonctionne. (mettre {{subject}} dans le champ d'objet du modèle)

Merci.

@nrator Cela l'a fait pour moi aussi. Merci de l'avoir posté!

J'ai le même problème et j'ai également ouvert un problème (après avoir essayé les solutions mentionnées au début). Cependant, j'ai pu ajouter name et city au modèle ci-dessous mentionné par @nrator . Mais n'a pas pu remplacer <%subject%> et <%body%> car ils sont inclus dans l'e-mail que je reçois. Comment puis-je remplacer <%body%> et <%subject%> ? @himanshupnt comment avez-vous résolu cela?

Salut @ pankaja92 , je n'ai pas pu faire fonctionner <% subject%> aussi. Maintenant, ma façon de traiter le sujet est de le traiter comme l'un des "dynamic_template_data", ce qui signifie que je l'enveloppe dans {{}} au lieu de <%%> et je le gère dans "dynamic_template_data".

J'ai trouvé cette documentation sendgrid qui peut vous aider. Le paramètre de sujet ne semble pas fonctionner cependant.

@nrator Merci. Ça a marché. Donc, il n'y a pas besoin de <% body%> aussi bien (car cela ne fonctionnera pas non plus comme l'exemple donné).

Btw, pas le problème spécifique - mais, avez-vous une expérience ou un exemple pour envoyer une liste de détails via cette bibliothèque? Je recherche quelque chose qui pourrait m'aider à créer mon application :)

@ pankaja92 Je ne suis pas sûr de ce que vous entendez par l'envoi d'une liste de détails. Vous pouvez lire ce billet de blog sendgrid sur les nouvelles fonctionnalités des modèles dynamiques, en gros, vous pouvez maintenant parcourir des listes d'éléments ou utiliser des conditions de base pour générer du contenu dynamique.

Pour les codes réels, vous pouvez vous référer à ce repo .

J'espère que ça aide!

Salut à tous, j'ai également passé quelques heures sur cette question.

Au lieu d'utiliser substitutions , utilisez plutôt dynamicTemplateData dans l'objet principal 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)

Référence: https://github.com/sendgrid/sendgrid-nodejs/pull/691

Selon ce PR, lorsque le templateId est un modèle dynamique (préfixé par d- ), le substitutions n'est pas du tout envoyé, donc le dynamicTemplateData l'objet doit être utilisé.

Ils ont créé un problème ici pour améliorer l'utilisation des modèles d'ajout dynamiques dans les documents, mais d'ici là, j'espère que cela aide. 🎉

Veuillez suivre ce numéro: # 703

remplacez 'substitutions' par 'dynamic_template_data'

@jseyfert ne devrait-il pas être dynamic_template_data ?

@aroach vous avez raison. J'ai mis à jour mon commentaire.

Au début, cela ne fonctionnait pas non plus de mon côté.
J'ai remarqué que ma version était un peu obsolète (j'utilisais @ sendgrid / mail @ 6.2.1)
J'ai mis à jour le package, j'ai changé mon code et maintenant cela fonctionne:

en utilisant @ sendgrid / [email protected]

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

Je dois noter que le code ci-dessous ne fonctionne pas:

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

Oui, vous devez utiliser la v6.3.1 pour la prise en charge de dynamic_template_data.

Le mar 11 décembre 2018 à 4 h 15, Roy Milder [email protected] a écrit:

Au début, cela ne fonctionnait pas non plus de mon côté.
J'ai remarqué que ma version était un peu obsolète (j'utilisais
@ sendgrid / mail @ 6.2.1)
J'ai mis à jour le package, j'ai changé mon code et maintenant cela fonctionne:

en utilisant @ sendgrid / [email protected]

const result = attendre this.sgMail.send ({
personnalisations: [{
à: this._to
}],
dynamicTemplateData: {
test: 'test' <== working (code dans le modèle: {{test}})
},
templateId: this._templateId,
});

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/676#issuecomment-446166152 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ACL-sjFRFP8txUETNWFVLs0chW5yyL1Nks5u35OzgaJpZM4TOB5l
.

Salut, n'oublie pas
ne pas créer de modèle transactionnel, créer un modèle hérité et en faire une copie.
puis toutes les étapes que vous faites fonctionnera.

dynamicTemplateData

Travaille pour moi. J'ai la dernière version de la bibliothèque SendGrid et je l'utilise via Firebase (Fonctions). Le principal problème maintenant est le manque de support TypeScript - et la documentation.

@roymilder , merci beaucoup. Votre réponse a fait ma journée - les substitutions aux modèles dynamiques sont très floues.
Gloire!

Bonjour @OleksiiM ,

Cet exemple vous aide-t-

@ darren-dev,

Merci de votre aide! En ce qui concerne le manque de support et de documentation TypeScript, faites-vous référence au côté Firebase?

@uups ,

Merci de votre aide!

Meilleures salutations,

Elmer

@thinkingserious , oui. Merci.

@OleksiiM ,

Où avez-vous regardé en premier? J'essaie de comprendre comment m'assurer que les personnes qui ont besoin d'utiliser des modèles dynamiques accèdent au lien que je vous ai envoyé en premier.

@thinkingserious
Commencé ici .

Ça dit:
"Envoi de modèles transactionnels
Vous pouvez envoyer des modèles transactionnels de l'une des trois manières suivantes:
Utilisation du relais SMTP
Inclure l'ID de modèle dans le paramètre de modèles du point de terminaison d'envoi de courrier de l'API Web v3
Utilisation du paramètre x-smtpapi dans le point de terminaison d'envoi de courrier de l'API Web v2 "

Je suis donc passé à "Inclure l'ID de modèle dans le paramètre de modèles du point de terminaison d'envoi de courrier de l'

Pourquoi ce n'était pas clair:
la dernière page montre la liste des possibles "Request body parameters" qui montre le template_id mais ne dit rien sur le champ "dynamic_template_data". J'ai essayé d'aller avec "personnalisations" + "substitutions" + "template_id" et cela n'a pas fonctionné.
De plus, comme je suis un nouvel utilisateur de Sendgrid, je n'étais pas au courant des "anciens" modèles et des "nouveaux" modèles (dynamiques) et de la différence entre eux (les pages doc sendgrid ci-dessus ne disent rien à ce sujet).

Merci d'avoir demandé et d'améliorer les documents. J'espère que d'autres éviteront ce type de problèmes.

@thinkingserious si je peux ajouter:
J'utilise actuellement ces documents: https://sendgrid.com/docs/API_Reference/api_v3.html

Les instructions d'envoi d'e-mail (https://sendgrid.api-docs.io/v3.0/mail-send) ne mentionnent pas du tout dynamic_template_data dans les personnalisations.

Ce n'est donc pas clair non plus.

J'espère que ça aide!

@Whatthefoxsays ^^

Merci @OleksiiM et @roymilder! Nous apprécions vos contributions à la communauté Twilio SendGrid :)

Salut à tous, j'ai également passé quelques heures sur cette question.

Au lieu d'utiliser substitutions , utilisez plutôt dynamicTemplateData dans l'objet principal 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)

Référence: # 691

Selon ce PR, lorsque le templateId est un modèle dynamique (préfixé par d- ), le substitutions n'est pas du tout envoyé, donc le dynamicTemplateData l'objet doit être utilisé.

Ils ont créé un problème ici pour améliorer l'utilisation des modèles d'ajout dynamiques dans les documents, mais d'ici là, j'espère que cela aide. 🎉

En bousculant depuis 2 jours, j'ai vu cela et je l'ai fait fonctionner.

Bonjour @Travotics ,

Avec quelle documentation avez-vous commencé avant de trouver ce qui précède? J'essaye d'améliorer cette expérience. Merci!

Meilleures salutations,

Elmer

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

N'a pas dynamicTemplateData mais il a substitutionWrappers et substitutions .

En plus de mettre à jour la documentation, il serait également judicieux de mettre à jour l'interface de type MailData (https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/helpers/classes/ mail.d.ts # L117). Pour @ SendGrid / courrier de presse qui ne prennent pas en charge le substitutions , ils devraient s'attendre à un V2MailData paramètre qui a le substititons et substitutionWrappers champs omis.

Bonjour, après avoir lu le commentaire de @himanshupnt , j'ai testé avec un ancien modèle et cela a fonctionné. Merci @himanshupnt .

Plus tard, j'ai trouvé la documentation Sendgrid Mail Send avec des modèles transactionnels dynamiques , j'ai en quelque sorte le nouveau modèle (pas hérité) qui fonctionne. J'ai utilisé le même modèle HTML et mon code a été mis à jour pour:

  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));

Notez que j'ai remplacé "substitutions" par "dynamic_template_data", et placé "à" à l'intérieur de "personnalisations" comme requis par la documentation. Et j'ai également traité le sujet comme l'un des "dynamic_template_data" et cela fonctionne. (mettre {{subject}} dans le champ d'objet du modèle)

Merci.

Merci beaucoup pour ça! J'ai passé beaucoup de temps à déboguer pour cela. : /

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

nicoasp picture nicoasp  ·  3Commentaires

Loriot-n picture Loriot-n  ·  4Commentaires

thinkingserious picture thinkingserious  ·  4Commentaires

wooyah picture wooyah  ·  4Commentaires

egges picture egges  ·  3Commentaires