Sendgrid-nodejs: Unterstützung für dynamische Vorlagen hinzufügen

Erstellt am 24. Juli 2018  ·  30Kommentare  ·  Quelle: sendgrid/sendgrid-nodejs

Problemzusammenfassung

Am 24.07.2018 hat unser Team dynamische Inhalte für Transaktionsvorlagen veröffentlicht. Es ist jetzt für alle Kunden verfügbar, die über v3 unserer Mail Send API senden. Iterieren Sie über Listen, handhaben Sie Bedingungen und mehr, dank der nativen Unterstützung für eine Teilmenge der Handlebars-Syntax!

Weitere Informationen finden Sie in unserer Blogpost-Ankündigung .

Sie können diese Funktion derzeit verwenden, indem Sie den Anforderungstext wie hier gezeigt manuell erstellen.

Jetzt müssen wir Hilfscode ( das ist abgeschlossen ) und Beispiele für dieses SDK erstellen.

Akzeptanzkriterium

  • [[COMPLETE](https://github.com/sendgrid/sendgrid-nodejs/pull/691#issuecomment-407490342)] [Implementieren Sie einen Helfer ähnlich dem, den wir für die Legacy-Vorlagen haben](https://github.com /sendgrid/sendgrid-nodejs/blob/master/packages/mail/USE_CASES.md#transactional-templates)
  • Aktualisieren Sie das Beispiel USE_CASES.md , um die neuen dynamischen Vorlagen mithilfe des Hilfsprogramms zu demonstrieren, und benennen Sie das aktuelle Beispiel in Legacy um

Dokumentation

medium docs update

Hilfreichster Kommentar

Bitte aktualisieren Sie Ihre Dokumentation. Ich habe gerade eine Stunde damit verbracht, herauszufinden, warum Substitutionen mit der v3-API nicht funktionierten.

Alle 30 Kommentare

Bitte aktualisieren Sie Ihre Dokumentation. Ich habe gerade eine Stunde damit verbracht, herauszufinden, warum Substitutionen mit der v3-API nicht funktionierten.

Ich entschuldige mich für die schlechte Erfahrung @jharris-code.

Ich habe Ihre Stimme zu diesem Thema hinzugefügt, damit es Priorität erhält. Ich denke, es wird bald aktualisiert, da wir einige PR #711 haben.

Es ist sehr albern, dass das Fehlen von Dokumentation die Veröffentlichung des eigentlichen Codes blockiert.

Hallo @catamphetamin ,

Der Code wurde in v6.3.1 veröffentlicht . Ich hoffe das hilft, danke!

Mit besten Empfehlungen,

Elmer

@thinkingserious Oh, cool, eigentlich ist es mir nicht in den Sinn gekommen, die Version der Bibliothek zu aktualisieren.
Das probiere ich mal aus, thx.

Hinweis für Benutzer: Wenn Sie Vorlagen verwenden, übergeben Sie dynamic_template_data anstelle von substitutions .

Jetzt müssen Sie "substitutions:" in "dynamic_template_data:" ändern.

Und die Vorlagen verwenden Lenker, es müssen keine "substitutionWrappers" mehr angegeben werden

Dieses Beispiel in Ihren Anwendungsfällen verwendet immer noch Ersetzungen anstelle von dynamic_template_data. Bitte aktualisieren, ich habe definitiv ein paar Stunden mit dem SDK gespielt und gesucht, bevor ich diesen Thread gefunden habe. (Auch Ihre API-Dokumente erwähnen nichts darüber, was auch nicht geholfen hat.
Außerdem scheint SubstitutionWrappers mit dynamic_template_data überhaupt nicht zu funktionieren. Unabhängig davon, ob ich das Schlüssel-Wert-Paar substitutionWrappers: ['*|', '|*'] in mein Nachrichtenobjekt eingefügt habe, wurden nur Template-Variablen in geschweiften Klammern ausgefüllt.

Ich entschuldige mich @josh-yonomi,

Ich habe die Dokumentation basierend auf Ihrem Feedback aktualisiert.

Für unsere neuen Vorlagen verwenden sie die Handlebars-Syntax. Die Legacy-Vorlagen funktionieren weiterhin wie zuvor.

Mit besten Empfehlungen,

Elmer

Ich erhalte die E-Mail, aber die Ersetzungen funktionieren nicht. Was kann das Problem verursachen?

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

EDIT über @thinkingserious

Würde es Ihnen etwas ausmachen, uns mitzuteilen, wo das Problem liegt? Wir würden gerne Ihre Frustrationen verstehen, damit wir uns verbessern können.

@drav96 ,

Macht es Ihnen etwas aus, zu teilen, wie Ihre Vorlage aussieht?

Mit besten Empfehlungen,

Elmer

Warum werden Sonderzeichen in SubstitutionWrappers entfernt??

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

nur {{foo}} wtf String in E-Mails zurück.

Ich bin mir nicht sicher @larafale , aber das scheint sicherlich nicht vernünftig. Wenn ich mir den Quellcode für dieses SDK ansehe, sehe ich nicht, wo diese Schlüssel geändert werden.

Macht es Ihnen etwas aus, für dieses Problem eine separate Ausgabe zu erstellen und anzugeben, wie Ihre HTML-Vorlage aussieht? Ich werde das neue Problem als Fehler markieren und versuchen, es zu reproduzieren und gegebenenfalls zu beheben.

Hallo,

Ich versuche also, eine dynamische Vorlagen-E-Mail zu senden, konnte jedoch keine Ersetzungen oder dynamic_template_data .
Meine Vorlage enthält Tags wie {{fullname}} oder {{date}} und diese Eigenschaften werden an die Funktion send gesendet:

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

    return sgMail.send(msg)

Ich habe bestätigt, dass das Objekt substitutions die richtigen Eigenschaften mit den richtigen Werten hat, aber die Ersetzung funktioniert nicht.

Irgendeine Ahnung was ich falsch mache?

Vielen Dank.

@gianfelipe93
Der Aufbau stimmt. Ich hatte das gleiche Problem.
Meine Lösung bestand darin, das @sendgrid- Paket aus meinem Projekt zu deinstallieren und erneut zu installieren
Lass mich wissen, ob es bei dir funktioniert
const msg= { to: email, from: sendGridMail, templateId: emailTemplate.requestDemoEmail, dynamic_template_data: { name: data.name, email: data.email, } };

@drav96 danke Kumpel, es funktioniert jetzt

Ich hoffe, es wird eine endgültige Dokumentation sein, nachdem ich eine weitere Stunde meiner Zeit damit verschwendet habe. (Zuerst vielen Dank an alle, die vor mir Stunden ihrer Zeit verschwendet haben.)

  1. Wenn Ihre Vorlagen-ID mit d- beginnt, dann funktioniert substitutions nicht und Sie sollten CAMEL-CASE dynamicTemplateData (siehe hier , wo sie sowieso snake_case-Schlüssel in camelCase konvertieren )
  2. Wenn Ihre Vorlage mit d- beginnt, wird setSubstitutionWrappers stillschweigend ignoriert und Sie müssen {{ und }} in Ihren Vorlagen verwenden

Ich hoffe, es wird eine endgültige Dokumentation sein, nachdem ich eine weitere Stunde meiner Zeit damit verschwendet habe. (Zuerst vielen Dank an alle, die vor mir Stunden ihrer Zeit verschwendet haben.)

  1. Wenn Ihre Vorlagen-ID mit d- beginnt, dann funktioniert substitutions nicht und Sie sollten CAMEL-CASE dynamicTemplateData (siehe hier , wo sie sowieso snake_case-Schlüssel in camelCase konvertieren )
  2. Wenn Ihre Vorlage mit d- beginnt, wird setSubstitutionWrappers stillschweigend ignoriert und Sie müssen {{ und }} in Ihren Vorlagen verwenden

In meinem Fall funktioniert es mit dynamic_template_data auch wenn in der Vorlagen-ID der Buchstabe d-

Ja, es funktioniert mit Snake-Case-Schlüsseln, aber es scheint, als hätten sich die Entwickler intern auf Camel Case festgelegt (siehe die Zeile, auf die ich in meinem obigen Bericht verlinkt habe). Daher würde ich allen neuen Code empfehlen, Camel Case zu verwenden.

Hallo @kael-shipman,

Vielen Dank, dass Sie sich die Zeit genommen haben zu helfen, wir wissen es sehr zu schätzen!

Haben Sie diese Dokumentation zufällig gesehen? Wenn nicht, würde es Ihnen etwas ausmachen, Ihren Entdeckungsweg zu beschreiben, der zu einer verlorenen Stunde führte. Ich würde es lieben, wenn so etwas nie wieder passiert und entschuldige mich für die schlechte Erfahrung.

Mit besten Empfehlungen,

Elmer

@thinkingserious ,

Wie auch immer, das Problem ist nicht so sehr, dass irgendwo die richtige (ish) Dokumentation existiert, sondern dass viele alte Dokumentationen immer noch in der Google-Suche gefangen sind. Ich habe nach "Sendgrid-Vorlagenfeldern" gesucht (gerade jetzt) ​​und das erste Ergebnis ohne Anzeigen ist dies , was nach allen Angaben die offizielle Dokumentation ist, aber eindeutig veraltet ist. Nicht nur das, sondern es hat auch zwei verschiedene Ersetzungsformate ( -firstName- und %firstName% ) und sagt nur "was Sie verwenden, hängt möglicherweise von der verwendeten SDK-Bibliothek ab", was angesichts der Tatsache, dass es wirklich abwegig erscheint, nicht stimmt dass alle SDK-Bibliotheken vermutlich auf denselben einzigen Tempel verweisen würden (der nur einen Stil von Substitutions-Tags hat).

Nach meiner Erfahrung mit sendgrid schätze ich zwar sehr, was gebaut wurde, aber diese Verwirrung in der Dokumentation ist eigentlich die Regel, nicht die Ausnahme. Ich weiß, dass es wahrscheinlich genauso voranschreitet wie der Rest der Softwarewelt, aber es wäre schön, einen Monat oder so zu brauchen, um einfach die gesamte Dokumentation zu normalisieren, Versionsnummern darauf zu setzen usw. und vielleicht etwas dagegen zu unternehmen Top-Google-Hits.

Trotzdem danke nochmal!

Außerdem zeigt die von Ihnen verlinkte Dokumentation immer noch dynamic_template_data im Snake-Fall, und wenn das richtig ist, bin ich mir nicht sicher, warum der Code selbst es in camelCase zu konvertieren scheint. Wie oben erwähnt, erkenne ich an, dass Snake Case funktioniert, aber angesichts des Codes scheint es nicht so, als ob die Dokumentation die Verwendung empfehlen sollte.

Hallo @kael-shipman,

Vielen Dank, dass Sie sich die Zeit für ein ausführliches Feedback genommen haben!

In Bezug auf den von Ihnen bereitgestellten Link bezieht sich diese Dokumentation auf unsere SendGrid-SMTP-API, nicht auf die SendGrid v3-REST-API, die dieses SDK unterstützt. Das heißt, man sollte das nicht erwarten. Ich werde unser Dokumentationsteam auf dieses Problem aufmerksam machen, um zu sehen, ob es eine Möglichkeit gibt, es klarzustellen.

Wir haben vor kurzem unsere Open-Source-Dokumentation aktualisiert und

Ich werde die README korrigieren, um camelCase aus Konsistenzgründen zu verwenden. Danke, dass du das erkannt und uns darauf aufmerksam gemacht hast!

Nochmals vielen Dank und als Zeichen unserer Wertschätzung für Ihr ausführliches Feedback möchten wir Ihnen etwas Swag anbieten. Genießen!

Mit besten Empfehlungen,

Elmer

Hey cool, danke :D

Am Di, 18. September 2018 um 18:09 Elmer Thomas [email protected]
schrieb:

Hallo @kael-shipman https://github.com/kael-shipman ,

Vielen Dank, dass Sie sich die Zeit für ein ausführliches Feedback genommen haben!

In Bezug auf den von Ihnen angegebenen Link ist diese Dokumentation eine Referenz
an unsere SendGrid-SMTP-API, nicht an die SendGrid v3-REST-API, die dieses SDK
unterstützt. Das heißt, man sollte das nicht erwarten. ich werde bringen
dieses Problem an unser Dokumentationsteam richten, um zu sehen, ob es ein
Weise klar zu machen.

Wir haben gerade unsere Open-Source-Dokumentation aktualisiert und neu aufgelegt
https://sendgrid.com/blog/how-to-get-the-most-from-sendgrids-new-knowledge-center/ .
Ich hoffe, Sie finden es einfacher zu navigieren.

Ich werde die README korrigieren, um camelCase aus Konsistenzgründen zu verwenden. Danke für
das einfangen und uns darauf aufmerksam machen!

Nochmals vielen Dank und als Zeichen unserer Wertschätzung für Ihre ausführliche
Feedback, wir möchten Ihnen etwas Swag anbieten
https://dx.sendgrid.com/swag . Genießen!

Mit besten Empfehlungen,

Elmer


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/sendgrid/sendgrid-nodejs/issues/703#issuecomment-422588492 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ADUIglZIH2d7imy-H7dekTo5A-v2Xau8ks5ucX0agaJpZM4Vev8b
.

Ich kann dynamic_template_data für allgemeine E-Mail-Variablen verwenden, aber was ist, wenn wir auch dynamische Daten pro Empfänger hinzufügen müssen? ZB Bestellnummern, Bestellmenge usw. Ich sehe keinen Anwendungsfall dafür in den Dokumenten, aber vielleicht übersehe ich ihn.

Hinweis für Benutzer: Wenn Sie Vorlagen verwenden, übergeben Sie dynamic_template_data anstelle von substitutions .

@catamphetamine Leider habe ich Ihren Kommentar abgelehnt, weil ich einfach zu viel Zeit damit verbracht habe, herauszufinden, warum der Code aller mit dynamicTemplateData zu funktionieren scheint, aber in meinem Fall werden die Ersetzungen einfach entfernt. Ich hoffe nur, dass andere bessere Erfahrungen machen.

Meine Version:
"@sendgrid/mail": "^6.3.1"

Es stellte sich heraus, dass ich für mich Folgendes tun musste (das Gegenteil von dem, was die Leute sagen):

// 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 liebe das Tool. Bitte verbessern Sie weiterhin die Dokumentation, decken Sie Randfälle ab usw. 🎉❤️


AKTUALISIEREN:

Danke an @catamphetamine Downvote. Ich dachte, dass substitutions vielleicht funktioniert, weil ich setSubstitutionWrappers("{{", "}}"); . Ach, nein. Ich weiß nicht, was passiert ist, ich bin vielleicht müde, aber dynamicTemplateData funktioniert . Beachten Sie, dass es sich um camelCase handelt _(siehe @kael-shipman-Kommentar)_ Ich sehe die meisten Beispiele für Schlangenfälle. Außerdem verwende ich TS-Typen für sendgrid. In der Definition ist kein Schlüssel Snake_case verfügbar.


AKTUALISIERUNG 2:

Zu den verfügbaren Typen. Ich habe dynamic_template_data im Typ PersonalizationJSON . Wenn Sie Folgendes verwenden:
import { send } from "@sendgrid/mail";
Nachdem Sie den ersten Parameter für send überprüft haben, sehen Sie MailData mit der folgenden Definition:

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

Dann stolpere ich über die folgenden 2 Typen:

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

Schließlich bekomme ich dynamic_template_data , um konsequent wie

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

@thinkingserious Offensichtlich gibt es Probleme mit der Typdefinition, die behoben werden müssen. Ich kann später eine PR erstellen.

Ok, ich muss nochmal nachforschen. Ich bin fassungslos, weil jetzt weder dynamicTemplateData noch substitutions für mich funktionieren.

AKTUALISIEREN:
Einige Tabellen umgedreht, aber zum Laufen gebracht und meinen vorherigen Kommentar aktualisiert.

Schließlich bekomme ich dynamic_template_data , um konsistent wie

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

Dies war für mich ein wichtiger Punkt. Ich habe versucht, den Betreff in der Transaktionsvorlage für to ​​vs cc-E-Mails unterschiedlich festzulegen. Es hat funktioniert, als ich die Eigenschaft dynamic_template_data wie oben beschrieben in das Personalisierungsarray eingefügt habe.

    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
             }
            }
          ]
    };

Die Lösung, die für mich funktioniert hat, besteht darin, die dynamic_template_data genau wie unten gezeigt in das Personalisierungsobjekt zu platzieren:

    "personalizations": [
        {
              "dynamic_template_data": {
            "fullname": "full Name",
            "useremail": ":[email protected]",
            "userphone": "56456",
            "usermsg": "tex fdsfgasdf t"
    },
            "to": [
                {
                    "email": "[email protected]"
                }
            ],
            "cc": [
                {
                    "email": "[email protected]"
                }
            ]
        }
]
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen