Sendgrid-nodejs: Exemple facile à comprendre

Créé le 28 juin 2016  ·  75Commentaires  ·  Source: sendgrid/sendgrid-nodejs

Bonjour,

Ce serait formidable de fournir un exemple facile à comprendre sur votre readme, quelque chose d'aussi simple que https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/ par exemple, car tbh si je voulais écrire 30 lignes de code javascript pour envoyer un e-mail simple Je n'utiliserais pas sendgrid.

Votre bibliothèque est assez frustrante à utiliser, même pour un développeur expérimenté.

À votre santé,
et désolé pour cette diatribe en colère

ps: cet exemple est exactement ce que je recherche https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html , si facile à utiliser

help wanted community enhancement

Commentaire le plus utile

@thinkingserious J'ai finalement compris ce qui me dérange tant dans toutes les classes d'assistance Sendgrid introduites dans la v3 ... il y en a trop et elles rendent l'envoi d'e-mails inutilement compliqué: P

Je ne voulais pas réviser tout le code de Sendgrid, alors j'ai décidé de créer un simple wrapper à la place, sendgrid-mailer .

Bien que les classes d'assistance de Sendgrid soient utiles dans les coulisses, pour créer et valider des modèles de courrier électronique, je ne pense pas qu'elles devraient nous être imposées simplement pour interagir avec l'API. Je trouve que cela rend l'écriture d'applications Node plus compliquée qu'elle ne devrait l'être, et le nom des helpers peut être assez déroutant, par exemple Mail vs Email .

Je pense que l'exemple de base illustre bien le problème:

https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class

Cela semble juste trop compliqué pour quelque chose d'aussi basique que "Je veux envoyer un e-mail". Il vous oblige à charger 8 dépendances différentes et à écrire 15 lignes de code avant de pouvoir envoyer un e-mail.

Cependant, ne pas utiliser les classes d'assistance est sans doute encore pire, car vous devez alors connaître la structure requise de la requête JSON de courrier électronique et la remplir correctement vous-même. Une erreur rompra facilement la demande.

J'ai donc résumé toute la logique des classes d'assistance derrière un assistant API simple et facile à utiliser, de sorte que l'envoi d'e-mails avec Sendgrid redevienne facile et amusant :)

L'exemple le plus élémentaire devient:

//Load mailer and set API key (only needed once)
const mailer = require('sendgrid-mailer').config(API_KEY);

//Create email data 
const email = {
  to: '[email protected]',
  from: 'Someone <[email protected]>',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: '<p>Hello HTML world!</p>',
};

//Send away 
mailer.send(email); //Returns promise 

La demande est construite dans les coulisses et utilise les aides de Sendgrid de manière transparente.

Il prend également en charge l'envoi de plusieurs e-mails, expose l'objet Sendgrid au cas où une personnalisation supplémentaire serait nécessaire, accepte également les instances Sendgrid Mail et accepte une grande variété de formats pour les champs to / from, par exemple Name <[email protected]> ou un objet avec des propriétés de nom / e-mail. Voir le README pour plus de détails.

Il y a probablement encore des améliorations à faire, mais je souhaitais partager cette solution ici pour les personnes souhaitant utiliser l'API Sendgrid sans en être submergées.

J'espère que cela sera utile pour quelqu'un, et peut-être que cela pourra fournir une direction pour l'avenir de cette bibliothèque, en exposant une API plus simple :)

cc @julesbou un peu tard, mais j'espère que vous pourrez toujours en trouver une utilité.

Tous les 75 commentaires

Bonjour @julesbou ,

Les coups de gueule en colère me conviennent, surtout s'ils ont des solutions jointes :)

Merci d'avoir pris le temps de nous le faire savoir.

Nous planifions actuellement les améliorations pour la prochaine itération, vous avez donc eu un bon timing!

Si vous avez d'autres demandes particulières, veuillez nous en informer dans ce fil ou veuillez ouvrir des problèmes supplémentaires.

Merci!

Comment utilisons-nous la classe helper? Tout ce que je veux faire est de définir le nom de l'expéditeur ??

@jsgandalf ,

Le moyen le plus simple est: https://github.com/sendgrid/sendgrid-nodejs#hello -email, en particulier: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail/example. js # L4

Vous pouvez également simplement créer votre propre json comme suit: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js#L31 (voici un aperçu du json: https: / /sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html)

Merci!

Très utile! Cela devrait être sur le readme !!

@jsgandalf @thinkingserious Je trouve moi aussi la bibliothèque assez frustrante à utiliser. J'essaie d'envoyer un modèle d'e-mail. J'ai trouvé les exemples ici peu utiles. Je ne sais pas comment définir les adresses e-mail "à" et "de", et ce code n'envoie même pas mon e-mail. Je me gratte la tête depuis trois jours. De l'aide?

Merci pour les commentaires @bcootner. Votre demande aide à résoudre ce problème dans la file d'attente. C'est un problème que j'ai hâte de résoudre.

En attendant, nous espérons que cet exemple aidera:

var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY)

function helloTemplate(){
  var helper = require('sendgrid').mail

  from_email = new helper.Email("[email protected]")
  to_email = new helper.Email("[email protected]")
  subject = "Hello World from the SendGrid Node.js Library"
  content = new helper.Content("text/plain", "some text here")
  mail = new helper.Mail(from_email, subject, to_email, content)
  // The constructor above already creates our personalization object
  // -name- and -card- are substitutions in my template
  substitution = new helper.Substitution("-name-", "Example User")
  mail.personalizations[0].addSubstitution(substitution)
  substitution = new helper.Substitution("-card-", "Denver")
  mail.personalizations[0].addSubstitution(substitution)
  mail.setTemplateId("YOUR_TEMPLATE_ID")
  return mail.toJSON()
}

function send(toSend){
  //console.log(JSON.stringify(toSend, null, 2))
  //console.log(JSON.stringify(toSend))

  var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY)

  var requestBody = toSend
  var emptyRequest = require('sendgrid-rest').request
  var requestPost = JSON.parse(JSON.stringify(emptyRequest))
  requestPost.method = 'POST'
  requestPost.path = '/v3/mail/send'
  requestPost.body = requestBody
  sg.API(requestPost, function (response) {
    console.log(response.statusCode)
    console.log(response.body)
    console.log(response.headers)
  })
}

send(helloTemplate())

Veuillez nous contacter si vous avez besoin d'aide supplémentaire.

@thinkingserious Merci pour votre temps et votre réponse réfléchie. J'ai le code suivant:

    var  sg = require('sendgrid').SendGrid("SG.**** .. ***6o");

    function welcomeTemplate() {
         console.log("template")
         var helper = require('sendgrid').mail
         from_email = new helper.Email("[email protected]")
         to_email = new helper.Email("[email protected]")
         subject = "Hello World from the SendGrid Node.js Library"
         content = new helper.Content("text/plain", "some text here")
         mail = new helper.Mail(from_email, subject, to_email, content)
         substitution = new helper.Substitution("-Name-", "bcootner")
         mail.personalizations[0].addSubstitution(substitution)
         mail.setTemplateId("5a****-*******-******-9")    //The ID of my Transactional Template
         return mail.toJSON()
}

function sendMail(toSend) {
     console.log("Send")
     var sg = require('sendgrid').SendGrid("SG.***....****o")
     var requestBody = toSend
     var emptyRequest = require('sendgrid-rest').request
     var requestPost = JSON.parse(JSON.stringify(emptyRequest))
     requestPost.method = 'POST'
     requestPost.path = '/v3/mail/send'
     requestPost.body = requestBody
     sg.API(requestPost, function (response) {
            console.log(response.statusCode)
            console.log(response.body)
            console.log(response.headers)
       })
}

Et puis j'appelle ce code avec sendMail(welcomeTemplate()) mais cela ne fonctionne pas. Le «modèle» et «envoyer» apparaissent dans les journaux mais le statusCode, le corps ou les en-têtes n'apparaissent pas, aucun e-mail n'est reçu et rien n'apparaît sur mon tableau de bord.

Après requestPost.body = requestBody pourriez-vous s'il vous plaît faire console.log(JSON.stringify(requestBody)) et dites-moi ce que vous obtenez.

@thinkingserious Après quelques débogages, il semble que rien ne soit var emptyRequest = require('sendgrid-rest').request . Le premier «modèle» est enregistré, puis environ 5 minutes plus tard, «envoyer» est imprimé (et si je décommente les lignes que vous avez commentées dans la fonction d'envoi, elles fonctionnent très bien). Y a-t-il quelque chose qui me manque pour cette instruction require, je viens de faire npm install sendgrid

Veuillez essayer ceci:

A. Créez un fichier appelé post.json avec la charge utile suivante:

{"content":[{"type":"text","value":"Hello, World!"}],"from":{"email":"[email protected]"},"personalizations":[{"subject":"Hello, World!","to":[{"email":"[email protected]"}]}]}

B. Remplacez les exemples d'e-mails

C. Exécutez la commande suivante:

curl -X "POST" "https://api.sendgrid.com/v3/mail/send" \
        -H "Authorization: Bearer $SENDGRID_API_KEY"  \
        -H "Content-Type: application/json" \
        -d @post.json

D. Remplacez $ SENDGRID_API_KEY par votre clé API ou ajoutez votre clé API à une variable d'environnement appelée SENDGRID_API_KEY

@thinkingserious J'ai reçu cet e-mail de test, j'ai également pu faire fonctionner le test Hello , c'est juste que ces modèles ne veulent pas fonctionner.

EDIT: J'ai donc remplacé var emptyRequest = require('sendgrid-rest').request par var emptyRequest = sg.emptyRequest() et cela envoie l'e-mail, il n'y a tout simplement pas de mise en forme de la conception du modèle ou des images.

@bcootner ,

Malheureusement, je ne peux pas reproduire votre erreur, j'essaie donc de vous aider à résoudre les problèmes éventuels. Puisque vous pouvez envoyer un e-mail via curl, cela signifie que votre clé API est bonne. Peut-être que l'ID de modèle a un problème?

Si vous supprimez mail.setTemplateId("5a****-*******-******-9") l'e-mail est-il envoyé?

@thinkingserious Donc, si je supprime le setTemplateID, il envoie le test "Hello World de la bibliothèque SendGrid Node.js".

Je ne sais pas si vous avez vu ma modification, mais en remplaçant var emptyRequest = require('sendgrid-rest').request par var emptyRequest = sg.emptyRequest() le texte de mon modèle est envoyé, mais il n'y a pas de mise en forme (pas de polices, pas d'images). Je reçois maintenant l'impression suivante à partir de la console.

2016-07-13T00:01:07.514157+00:00 app[web.1]:   date: 'Wed, 13 Jul 2016 00:01:07 GMT',
2016-07-13T00:01:07.514159+00:00 app[web.1]:   connection: 'close',
2016-07-13T00:01:07.514157+00:00 app[web.1]:   date: 'Wed, 13 Jul 2016 00:01:07 GMT',
2016-07-13T00:01:07.514158+00:00 app[web.1]:   'content-type': 'text/plain; charset=utf-8',
2016-07-13T00:01:07.502390+00:00 app[web.1]: 202
2016-07-13T00:01:07.502454+00:00 app[web.1]: 
2016-07-13T00:01:07.514155+00:00 app[web.1]: { server: 'nginx',
2016-07-13T00:01:07.514159+00:00 app[web.1]:   connection: 'close',
2016-07-13T00:01:07.514161+00:00 app[web.1]:   'x-frame-options': 'DENY' }

Quelque chose me fait penser que c'est un problème avec 'text / plain', mais je ne suis pas sûr. Merci encore!

Hey @bcootner , je viens de rencontrer le même problème et je me gratte la tête depuis quelques heures, mais j'ai réussi à le résoudre. Il semble qu'il y a trop de choses inutiles nécessaires avant de pouvoir envoyer l'e-mail, mais voici ma fonction d'assistance pour le faire:

_Params_

  • from (par exemple '[email protected]')
  • à (par exemple '[email protected]')
  • sujet (par exemple, «sujet de test»)
  • message (par exemple 'message de test')
  • template (identifiant du modèle que vous souhaitez utiliser)
  • templateVariables (objet, où clé - variable dans l'e-mail, valeur - valeur par laquelle le remplacer) { ":name": "someName", ":email": "someEmail" } . Notez que :email et :name est la façon dont j'ai défini mes variables dans le modèle de courrier électronique, cela peut être -email- ou tout ce que vous avez
  • rappel de succès
  • rappel d'erreur
    let sendTemplateMail =  (from, to, subject, message, template, templateVariables, successCallback, errorCallback) => {
        var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY),
            helper = require('sendgrid').mail,
            content_text = new helper.Content("text/plain", message),
            content_html = new helper.Content("text/html", message),
            request = sg.emptyRequest(),
            email_to = new helper.Email(to),
            email_from = new helper.Email(from),
            mail = new helper.Mail(email_from, subject, email_to, content_text),
            personalization = new helper.Personalization();

        personalization.addTo(email_to);
        personalization.setSubject(subject);

        mail.setTemplateId(template);
        mail.addContent(content_html);

        for(var key in templateVariables) {
            if(templateVariables.hasOwnProperty(key)) {
                var substitution = new helper.Substitution(key, templateVariables[key]);
                personalization.addSubstitution(substitution);
            }
        }

        mail.addPersonalization(personalization);

        request.method = 'POST';
        request.path = '/v3/mail/send';
        request.body = mail.toJSON();

        sg.API(request, (json) => {
            if(json.statusCode >= 300) {
                errorCallback(json);
            } else {
                successCallback(json);
            }
        });
    }

La documentation a en effet besoin d'être refactorisée, avec des exemples basiques et simples. J'espère que ma fonction vous aidera :)

@ByEmke merci pour votre soutien! Pourriez-vous nous envoyer un e-mail à [email protected] avec votre taille de t-shirt et votre adresse postale?

En ce qui concerne la documentation, un refactor est en cours, ainsi que l'assistant de messagerie lui-même. Nous avons recueilli tous vos commentaires et sommes ravis de la prochaine itération.

En outre, une grande confusion est que vous devez toujours définir le contenu lors de l'utilisation du modèle. Heureusement, cela changera très bientôt (jours).

@bcootner Je pense que vous avez content_html = new helper.Content("text/html", message) . Heureusement, cette exigence disparaît dans quelques jours, notre équipe est en train de modifier ce comportement afin que lorsque vous spécifiez un modèle, vous n'ayez plus besoin de définir le contenu.

@ByEmke @thinkingserious merci pour votre aide sur ce problème, j'ai réussi à le faire fonctionner avec le code suivant hier soir:

 var sg = require('sendgrid').SendGrid("SendGrid API Key" or <environment variable>)

function sendEmail(tempID){
    var helper = require('sendgrid').mail;
    from_email = new helper.Email("[email protected]")
    to_email = new helper.Email("[email protected]")
    subject = "Dummy Subject"
    content = new helper.Content("text/html", "dummy content")
    mail = new helper.Mail(from_email, subject, to_email, content)

    substitution = new helper.Substitution("-name-", "User's Name")
    mail.personalizations[0].addSubstitution(substitution)
    mail.setTemplateId(tempID)
    var requestBody = mail.toJSON()
    var requestPost = JSON.parse(JSON.stringify(sg.emptyRequest()))
    requestPost.method = 'POST'
    requestPost.path = '/v3/mail/send'
    requestPost.body = requestBody
    sg.API(requestPost, function (response) {
       console.log(response.statusCode)
       console.log(response.body)
       console.log(response.headers)
  })
}

Merci encore!

Je pense également que les documents sont assez difficiles à suivre, en particulier lors de l'utilisation de modèles et de certaines autres fonctionnalités.

Je préfère la syntaxe request.body = {} à la syntaxe helper () car cela rend les choses plus verbeuses et moins faciles à lire (pour moi du moins).

J'ai passé un certain temps à parcourir les documents, à tester les modifications, à regarder vos exemples et à essayer à nouveau de venir ici et de découvrir que vous _do_ devez définir le contenu lorsque vous utilisez des modèles, bien que les documents indiquent le contraire. Argh. Des trucs comme ça peuvent vous rendre fou. En tout cas, bravo à @ByEmke pour avoir fourni un exemple fonctionnel.

@peterkuiper (ou devrais-je dire Adam :))

Merci pour vos commentaires, nous sommes très intéressés par la façon dont nous pouvons améliorer les documents de la bibliothèque.

Pour être clair, faites-vous référence à ces derniers? https://github.com/sendgrid/sendgrid-nodejs/blob/master/USAGE.md

En ce qui concerne le problème de contenu (nous vous avons tous entendu :)), c'est à peu près résolu. Nous déploierons une version sur l'API qui ne nécessitera pas la définition du contenu lors de l'utilisation d'un modèle. Nous espérons que ce changement améliorera considérablement l'expérience du modèle.

@thinkingserious J'étais en

Je parcourais ce fichier et je viens de trouver un exemple aléatoire de quelque chose que je trouve déroutant:

var request = sg.emptyRequest()
request.queryParams["start_time"] = '1'
request.queryParams["limit"] = '1'
request.queryParams["end_time"] = '1'
request.queryParams["offset"] = '1'
request.method = 'GET'
request.path = '/v3/suppression/blocks'
sg.API(request, function (response) {
    console.log(response.statusCode)
    console.log(response.body)
    console.log(response.headers)
  })

Quels types sont start_time, limit, end_time et offset et que signifient-ils? Y a-t-il plus de queryParams? Et pourquoi n'est-ce pas request.body?

Il y a un lien vers le guide de l'utilisateur (qui n'aide pas du tout) alors qu'il aurait dû y avoir un lien vers la documentation de l'API qui clarifie les choses https://sendgrid.com/docs/API_Reference/Web_API_v3/blocks.html.

Vous devez donc faire des allers-retours pour essayer de trouver où trouver les informations dont vous avez besoin.

Excellent retour @peterkuiper!

J'aimerais aussi vous swag. Veuillez nous envoyer votre taille de T-shirt et votre adresse postale à [email protected].

Nous mettrons à jour la documentation USAGE.md pour inclure des descriptions des corps de requête et de réponse.

En ce qui concerne les modèles, il est prévu de créer un assistant comme nous l'avons fait pour le point de terminaison de messagerie, avec des exemples de cas d'utilisation courants. En outre, il existe un correctif à venir où vous n'aurez pas à spécifier le contenu lors de l'utilisation de modèles. C'est une grande source de confusion.

@thinkingserious cool, merci :) email envoyé!

Pendant que j'y suis, j'ai remarqué autre chose qui fait également référence aux meilleures pratiques (et qui sème une certaine confusion pour mon équipe). Un de mes coéquipiers a créé des modèles pour certaines fonctionnalités (par exemple, vérifier les e-mails) et ajouté verify-nl, verify-en etc. Donc, chaque modèle était fondamentalement le même, la seule différence étant le texte (langue différente). J'ai vu <% subject%> en <% body%> et je n'ai trouvé aucune référence à celui-ci (TL; DR de ma part peut-être) donc je suppose que c'est une substitution interne de votre côté qui se produit lors de l'utilisation de l'API.

Je suis curieux de savoir ce que pourrait être une pratique «normale»:

  • Créez un modèle pour chaque fonctionnalité dans une langue différente et ne faites que quelques substitutions mineures (par exemple, le nom)

Il semble que l'utilisation de cette approche peut entraîner beaucoup de travail lorsque vous modifiez des parties de votre modèle. Je ne sais pas si vous seriez capable de créer des "modèles de modèles" (c'est-à-dire en-tête / pied de page / quelle que soit la partie). De plus, la limite de 300 modèles peut facilement être atteinte lorsque vous avez beaucoup de langues différentes (ce n'est pas un problème dans notre cas).

  • Créez un modèle pour chaque fonctionnalité et utilisez <% body%> pour définir le corps de votre application et ayez juste un modèle "maître" (ou utilisez votre balise on sub)

J'espère que la question a du sens :)

@peterkuiper ,

Je ne sais pas, mais j'ai sorti des palpeurs. Je vais répondre avec ce que je découvre. Merci!

@thinkingserious J'ai fini par utiliser la version 2.0.0 dont j'aime beaucoup son fonctionnement:

var client = require("sendgrid")("key");

client.send({
  to: "[email protected]",
  from: "[email protected]",
  subject: "subject",
  text:  "hello"
  // Or using the html property:
  // html: "Hello <strong>World!</strong>!"
}, fn);

Je cherche à voir à quoi cela ressemblerait dans la version 3.x.x . Je trouve les exemples actuels vraiment déroutants.

Excellent retour @IonicaBizau!

Nous examinerons certainement vos pensées pour la prochaine itération.

@thinkingserious Super! Pourtant, j'aimerais savoir à quoi cela ressemblerait dans 3.x.x .

Il n'y a pas de mappage un à un car ce client a été recréé à partir de zéro pour se découpler du point de terminaison de messagerie v2 et autoriser l'accès aux points de terminaison v3.

Cela dit, le but de l'assistant de messagerie est d'arriver à un point où l'appel peut être aussi simple qu'il l'était avec la v2. Nous ne sommes tout simplement pas encore là, nous sommes de retour au début et nous attendons avec impatience de nombreuses autres itérations.

@thinkingserious J'ai vu ça, mais je n'aime pas les points suivants:

  1. C'est déroutant car il existe des variables globales (déclarées sans var ou let ou mot clé similaire). Ex: from_email = new helper.Email("[email protected]") au lieu de var from_email = ...
  2. Utiliser new helper.Email uniquement pour une ressource e-mail est très hostile. Cela peut être encapsulé probablement dans une fonctionnalité de niveau inférieur à l'intérieur du module. Même chose pour Content , Mail etc.
  3. Définir manuellement les method , path et body est encore une fois assez hostile.
  4. La fonction de rappel doit être au format err, data, ... (au lieu de la réponse).

En bref, à mon humble avis, le _ démarrage rapide_ est une implémentation de bas niveau pour l'envoi d'un e-mail. Cela peut être utile pour des fonctionnalités plus profondes, mais certainement pas pour un _ démarrage rapide_. 😁


Merci beaucoup pour le service et le module incroyables. ✨

@IonicaBizau ,

Super rétroaction, merci!

Nous ferons certainement référence à vos pensées lors de la construction de la prochaine itération de l'assistant de messagerie.

Vous avez raison, cette première version est un wrapper fin sur l'API. Le plan est d'améliorer progressivement ses fonctionnalités en fonction des commentaires de la communauté, comme ce que vous avez fait!

Pour votre soutien et votre contribution à la communauté, nous aimerions vous envoyer du butin. Veuillez nous envoyer un e-mail à [email protected] avec votre taille de T-shirt et votre adresse postale.

N'hésitez pas à ajouter des commentaires supplémentaires comme bon vous semble. Merci encore!

@IonicaBizau

Vous pouvez également faire quelque chose comme ceci:

var sg = require('sendgrid').SendGrid('API_KEY');
var request = sg.emptyRequest()

request.body = {
  "content": [
    {
      "type": "text/html",
      "value": "<html><p>Hello, world!</p></html>"
    }
  ],
  "from": {
    "email": "[email protected]",
    "name": "My Name"
  },
  "personalizations": [
    {
      "to": [
        {
          "email": "[email protected]",
          "name": "John Doe"
        }
      ]
    }
  ],
  "template_id": "TEMPLATE_ID",
};

request.method = 'POST'
request.path = '/v3/mail/send'
sg.API(request, function (response) {
  console.log(response.statusCode)
  console.log(response.body)
  console.log(response.headers)
});

Je préfère cette syntaxe à la syntaxe d'assistance. Jetez un œil aux exemples, ils m'ont beaucoup aidé.

https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js

HTH

@thinkingserious Wowowow! Va certainement faire. Merci - heureux de vous aider! 😁

@peterkuiper J'ai essayé cela aussi, mais je pense que j'ai fait l'erreur de remplacer text/html par html et le contenu est apparu en pièce jointe. Ensuite, j'ai simplement décidé de rétrograder la version.

Mais encore une fois, cela semble encore faible niveau ( request.method = ... , envoyer le type MIME dans la content tableau, response argument dans le rappel , etc.).

Merci @peterkuiper!

J'ai ajouté ce style d'exemple au README la semaine dernière :)

@IonicaBizau ,

Oui, ce truc de bas niveau sera bientôt caché.

@thinkingserious heureux d'apprendre que les éléments de la demande vont bientôt être cachés 👍

Suite aux excellentes suggestions de @IonicaBizau , une autre recommandation serait de cacher les détails de mise en œuvre des «personnalisations», si possible. Par exemple, faire quelque chose comme:

var sg = require('sendgrid').SendGrid('API_KEY');
sg.addTo(x);
sg.addBcc(email);
sg.addBcc(email);
sg.addHeader(header);

Il semble simplement inutile d'exposer ce niveau de détail via le SDK.

Aussi, je ne sais pas si c'est déjà une fonctionnalité, mais ce serait formidable de pouvoir enchaîner ces appels:

var sg = require('sendgrid').SendGrid('API_KEY');
sg.addTo(x)
  .addBcc(email)
  .addBcc(email)
  .addHeader(header)
  .send();

Merci et continuez votre bon travail 👍

@jamesdixon ,

Merci pour les commentaires supplémentaires!

Jusqu'à ce que nous arrivions à améliorer l'assistant de messagerie pour permettre un masquage supplémentaire de l'implémentation, consultez l'impressionnante pull request de @adambuczynski : https://github.com/sendgrid/sendgrid-nodejs/pull/261. Cela ne répond pas directement à votre idée spécifique, mais c'est un pas dans la bonne direction.

@thinkingserious vous mentionnez que les requêtes de bas niveau seront bientôt cachées, avez-vous déjà prévu quelque chose pour ça? J'y pensais hier, et même si c'est bien d'avoir accès à l'ensemble de l'API, vous pouvez également utiliser sendgrid-rest pour cela. De cette façon, tout ce que cette bibliothèque a à faire est de vous permettre d'envoyer des e-mails et, en tant que tel, d'exposer uniquement l'API d'envoi d'e-mails.

C'était vous séparer les préoccupations et affiner un peu le focus de ce paquet, permettant une API plus propre avec chaînage, etc. comme @jamesdixon l'a suggéré.

@adambuczynski ,

Notre plan est d'exécuter la couche d'abstraction via les helpers. Le courrier est le premier, mais dans un proche avenir, nous prévoyons d'en ajouter un pour la gestion des sous-utilisateurs et les modèles. Mais d'abord, nous devons peaufiner l'assistant de messagerie et en faire la norme.

Vous avez raison, cette bibliothèque est juste une couche très fine sur sendgrid-rest et ajoute simplement des exemples, un fichier USAGE et des tests unitaires (ils sont tous automatisés [nous espérons également ouvrir le code source] en utilisant notre définition Swagger ). À long terme, nous envisageons de mettre en œuvre un code d'assistance pour tous les points de terminaison, avec une validation des données dans les deux sens, le cœur de cette fonctionnalité étant également automatisé. Les flux de travail et les cas d'utilisation seront fabriqués à la main.

Au cours des prochaines semaines / mois, nous exposerons la feuille de route ici sur GitHub pour plus de commentaires.

De plus, d'ici la fin du mois d'août, nous ajouterons la prise en charge du Webhook Incoming Parse à cette bibliothèque.

Merci d'avoir posé cette question et j'espère que ma réponse suscitera d'autres commentaires de votre part et de la communauté. Nous voulons que ce soit une bibliothèque communautaire, soutenue et dirigée par SendGrid.

Merci pour la mise à jour @thinkingserious. Je serai heureux de jouer un rôle dans la bibliothèque sendgrid nodejs à l'avenir.

Pourquoi ajoutez-vous le support Parse à ce stade? Je pensais que le service Parse était retiré en janvier prochain.

@thinkingserious J'ai oublié de mentionner que s'il y a quelque chose que je peux aider ici, envoyez-moi un ping. Je serais heureux de pirater les choses si j'en suis capable. :sourire:

@adambuczynski c'est une excellente nouvelle! De plus, votre demande de tirage se rapproche du sommet. Je pense que je pourrai le fusionner au début de la semaine prochaine.

En ce qui concerne Parse, nous n'avons pas encore décidé de le retirer officiellement. L'ajout de support dans les bibliothèques fait partie de notre test pour déterminer si nous allons continuer ou non.

@IonicaBizau ,

Merci! Votre aide est très appréciée!

Existe-t-il un moyen de définir plusieurs destinataires à l'aide de l'assistant de messagerie?
Je remarque que helper.Mail(from_email, subject, to_email, content) utilise personalization.addTo pour définir le destinataire .. Je crois que cela ne fonctionne qu'avec 1 destinataire et non un tableau de destinataires (peut-être que je me trompe) et que l'assistant ne fournit pas de setTo Fonction

Je vois que si je définissais moi-même la personnalisation avec let personalization = new helper.Personalization(); je pourrais faire personalization.tos = [email, email]//email=new helper.Email(email_address, name) est-ce sûr? Est-il susceptible de changer dans les versions futures?

@ albert-le-créateur Je l'utilise comme suit:

  //Helpers
  const Mail = sendgrid.mail.Mail;
  const Email = sendgrid.mail.Email;
  const Personalization = sendgrid.mail.Personalization;

  //Create new mail object
  let mail = new Mail();

  //Create recipients
  let recipients = new Personalization();
  recipients.addTo(new Email(data.to, data.toname));

  //Set recipients
  mail.addPersonalization(recipients);

Je pense que vous pouvez ajouter plusieurs destinataires en répétant la ligne recipients.addTo , par exemple dans une boucle.

Je trouve cette approche assez verbeuse, avec la division en classes Email et Personnalisation. Parfois, vous voulez simplement ajouter une adresse e-mail et l'envoyer, ce qui donne l'impression que vous avez besoin de beaucoup de lignes de code pour y parvenir.

@ albert-le-créateur,

Ce constructeur a été conçu pour aider les gens à envoyer plus facilement un seul e-mail, c'est essentiellement une fonction "bonjour e-mail".

Pour plusieurs e-mails, vous voudrez probablement suivre cet exemple (comme vous avez déjà commencé dans cette voie en définissant vous-même la personnalisation): https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail /example.js#L15

Il peut également être utile de lire sur les personnalisations: https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html

L'assistant évoluera certainement, mais tout changement de rupture sera signalé par une version préliminaire majeure. Je ne m'attends pas à ce que l'API change beaucoup.

@adambuczynski ,

Merci d'avoir participé! Nous devons mettre à jour l'assistant pour tenir compte des cas d'utilisation courants supplémentaires comme celui-ci et l'envoi d'e-mails avec des modèles par exemple.

@thinkingserious l'API helpers était quelque chose qui m'intéressait également de refactoriser / d'améliorer éventuellement quand j'aurai le temps :)

@adambuczynski ,

C'est génial, quand vous décidez de commencer là-dessus, veuillez me faire un ping. Ou si nous commençons là-dessus avant vous, je vais vous cingler.

J'ai utilisé le code de @bcootner et cela a bien fonctionné. Cependant, ce serait formidable d'avoir un exemple approprié et officiel de la façon d'utiliser un modèle avec ce plugin de nœud.

@otmezger ,

Merci pour le suivi!

Je travaille sur cet exemple cette semaine, vous le trouverez lié dans le README.

Je n'utilise pas l'assistant Template, mais je vais partager mon approche pour charger à la fois les modèles et partiels au format HTML et texte via une méthode d'aide load :

  /**
   * Load an email (both plain text and html)
   */
  load(email, data, req) {

    //Get filenames
    const PARTIAL_HTML = path.resolve('./app/components/' + email + '.html');
    const PARTIAL_TEXT = path.resolve('./app/components/' + email + '.txt');

    //Append some globals
    if (req) {
      Object.assign(data, {
        app: {
          title: req.app.locals.APP_TITLE,
          version: req.app.locals.APP_VERSION,
          url: req.app.locals.APP_BASE_URL,
        },
        date: {
          year: moment().format('YYYY'),
          date: moment().format('DD-MM-YYYY'),
        },
      });
    }

    //Return promise
    return Promise.all([
      Promise.all([
        readFile(TEMPLATE_TEXT, 'utf8'),
        readFile(PARTIAL_TEXT, 'utf8'),
      ]).spread((template, partial) => {
        return template.replace('{{partial}}', partial);
      }),
      Promise.all([
        readFile(TEMPLATE_HTML, 'utf8'),
        readFile(PARTIAL_HTML, 'utf8'),
      ]).spread((template, partial) => {
        return template.replace('{{partial}}', partial);
      }),
    ]).then(result => result.map(contents => replaceData(contents, data)));
  },

Cela peut ensuite être utilisé comme suit pour obtenir un objet prêt à être utilisé avec Sendgrid:

  let email = mailer.load('user/emails/verify-email-address', data, req)
    .spread((text, html) => ({
      to: user.email,
      from: req.app.locals.EMAIL_IDENTITY_NOREPLY,
      subject: 'Verify your email address',
      text, html,
    }));

Vous pouvez facilement adapter l'exemple pour utiliser également quelque chose comme la création de modèles de guidons. Dans l'exemple ci-dessus, l' replaceData est une fonction simple qui remplace les balises de type guidon par les données fournies.

Je ne sais pas si cela est pertinent ou non, mais en n'utilisant PAS le "mail helper", je me suis épargné un temps incommensurable. C'est après avoir été si frustré que je suis passé à la version 2.0 exprès. J'utilise juste une fonction de type usine pour générer un JSON V3 valide et je suis maintenant très enthousiasmé par les améliorations de l'API V3 (puisque je peux les utiliser maintenant).

C'est quelque chose avec lequel j'ai lutté au début aussi. Je pense que le
les aides pourraient probablement être rendues plus efficaces et plus faciles à utiliser. je voudrais
soutiennent même qu'ils ne devraient peut-être pas faire partie du module principal sendgrid,
afin de séparer les préoccupations et permettre aux gens de choisir de les utiliser.

Je vais les regarder à nouveau et voir si je peux trouver du béton
suggestions.

Le vendredi 26 août 2016, 05:48 Sean Lindo [email protected] a écrit:

Je ne sais pas si c'est par exemple ou non, mais en n'utilisant PAS le "mail helper"
Je me suis épargné un temps incommensurable. C'est après l'avoir obtenu
frustré, je suis passé à 2.0 exprès.

-
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/252#issuecomment -242479491,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AAd8Qu5iRLFQwoKlRd2fP5oioT1uLqB6ks5qjdV2gaJpZM4JAiac
.

@seanlindo ,

Merci d'avoir pris le temps de nous faire part de vos commentaires!

Voici un exemple d'utilisation de cette bibliothèque sans Mail Helper: https://github.com/sendgrid/sendgrid-nodejs#without -mail-helper-class

Mail Helper est une première version et nous dépendons de retours comme le vôtre pour nous aider à améliorer la prochaine version. Voulez-vous partager les problèmes spécifiques que vous avez rencontrés afin que nous puissions créer des tickets pour les résoudre?

De plus, j'ajoute votre vote à notre tâche de backlog pour améliorer Mail Helper pour aider à le déplacer dans la file d'attente. Merci!

@adambuczynski ,

Je vois que ta génialité continue :)

J'attends vos retours avec impatience, je sais que ce sera génial!

@julesbou ,

Nous avons lancé un fichier USE_CASES.md dans lequel nous fournirons des exemples de cas d'utilisation courants. Le premier était les modèles de transaction :)

J'attends vos retours avec impatience, je sais que ce sera génial!

👻

@thinkingserious Bien sûr! Donnez-moi environ un jour et je vous donnerai un exemple concret.

C'est l'un de mes fils préférés ici :)

Je pense que vos commentaires seront essentiels pour la prochaine itération de cette bibliothèque, qui sera probablement un changement radical. Si vous avez un moment, pourriez-vous jeter un œil à notre proposition? https://github.com/sendgrid/sendgrid-nodejs/issues/290

Merci!

@thinkingserious J'ai finalement compris ce qui me dérange tant dans toutes les classes d'assistance Sendgrid introduites dans la v3 ... il y en a trop et elles rendent l'envoi d'e-mails inutilement compliqué: P

Je ne voulais pas réviser tout le code de Sendgrid, alors j'ai décidé de créer un simple wrapper à la place, sendgrid-mailer .

Bien que les classes d'assistance de Sendgrid soient utiles dans les coulisses, pour créer et valider des modèles de courrier électronique, je ne pense pas qu'elles devraient nous être imposées simplement pour interagir avec l'API. Je trouve que cela rend l'écriture d'applications Node plus compliquée qu'elle ne devrait l'être, et le nom des helpers peut être assez déroutant, par exemple Mail vs Email .

Je pense que l'exemple de base illustre bien le problème:

https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class

Cela semble juste trop compliqué pour quelque chose d'aussi basique que "Je veux envoyer un e-mail". Il vous oblige à charger 8 dépendances différentes et à écrire 15 lignes de code avant de pouvoir envoyer un e-mail.

Cependant, ne pas utiliser les classes d'assistance est sans doute encore pire, car vous devez alors connaître la structure requise de la requête JSON de courrier électronique et la remplir correctement vous-même. Une erreur rompra facilement la demande.

J'ai donc résumé toute la logique des classes d'assistance derrière un assistant API simple et facile à utiliser, de sorte que l'envoi d'e-mails avec Sendgrid redevienne facile et amusant :)

L'exemple le plus élémentaire devient:

//Load mailer and set API key (only needed once)
const mailer = require('sendgrid-mailer').config(API_KEY);

//Create email data 
const email = {
  to: '[email protected]',
  from: 'Someone <[email protected]>',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: '<p>Hello HTML world!</p>',
};

//Send away 
mailer.send(email); //Returns promise 

La demande est construite dans les coulisses et utilise les aides de Sendgrid de manière transparente.

Il prend également en charge l'envoi de plusieurs e-mails, expose l'objet Sendgrid au cas où une personnalisation supplémentaire serait nécessaire, accepte également les instances Sendgrid Mail et accepte une grande variété de formats pour les champs to / from, par exemple Name <[email protected]> ou un objet avec des propriétés de nom / e-mail. Voir le README pour plus de détails.

Il y a probablement encore des améliorations à faire, mais je souhaitais partager cette solution ici pour les personnes souhaitant utiliser l'API Sendgrid sans en être submergées.

J'espère que cela sera utile pour quelqu'un, et peut-être que cela pourra fournir une direction pour l'avenir de cette bibliothèque, en exposant une API plus simple :)

cc @julesbou un peu tard, mais j'espère que vous pourrez toujours en trouver une utilité.

@adamreisnz sérieusement, merci.

Mon travail d'arrière-plan qui envoie des e-mails via sendgrid utilisait la v4.0.7, ce qui était déjà assez compliqué. J'ai mis à niveau vers la dernière version et malheureusement tout s'est cassé. J'étais tellement frustré par la complexité d'envoyer un e-mail que je n'ai même pas pris la peine de mettre à jour.

Cela dit, la simplicité est exactement ce que je recherchais. Je vais essayer ce week-end.

À votre santé!

@jamesdixon J'étais toujours bloqué sur v3.xx et je ne voulais pas non plus mettre à niveau :)

J'espère que vous le trouverez utile. Faites-moi savoir comment cela fonctionne pour vous et s'il manque quelque chose de critique, merci!

@adamreisnz ,

C'est génial et merci de le partager avec notre communauté :)

tldr; nos cours d'aide ne sont pas terminés et vous nous avez déjà battus là où nous nous dirigeons :)

Nous sommes totalement d'accord avec votre opinion et c'est la phase de la mise à jour de la bibliothèque v3 sur laquelle nous travaillons actuellement sur les 7 de nos SDK. Veuillez consulter le projet d'amélioration de Mail Helper ici pour plus de détails sur le projet Node.js.

Actuellement, nous terminons la bibliothèque C #. Pour obtenir un exemple concret de ce que nous prévoyons pour cette bibliothèque Node.js, veuillez voir ceci . Nous espérons publier celui-ci d'ici quelques jours.

Alors, j'ai une proposition:

Pourriez-vous ajouter votre solution dans Mail Helper ici (similaire à ce que nous avons fait en C #)? Je pense que votre travail atteindrait une plus grande portée dans ce cas. Sinon, pas de problème du tout. Puisque vous avez publié votre projet sous la licence MIT, j'espère que vous nous pardonnerez si nous avons emprunté un peu à votre bon travail;) Et bien sûr, nous veillerons à ce que vous soyez crédité de vos contributions.

Si vous décidez de garder votre travail séparé, pourriez-vous s'il vous plaît ajouter un lien ici sous la section Bibliothèques communautaires?

Merci pour votre incroyable soutien continu. Tu gères!

@thinkingserious heureux d'apprendre que vous envisagez de suivre la même voie. L'exemple C # semble mieux, mais je pense qu'il est encore quelque peu compliqué pour une implémentation JS. Faire de tout des classes n'est pas nécessairement toujours la meilleure façon de procéder dans JS.

En ce qui concerne votre proposition, puisque j'utilise toujours les classes d'assistance sous le capot, je ne sais pas dans quelle mesure il serait utile de les transférer dans la bibliothèque officielle. Je serais probablement plus enclin à aider avec une réécriture majeure (par exemple v5) et à repartir de zéro, en prenant les commentaires des utilisateurs et de la communauté Node et de proposer une API géniale qui est à la fois facile à utiliser et flexible si nécessaire.

Mais si entre-temps vous voulez emprunter une partie du code de mon wrapper pour l'utiliser dans la bibliothèque officielle, allez-y :) J'ajouterai le lien vers mon wrapper dans cette page 🎉

Je pense en fait que ce pourrait être une bonne idée de diviser le projet en deux packages, un niveau inférieur qui inclut la logique de requête pour interagir avec l'API, et un niveau supérieur uniquement pour l'envoi d'e-mails, similaire à ce que j'ai créé.

Le package de niveau inférieur pourrait être utilisé pour les personnes ayant besoin d'un accès complet à l'API, tandis que le package de messagerie conviendrait aux personnes souhaitant simplement envoyer des e-mails. Et bien sûr, sous le capot, le mailer utiliserait le package API.

@thinkingserious que

@adamreisnz ,

Merci pour les commentaires réfléchis, comme toujours.

Je ne sais pas si nous devons diviser le projet à ce stade. Je pense que nous pouvons obtenir des résultats similaires avec le modèle d'aide actuel. Cela dit, je suis ouvert à l'exploration d'une nouvelle architecture dans une version future et j'aimerais beaucoup vous avoir à bord pour cela.

Espérons que d'autres membres de la communauté interviendront.

Je vais y réfléchir plus profondément et me réengager lorsque viendra le temps de mettre en œuvre le Mail Helper mis à jour.

Merci encore pour votre soutien et pour l'ajout du lien vers nos documents!

Il s'agit de séparer les préoccupations. Vous pourriez inclure un assistant / wrapper pour un envoi facile dans la bibliothèque principale, mais à mon avis, cela mélange deux préoccupations distinctes au détriment probable ou complication inutile des deux. Les séparer permettra aux consommateurs de choisir la bibliothèque dont ils ont besoin (ou les deux), et faciliterait probablement le développement des deux bibliothèques en raison des limites clairement définies.

Je pense que c'est la nature des modules Node et npm d'avoir autant de séparation des préoccupations que possible, et de faire en sorte que chaque paquet fasse une tâche spécifique (et y soit bon!). C'est quelque chose auquel j'ai dû m'habituer aussi quand j'ai commencé avec Node, mais une fois que je l'ai fait, j'ai aimé la liberté et la capacité de développer des packages propres et simples qu'il offre.

Au plaisir d'entendre quelques commentaires de la communauté.

Eh bien, vous êtes définitivement convaincant avec un argument solide :)

J'apprécie vraiment que vous preniez le temps d'élaborer.

J'avais déjà hâte de revenir travailler sur cette bibliothèque et maintenant vous m'excitez vraiment de recommencer à travailler sur ce SDK avec vous et la communauté.

Super, faites-moi savoir quand vous allez y travailler :)
Je suis en congé pendant 4 semaines, ce qui veut dire que j'aurai enfin du temps libre pour travailler sur des projets open source également

@adamreisnz ,

Félicitations!

Un "package de messagerie" de niveau beaucoup plus élevé est exactement ce que nous souhaitons. Il suffit d'envoyer des e-mails.

Avec la dernière version, c'était très simple, et maintenant c'est un gâchis impie. L'exemple "Basic" a actuellement 8 vars définis , nécessitant des constructeurs spéciaux. Grand pas en arrière en termes de facilité d'utilisation.

Devrait être aussi simple que

sendgrid.send({
  from: fromEmail,
  fromName: fromName,
  to: toEmail,
  subject: 'Hello'
  ...
})
.then(...)
.catch(...)
.finally(...)

Aucun document n'est nécessaire, juste un exemple que nous pouvons copier-coller et sur notre chemin. C'est la principale valeur de SendGrid pour notre équipe et, malheureusement, elle est maintenant absente.

@adamreisnz Ça a l'air génial; décisions de conception très évidentes. J'espère que vous êtes sur la liste de paie SendGrid!

@thinkingserious s'il vous plaît envisager sérieusement de pointer la documentation principale vers le projet @adamreisnz , car cela simplifie tout de manière significative, et si je l'avais su plus tôt dans la

Aussi, juste pour noter que je ne serais pas surpris si d'autres développeurs commencent à se retrouver ici plus fréquemment maintenant que l'API V2 a été supprimée et que les nouveaux comptes seront obligés d'utiliser l'API V3. Personnellement, la première chose que j'ai essayée a été d'utiliser nodemailer (dont le transport sendgrid fonctionne toujours avec la v2), ce qui a eu du sens pour des dizaines de projets dans le passé, mais a mis une éternité à fonctionner cette fois-ci. Si je devais deviner compte tenu de la popularité de nodemailer dans la communauté des nœuds, je ne serai pas le seul à ressentir cela dans les mois à venir.

@ fisch0920 merci pour vos commentaires, je travaillerai avec @thinkingserious dans les semaines à venir pour améliorer l'API Sendgrid. J'espère que nous proposerons quelque chose de facile à utiliser mais toujours suffisamment flexible en cas de besoin.

Bonjour tout le monde,

Je pensais que vous pourriez être intéressé par la refonte de SendGrid Node.js Mail Helper: https://github.com/sendgrid/sendgrid-nodejs/pull/378

Vos commentaires seraient grandement appréciés!

Meilleures salutations,

Elmer

Veuillez passer au # 378 pour les mises à jour, merci!

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

Questions connexes

amlcodes picture amlcodes  ·  4Commentaires

nicoasp picture nicoasp  ·  3Commentaires

murphman300 picture murphman300  ·  4Commentaires

wooyah picture wooyah  ·  4Commentaires

TobiahRex picture TobiahRex  ·  3Commentaires