Sendgrid-nodejs: Ejemplo fácil de entender

Creado en 28 jun. 2016  ·  75Comentarios  ·  Fuente: sendgrid/sendgrid-nodejs

Hola,

Sería genial proporcionar un ejemplo fácil de entender en su archivo Léame, algo tan simple como https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/ por ejemplo, porque tbh si quisiera escribir 30 líneas de código javascript para enviar un correo electrónico simple que no estaría usando sendgrid.

Su biblioteca es bastante frustrante de usar, incluso para un desarrollador experimentado.

Salud,
y perdón por esta perorata enojada

ps: este ejemplo es exactamente lo que estoy buscando https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html , tan fácil de usar

help wanted community enhancement

Comentario más útil

@thinkingserious Finalmente llegué a entender lo que me molesta tanto de todas las clases de ayuda de Sendgrid introducidas en la v3 ... hay demasiadas y hacen que el envío de correos electrónicos sea innecesariamente complicado: P

No quería revisar todo el código de Sendgrid, así que decidí hacer un contenedor simple en su lugar, sendgrid-mailer .

Si bien las clases de ayuda de Sendgrid son útiles detrás de escena, para crear y validar modelos de correo electrónico, no creo que debamos obligarnos a interactuar con la API. Encuentro que escribir aplicaciones de Node es más complicado de lo que debería ser, y el nombre de los ayudantes puede ser bastante confuso, por ejemplo, Mail vs Email .

Creo que el ejemplo básico ilustra bien el problema:

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

Esto parece demasiado complicado para algo tan básico como "Quiero enviar un correo electrónico". Requiere que cargue 8 dependencias diferentes y escriba 15 líneas de código antes de poder enviar un correo electrónico.

Sin embargo, podría decirse que no usar las clases auxiliares es incluso peor, ya que entonces debe conocer la estructura requerida de la solicitud JSON de correo electrónico y completarla correctamente usted mismo. Un error romperá la solicitud fácilmente.

Así que resumí toda la lógica de las clases auxiliares detrás de una API auxiliar simple y fácil de usar, de modo que enviar correos electrónicos con Sendgrid se vuelve fácil y divertido de nuevo :)

El ejemplo más básico se convierte en:

//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 solicitud se construye detrás de escena y utiliza los ayudantes de Sendgrid de forma transparente.

También admite el envío de varios correos electrónicos, expone el objeto Sendgrid en caso de que sea necesaria una mayor personalización, también acepta instancias Sendgrid Mail y acepta una amplia variedad de formatos para los campos hacia / desde, por ejemplo, Name <[email protected]> o un objeto con propiedades de nombre / correo electrónico. Consulte el archivo README para obtener más detalles.

Probablemente todavía hay margen de mejora, pero quería compartir esta solución aquí para las personas que buscan usar la API de Sendgrid sin sentirse abrumadas por ella.

Espero que sea útil para alguien, y tal vez pueda proporcionar alguna dirección para el futuro de esta biblioteca, al exponer una API más simple :)

cc @julesbou un poco tarde, pero espero que todavía puedas encontrarle un uso.

Todos 75 comentarios

Hola @julesbou ,

Las diatribas enojadas están bien para mí, especialmente si tienen soluciones adjuntas :)

Gracias por tomarse el tiempo para informarnos.

Actualmente estamos planificando las mejoras para la próxima iteración, ¡así que tuvo un buen momento!

Si tiene alguna otra solicitud en particular, háganoslo saber en este hilo o abra problemas adicionales.

¡Gracias!

¿Cómo usamos la clase de ayuda? ¿Todo lo que quiero hacer es establecer el nombre del remitente?

@jsgandalf ,

La forma más fácil es: https://github.com/sendgrid/sendgrid-nodejs#hello -email, específicamente: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail/example. js # L4

También puede crear su propio json de la siguiente manera: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js#L31 (aquí hay una descripción general del json: https: / /sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html)

¡Gracias!

¡Muy útil! ¡Esto debería estar en el archivo Léame!

@jsgandalf @thinkingserious Yo también encuentro la biblioteca bastante frustrante de usar. Estoy intentando enviar una plantilla de correo electrónico. Encontré los ejemplos aquí no muy útiles. Estoy confundido acerca de cómo configurar las direcciones de correo electrónico "para" y "de", y este código ni siquiera envía mi correo electrónico. Me he estado rascando la cabeza durante los últimos tres días. ¿Alguna ayuda?

Gracias por los comentarios @bcootner. Su solicitud ayuda a solucionar este problema en la cola. Este es un tema que estoy deseando terminar.

Mientras tanto, espero que este ejemplo ayude:

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

Comuníquese con nosotros si necesita ayuda adicional.

@thinkingserious Gracias por su tiempo y respuesta reflexiva. Tengo el siguiente código:

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

Y luego llamo a este código con sendMail(welcomeTemplate()) pero eso no funciona. La "plantilla" y "enviar" aparecen en los registros, pero el código de estado, el cuerpo o los encabezados no aparecen, no se reciben correos electrónicos y no aparece nada en mi panel.

Después de requestPost.body = requestBody podría hacer console.log(JSON.stringify(requestBody)) y decirme lo que obtiene?

@thinkingserious Después de algunas depuraciones, parece que no se imprime nada en el registro después de la línea var emptyRequest = require('sendgrid-rest').request . Primero se registra la "plantilla", luego unos 5 minutos más tarde se imprime "enviar" (y si quito el comentario de las líneas que comentó en la función de envío, estas funcionan bien). ¿Hay algo que me falta en esta declaración obligatoria? Acabo de hacer npm install sendgrid

Por favor intente esto:

A. Cree un archivo llamado post.json con la siguiente carga útil:

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

B. Reemplazar los correos electrónicos de ejemplo

C. Ejecute el siguiente comando:

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. Reemplace $ SENDGRID_API_KEY con su API KEY o agregue su API Key a una variable de entorno llamada SENDGRID_API_KEY

@thinkingserious Recibí ese correo electrónico de prueba, también pude hacer que Hello Test funcionara bien, es solo que estas plantillas no quieren funcionar.

EDITAR: Entonces reemplacé var emptyRequest = require('sendgrid-rest').request con var emptyRequest = sg.emptyRequest() y eso envía el correo electrónico, simplemente no hay ningún formato del diseño de la plantilla ni de ninguna imagen.

@bcootner ,

Desafortunadamente, no puedo reproducir su error, por lo que estoy tratando de ayudarlo a identificar dónde podría haber un problema. Dado que puede enviar un correo electrónico a través de curl, eso significa que su clave API es buena. ¿Quizás el ID de plantilla tiene algún problema?

Si elimina mail.setTemplateId("5a****-*******-******-9") ¿se envía el correo electrónico?

@thinkingserious Entonces, si elimino el setTemplateID, envía la prueba "Hola mundo de la biblioteca SendGrid Node.js".

No estoy seguro si vio mi edición, pero al reemplazar var emptyRequest = require('sendgrid-rest').request con var emptyRequest = sg.emptyRequest() el texto de mi plantilla se envía, pero no hay formato (sin fuentes, sin imágenes). Ahora obtengo la siguiente impresión desde la consola.

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

Algo me hace pensar que es un problema con 'texto / sin formato', pero no estoy seguro. ¡Gracias de nuevo!

Hola @bcootner , acabo de experimentar el mismo problema y me he estado rascando la cabeza durante algunas horas, pero logré resolverlo. Parece que se necesitan demasiadas cosas innecesarias antes de poder enviar el correo electrónico, pero aquí está mi función de ayuda para hacer eso:

_Params_

  • de (por ejemplo, '[email protected]')
  • a (por ejemplo, '[email protected]')
  • sujeto (por ejemplo, 'sujeto de prueba')
  • mensaje (por ejemplo, 'mensaje de prueba')
  • plantilla (ID de plantilla que desea utilizar)
  • templateVariables (objeto, donde clave - variable en el correo electrónico, valor - valor para reemplazarlo) { ":name": "someName", ":email": "someEmail" } . Tenga en cuenta que :email y :name es como configuré mis variables en la plantilla de correo electrónico, puede ser -email- o lo que tenga
  • devolución de llamada de éxito
  • devolución de llamada de error
    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);
            }
        });
    }

De hecho, la documentación necesita una refactorización, con ejemplos básicos y simples. Espero que mi función te ayude :)

@ByEmke ¡ gracias por tu apoyo! ¿Podría enviarnos un correo electrónico a [email protected] con el tamaño de su camiseta y la dirección postal?

Con respecto a la documentación, un refactor está en camino, así como también para el asistente de correo. Hemos estado recopilando todos sus comentarios y estamos entusiasmados con la próxima versión.

Además, una gran confusión es que aún necesita configurar el contenido cuando usa la plantilla. Afortunadamente, eso cambiará muy pronto (días).

@bcootner Creo que lo content_html = new helper.Content("text/html", message) . Afortunadamente, este requisito desaparecerá en unos días, nuestro equipo está cambiando este comportamiento actualmente para que cuando especifique una plantilla, ya no tendrá que configurar el contenido.

@ByEmke @thinkingserious gracias por su ayuda en este tema, logré hacerlo funcionar con el siguiente código anoche:

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

¡Gracias de nuevo!

También creo que los documentos son bastante difíciles de seguir, especialmente cuando se usan plantillas y algunas otras funciones.

Prefiero la sintaxis request.body = {} sobre la sintaxis helper () ya que esto hace que las cosas sean más detalladas y menos fáciles de leer (al menos para mí).

Pasé bastante tiempo revisando los documentos, probando cambios, mirando sus ejemplos e intentando nuevamente solo para venir aquí y descubrir que _de_ necesita configurar el contenido cuando usa plantillas, aunque los documentos dicen lo contrario. Argh. Cosas como esta pueden volverte loco. De todos modos felicitaciones a @ByEmke por proporcionar un ejemplo de trabajo.

@peterkuiper (o debería decir Adam :))

Gracias por los comentarios, estamos muy interesados ​​en cómo podemos mejorar los documentos de la biblioteca.

Para ser claros, ¿te refieres a estos? https://github.com/sendgrid/sendgrid-nodejs/blob/master/USAGE.md

Con respecto al problema del contenido (los escuchamos a todos :)), esto está casi solucionado. Implementaremos una versión de la API que no requerirá que se configure el contenido cuando se usa una plantilla. Esperamos que el cambio mejore mucho la experiencia de la plantilla.

@thinkingserious Estaba revisando los documentos en sendgrid.com (es decir, https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html) mientras debería haber ido directamente a Github. Hojeé el archivo README de este repositorio, revisé los ejemplos y me perdí USAGE.md (mi error). El archivo USAGE.md debería ser el que debería colocarse en sendgrid.com ya que tiene mi formato preferido :) Todavía no estoy seguro acerca de algunas de las mejores prácticas al usar plantillas, pero espero poder averiguarlo yo mismo o encontrarlo en el docs.

Estaba navegando por ese archivo y encontré un ejemplo aleatorio de algo que me resulta confuso:

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

¿Qué tipos son start_time, limit, end_time y offset y qué significan? ¿Hay más queryParams? ¿Y por qué no es request.body?

Hay un enlace a la Guía del usuario (que no ayuda en absoluto), mientras que debería haber un enlace a los documentos API que aclara las cosas https://sendgrid.com/docs/API_Reference/Web_API_v3/blocks.html.

Por lo tanto, debe ir y venir tratando de averiguar dónde encontrar la información que necesita.

¡Excelente respuesta @peterkuiper!

También me gustaría exaltarte. Envíenos la talla de su camiseta y la dirección postal a [email protected].

Actualizaremos los documentos de USAGE.md para incluir descripciones de los cuerpos de consulta y respuesta.

En cuanto a las plantillas, el plan es crear un ayudante como lo hicimos para el punto final de correo, completo con ejemplos de casos de uso comunes. Además, viene una solución en la que no tendrá que especificar el contenido al usar plantillas. Esa es una gran fuente de confusión.

@thinkingserious genial, gracias :) correo electrónico enviado!

Mientras estoy en eso, noté algo más que también se refiere a las mejores prácticas (y está causando cierta confusión en mi equipo). Uno de mis compañeros de equipo creó plantillas para algunas funciones (es decir, verificar el correo electrónico) y agregó verify-nl, verify-en, etc. Así que cada plantilla era básicamente la misma con la única diferencia del texto (idioma diferente). He visto <% subject%> en <% body%> y no pude encontrar ninguna referencia a él (TL; DR de mi parte tal vez), así que supongo que es una sustitución interna de su parte que sucede cuando usa la API.

Tengo curiosidad por saber cuál podría ser una práctica "normal":

  • Cree una plantilla para cada función en un idioma diferente y solo haga algunas sustituciones menores (es decir, nombre)

Parece que usar este enfoque podría causar mucho trabajo cuando cambia partes de su plantilla. No estoy seguro de si podrá crear "plantillas de plantilla" (es decir, encabezado / pie de página / cualquier parte). Además, el límite de 300 plantillas se puede alcanzar fácilmente cuando tiene muchos idiomas diferentes (esto no es un problema en nuestro caso).

  • Cree una plantilla para cada función y use <% body%> para configurar el cuerpo de su aplicación y solo tenga una plantilla "maestra" (o use su subetiqueta on)

Espero que la pregunta tenga sentido :)

@peterkuiper ,

No lo sé, pero he sacado algunas sondas. Responderé con lo que descubra. ¡Gracias!

@thinkingserious Terminé usando la versión 2.0.0 que realmente me gusta cómo funciona:

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

Estoy buscando ver cómo se vería esto en la versión 3.x.x . Encuentro los ejemplos actuales realmente confusos.

¡Excelentes comentarios @IonicaBizau!

Definitivamente estaremos considerando sus pensamientos para la próxima iteración.

@thinkingserious ¡Genial! Aún así, me gustaría saber cómo se vería esto en 3.x.x .

No hay mapeo uno a uno, ya que este cliente se volvió a crear desde cero para desacoplarlo del punto final de correo v2 y permitir el acceso a los puntos finales v3.

Dicho esto, el propósito del asistente de correo es llegar a un punto en el que la llamada sea tan fácil como lo fue con la versión 2. Simplemente no estamos allí todavía, volvemos al principio y esperamos muchas más iteraciones.

@thinkingserious Lo vi, pero no me gustan los siguientes puntos:

  1. Es confuso porque hay variables globales (declaradas sin var o let o una palabra clave similar). Por ejemplo: from_email = new helper.Email("[email protected]") lugar de var from_email = ...
  2. Usar new helper.Email solo para un recurso de correo electrónico es muy poco amigable. Esto se puede envolver probablemente en una funcionalidad de nivel inferior dentro del módulo. Lo mismo para Content , Mail etc.
  3. Configurar manualmente method , path y body vuelve a ser bastante hostil.
  4. La función de devolución de llamada debe estar en formato err, data, ... (en lugar de respuesta).

En resumen, en mi humilde opinión, el _quick start_ es una implementación de bajo nivel para enviar un correo electrónico. Puede ser útil para funcionalidades más profundas, pero definitivamente no para un _ inicio rápido_. 😁


Muchas gracias por el increíble servicio y módulo. ✨

@IonicaBizau ,

Comentarios impresionantes, gracias!

Definitivamente nos referiremos a sus pensamientos mientras construimos la próxima iteración del asistente de correo.

Tiene razón, esta primera versión es una envoltura delgada sobre la API. El plan es mejorar gradualmente su funcionalidad en función de los comentarios de la comunidad, ¡como lo que has hecho!

Por su apoyo y contribución a la comunidad, nos gustaría enviarle un botín. Envíenos un correo electrónico a [email protected] con la

No dude en agregar comentarios adicionales como mejor le parezca. ¡Gracias de nuevo!

@IonicaBizau

También puedes hacer algo como esto:

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

Prefiero esta sintaxis a la sintaxis de ayuda. Eche un vistazo a los ejemplos, me ayudaron bastante.

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

HTH

@thinkingserious ¡Wowowow! Definitivamente lo haré. Gracias, ¡encantado de ayudar! 😁

@peterkuiper También lo intenté, pero creo que cometí el error de reemplazar text/html con html y el contenido apareció como archivo adjunto. Entonces decidí degradar la versión.

Pero, de nuevo, esto todavía se ve de bajo nivel ( request.method = ... , enviando el tipo MIME en el content matriz, response argumento en la devolución de llamada, etc.).

¡Gracias @peterkuiper!

Agregué ese estilo de ejemplo al README la semana pasada :)

@IonicaBizau ,

Sí, esas cosas de bajo nivel se ocultarán pronto.

@thinkingserious me alegra saber que la solicitud se ocultará pronto 👍

Siguiendo las excelentes sugerencias de @IonicaBizau , otra recomendación sería ocultar los detalles de implementación de las "personalizaciones", si es posible. Por ejemplo, hacer algo como:

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

Simplemente parece innecesario exponer este nivel de detalle a través del SDK.

Además, no estoy seguro si esto ya es una función, pero sería genial poder encadenar estas llamadas:

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

Gracias y sigan con el buen trabajo 👍

@jamesdixon ,

¡Gracias por los comentarios adicionales!

Hasta que consigamos mejorar el asistente de correo para permitir un mayor ocultamiento de la implementación, consulte la increíble solicitud de extracción de @adambuczynski : https://github.com/sendgrid/sendgrid-nodejs/pull/261. No aborda directamente su idea específica, pero es un paso en la dirección correcta.

@thinkingserious , mencionaste que las solicitudes de bajo nivel se sendgrid-rest para eso. De esa manera, todo lo que tiene que hacer esta biblioteca es permitirle enviar correo electrónico y, como tal, solo exponer la API de envío de correo electrónico.

Eso fue lo que separó las preocupaciones y redujo un poco el enfoque de este paquete, permitiendo una API más limpia con encadenamiento, etc., como sugirió

@adambuczynski ,

Nuestro plan es ejecutar la capa de abstracción a través de los ayudantes. Mail es el primero, pero en un futuro cercano planeamos agregar uno para la administración de subusuarios y las plantillas. Pero primero tenemos que pulir el ayudante de correo y convertirlo en el estándar.

Tiene razón, esta biblioteca es solo una capa muy delgada sobre sendgrid-rest y simplemente agrega ejemplos, un archivo de USO y pruebas unitarias (todas están automatizadas [también esperamos abrir este código] usando nuestra definición de Swagger ). A largo plazo, prevemos la implementación de código auxiliar para todos los puntos finales, con validación de datos en ambos sentidos, con el núcleo de esa funcionalidad también automatizado. Los flujos de trabajo y los casos de uso se crearán a mano.

Durante las próximas semanas / meses, expondremos la hoja de ruta aquí en GitHub para obtener más comentarios.

Además, para fines de agosto agregaremos soporte para el webhook de Parse entrante a esta biblioteca.

Gracias por hacer esta pregunta y espero que mi respuesta genere más comentarios de usted y de la comunidad. Queremos que esta sea una biblioteca impulsada por la comunidad, respaldada y dirigida por SendGrid.

Gracias por la actualización @thinkingserious. Estaré feliz de desempeñar un papel en la biblioteca de sendgrid nodejs en el futuro.

¿Por qué está agregando compatibilidad con Parse en esta etapa? Pensé que el servicio Parse se retiraría el próximo enero.

@thinkingserious Olvidé mencionar que si hay algo en lo que pueda ayudar aquí, solo envíeme un mensaje. Estaría feliz de hackear las cosas si puedo. :sonreír:

@adambuczynski ¡ eso es una gran noticia! Además, su solicitud de extracción se está acercando a la parte superior. Creo que podré fusionarlo a principios de la semana que viene.

Con respecto a Parse, todavía no hemos decidido retirarlo oficialmente. Agregar soporte en las bibliotecas es parte de nuestra prueba para determinar si lo mantendremos en funcionamiento o no.

@IonicaBizau ,

¡Gracias! ¡Su apoyo es muy apreciado!

¿Hay alguna forma de configurar varios destinatarios mediante el asistente de correo?
Me doy cuenta de que helper.Mail(from_email, subject, to_email, content) usa personalization.addTo para configurar el destinatario ... Creo que esto solo funciona con 1 destinatario, no con un conjunto de destinatarios (tal vez me equivoque) y el ayudante no proporciona un setTo función (forma ideal de configurar los tos).

Veo que si estuviera configurando la personalización yo mismo con let personalization = new helper.Personalization(); podría hacer personalization.tos = [email, email]//email=new helper.Email(email_address, name) es seguro? ¿Es probable que cambie en futuras versiones?

@ albert-the-creator lo uso de la siguiente manera:

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

Creo que puede agregar varios destinatarios repitiendo la línea recipients.addTo , por ejemplo, en un bucle.

Encuentro este enfoque bastante detallado, con la división en clases de correo electrónico y personalización. A veces, solo desea agregar una dirección de correo electrónico y enviarla, y parece que necesita muchas líneas de código para lograrlo.

@ albert-el-creador,

Ese constructor se hizo para ayudar a las personas a enviar un solo correo electrónico más fácilmente, básicamente es una función de "hola correo electrónico".

Para varios correos electrónicos, probablemente desee seguir este ejemplo (ya que ya ha comenzado por este camino configurando la personalización usted mismo): https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail /example.js#L15

También puede ser útil leer sobre personalizaciones: https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html

El ayudante definitivamente evolucionará, pero cualquier cambio importante se indicará con un importante lanzamiento de puntos. Sin embargo, no espero que la API cambie mucho.

@adambuczynski ,

¡Gracias por colaborar! Necesitamos actualizar el asistente para tener en cuenta casos de uso comunes adicionales como este y enviar correos electrónicos con plantillas, por ejemplo.

@thinkingserious, la API de ayudantes era algo en lo que también estoy interesado en posiblemente refactorizar / mejorar cuando tenga tiempo nuevamente :)

@adambuczynski ,

Eso es increíble, cuando decida comenzar con eso, por favor envíeme un ping. O si empezamos antes que usted, le haré ping.

Usé el código de

@otmezger ,

¡Gracias por el seguimiento!

Estoy trabajando en ese ejemplo esta semana, lo encontrará vinculado en el archivo README.

No uso el asistente de plantilla, pero compartiré mi enfoque para cargar tanto HTML como plantillas de formato de texto y parciales a través de un método de ayuda 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)));
  },

Esto se puede usar de la siguiente manera para obtener un objeto listo para usar con 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,
    }));

Podrías adaptar fácilmente el ejemplo para usar algo como plantillas de manubrios también. En el ejemplo anterior, replaceData helper es una función simple que reemplaza etiquetas similares a manillares con los datos proporcionados.

No estoy seguro de si esto es relevante o no, pero al NO usar el "ayudante de correo" me ahorré una cantidad de tiempo inconmensurable. Esto es después de sentirme tan frustrado que bajé a 2.0 a propósito. Solo estoy usando una función de tipo de fábrica para generar JSON V3 válido y ahora estoy muy emocionado con las mejoras en la API V3 (ya que puedo usarlas ahora).

Esto es algo con lo que también luché al principio. creo que el
Los ayudantes probablemente podrían hacerse más eficientes y más fáciles de usar. me gustaría
incluso argumentan que tal vez no deberían ser parte del módulo principal de sendgrid,
para separar preocupaciones y permitir que las personas opten por utilizarlas.

Les echaré otro vistazo y veré si puedo encontrar algo de concreto.
sugerencias.

El viernes 26 de agosto de 2016 a las 05:48, Sean Lindo [email protected] escribió:

No estoy seguro si esto por ejemplo o no, pero NO usando el "ayudante de correo"
Me ahorré una cantidad de tiempo inconmensurable. Esto es después de volverse tan
frustrado bajé la calificación a 2.0 a propósito.

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/252#issuecomment -242479491,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AAd8Qu5iRLFQwoKlRd2fP5oioT1uLqB6ks5qjdV2gaJpZM4JAiac
.

@seanlindo ,

Gracias por tomarse el tiempo para enviarnos sus comentarios.

Aquí hay un ejemplo del uso de esta biblioteca sin Mail Helper: https://github.com/sendgrid/sendgrid-nodejs#without -mail-helper-class

Mail Helper es una primera versión y dependemos de comentarios como los suyos para ayudarnos a mejorar la próxima versión. ¿Le importaría compartir los problemas específicos con los que se encontró para que podamos crear tickets para solucionarlos?

Además, estoy agregando su voto a nuestra tarea pendiente para mejorar el Asistente de correo y ayudarlo a subir en la cola. ¡Gracias!

@adambuczynski ,

Veo que tu genialidad continúa :)

Espero sus comentarios, ¡sé que será genial!

@julesbou ,

Hemos iniciado un archivo USE_CASES.md donde proporcionaremos ejemplos para casos de uso comunes. La primera fueron las plantillas de transacciones :)

Espero sus comentarios, ¡sé que será genial!

👻

@thinkingserious ¡Seguro! Dame un día más o menos y te daré un ejemplo concreto.

Este es uno de mis hilos favoritos aquí :)

Creo que sus comentarios serán fundamentales para la próxima iteración de esta biblioteca, que probablemente será un cambio importante. Si tiene un momento, ¿podría echar un vistazo a nuestra propuesta? https://github.com/sendgrid/sendgrid-nodejs/issues/290

¡Gracias!

@thinkingserious Finalmente llegué a entender lo que me molesta tanto de todas las clases de ayuda de Sendgrid introducidas en la v3 ... hay demasiadas y hacen que el envío de correos electrónicos sea innecesariamente complicado: P

No quería revisar todo el código de Sendgrid, así que decidí hacer un contenedor simple en su lugar, sendgrid-mailer .

Si bien las clases de ayuda de Sendgrid son útiles detrás de escena, para crear y validar modelos de correo electrónico, no creo que debamos obligarnos a interactuar con la API. Encuentro que escribir aplicaciones de Node es más complicado de lo que debería ser, y el nombre de los ayudantes puede ser bastante confuso, por ejemplo, Mail vs Email .

Creo que el ejemplo básico ilustra bien el problema:

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

Esto parece demasiado complicado para algo tan básico como "Quiero enviar un correo electrónico". Requiere que cargue 8 dependencias diferentes y escriba 15 líneas de código antes de poder enviar un correo electrónico.

Sin embargo, podría decirse que no usar las clases auxiliares es incluso peor, ya que entonces debe conocer la estructura requerida de la solicitud JSON de correo electrónico y completarla correctamente usted mismo. Un error romperá la solicitud fácilmente.

Así que resumí toda la lógica de las clases auxiliares detrás de una API auxiliar simple y fácil de usar, de modo que enviar correos electrónicos con Sendgrid se vuelve fácil y divertido de nuevo :)

El ejemplo más básico se convierte en:

//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 solicitud se construye detrás de escena y utiliza los ayudantes de Sendgrid de forma transparente.

También admite el envío de varios correos electrónicos, expone el objeto Sendgrid en caso de que sea necesaria una mayor personalización, también acepta instancias Sendgrid Mail y acepta una amplia variedad de formatos para los campos hacia / desde, por ejemplo, Name <[email protected]> o un objeto con propiedades de nombre / correo electrónico. Consulte el archivo README para obtener más detalles.

Probablemente todavía hay margen de mejora, pero quería compartir esta solución aquí para las personas que buscan usar la API de Sendgrid sin sentirse abrumadas por ella.

Espero que sea útil para alguien, y tal vez pueda proporcionar alguna dirección para el futuro de esta biblioteca, al exponer una API más simple :)

cc @julesbou un poco tarde, pero espero que todavía puedas encontrarle un uso.

@adamreisnz en serio, gracias.

Mi trabajo en segundo plano que envía correos electrónicos a través de sendgrid estaba usando v4.0.7, que ya era lo suficientemente complicado. Actualicé a la última versión y lamentablemente todo se rompió. Estaba tan frustrado con lo complejo que era enviar un correo electrónico que ni siquiera me molesté en actualizarlo.

Dicho todo esto, la simplicidad de esto es exactamente lo que estaba buscando. Lo intentaré durante el fin de semana.

¡Salud!

@jamesdixon Todavía estaba atascado en v3.xx y tampoco quería actualizar :)

Esperamos que le resulte útil. Hágame saber cómo funciona para usted y si falta algo crítico, ¡gracias!

@adamreisnz ,

Esto es IMPRESIONANTE y gracias por compartirlo con nuestra comunidad :)

tldr; nuestras clases de ayuda no han terminado y ya nos ganaste hasta donde nos dirigimos :)

Estamos totalmente de acuerdo con sus pensamientos y esta es la fase de la actualización de la biblioteca v3 en la que estamos trabajando actualmente en los 7 SDK. Consulte el proyecto Mail Helper Enhancement aquí para obtener más detalles sobre el proyecto Node.js.

Actualmente, estamos terminando la biblioteca de C #. Para obtener un ejemplo concreto de lo que planeamos para esta biblioteca Node.js, consulte esto . Esperamos publicarlo en unos días.

Entonces, tengo una propuesta:

¿Le importaría agregar su solución en Mail Helper aquí (similar a lo que hemos hecho en C #)? Creo que tu trabajo alcanzaría un mayor alcance en ese caso. Si no, no hay problema en absoluto. Dado que ha publicado su proyecto bajo la licencia del MIT, espero que nos perdone si tomamos prestado un poco de su buen trabajo;) Y, por supuesto, nos aseguraremos de que obtenga crédito por sus contribuciones.

Si decide mantener su trabajo por separado, ¿podría agregar un enlace aquí en la sección Bibliotecas comunitarias?

Gracias por su increíble apoyo continuo. ¡Tú Molas!

@thinkingserious me alegra saber que estás pensando en seguir el mismo camino. El ejemplo de C # se ve mejor, pero creo que todavía es algo complicado para una implementación de JS. Hacer clases de todo no es necesariamente siempre la mejor manera de hacerlo en JS.

En cuanto a su propuesta, dado que todavía estoy usando las clases auxiliares bajo el capó, no sé cuánto sería realmente útil para migrar a la biblioteca oficial. Probablemente estaría más inclinado a ayudar con una reescritura importante (por ejemplo, v5) y comenzar de nuevo, tomando los comentarios de los usuarios y la comunidad de Node y creando una API increíble que sea fácil de usar pero flexible si es necesario.

Pero si mientras tanto quieres tomar prestado algo del código de mi contenedor para usarlo en la biblioteca oficial, hazlo :) Agregaré el enlace a mi contenedor en esa página 🎉

De hecho, creo que podría ser una buena idea dividir el proyecto en dos paquetes, un nivel inferior que incluye la lógica de solicitud para interactuar con la API y un nivel superior solo para enviar correos electrónicos, similar al que he creado.

El paquete de nivel inferior podría usarse para personas que necesiten acceso completo a la API, mientras que el paquete de correo sería adecuado para personas que solo quieran enviar correos electrónicos. Y, por supuesto, bajo el capó, el correo usaría el paquete API.

@thinkingserious ¿qué piensas al respecto?

@adamreisnz ,

Gracias por los atentos comentarios, como siempre.

No estoy seguro de si necesitamos dividir el proyecto en este momento. Creo que podemos lograr resultados similares con el modelo de ayuda actual. Dicho esto, estoy abierto a explorar una nueva arquitectura en una versión futura y me encantaría tenerte a bordo para eso.

Es de esperar que otros miembros de la comunidad intervengan.

Pensaré más en esto y volveré a involucrarme cuando llegue el momento de implementar Mail Helper actualizado.

¡Gracias nuevamente por su apoyo y por agregar el enlace a nuestros documentos!

Es una cuestión de separar preocupaciones. Podría incluir un ayudante / envoltorio para facilitar el envío por correo dentro de la biblioteca principal, pero en mi opinión, eso es mezclar dos preocupaciones separadas con el probable detrimento o complicación innecesaria de ambas. Mantenerlos separados permitirá a los consumidores elegir la biblioteca que necesitan (o ambas), y probablemente facilitaría el desarrollo de ambas bibliotecas debido a los límites claramente definidos.

Creo que es la naturaleza de los módulos Node y npm tener tanta separación de preocupaciones como sea posible, y hacer que cada paquete realice una tarea específica (¡y sea bueno en eso!). Es algo a lo que también tuve que acostumbrarme cuando comencé con Node, pero una vez que lo hice, me gustó la libertad y la capacidad de desarrollar paquetes limpios y simples que proporciona.

Esperamos escuchar algunos comentarios de la comunidad.

Bueno, definitivamente eres persuasivo con un argumento sólido :)

Realmente aprecio que se haya tomado el tiempo para explicarlo.

Ya tenía muchas ganas de volver a trabajar en esta biblioteca y ahora me entusiasma

Genial, avísame cuando vas a trabajar en eso :)
Estoy de licencia por 4 semanas, por lo que finalmente tendré algo de tiempo libre para trabajar también en proyectos de código abierto

@adamreisnz ,

¡Felicidades!

Un "paquete de correo" de nivel mucho más alto es exactamente lo que querríamos. Solo necesito enviar algunos correos electrónicos.

Con la última versión era completamente simple, y ahora es un desastre impío. El ejemplo "básico" actualmente tiene 8 variables definidas , lo que requiere constructores especiales. Gran paso atrás en términos de facilidad de uso.

Debería ser tan simple como

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

Se necesitan cero documentos, solo un ejemplo que podemos copiar, pegar y en camino. Ese es el valor principal de SendGrid para nuestro equipo y, lamentablemente, ahora falta.

@adamreisnz Se ve genial; decisiones de diseño muy obvias. ¡Espero que esté en la nómina de SendGrid!

@thinkingserious, por favor, considere seriamente señalar los documentos principales al proyecto @adamreisnz , ya que simplifica todo significativamente, y si lo hubiera sabido hoy, me habría ahorrado horas de dolor de cabeza tratando de usar lo que en mi humilde opinión es un Java- api inspirada en JS. Por favor, dé a sus usuarios lo que quieren, no lo que usted cree que quieren :-)

Además, solo señalar que no me sorprendería si otros desarrolladores comenzaran a terminar aquí con más frecuencia ahora que la API V2 ha caducado y las nuevas cuentas se verán obligadas a usar la API V3. Personalmente, lo primero que probé fue usar nodemailer (cuyo transporte sendgrid todavía funciona con v2) que ha tenido sentido para docenas de proyectos en el pasado, pero que esta vez tardó una eternidad en funcionar. Si tuviera que adivinar dada la popularidad de nodemailer en la comunidad de nodos, no seré el único que termine sintiéndose así en los próximos meses.

@ fisch0920 gracias por sus comentarios. Trabajaré junto con @thinkingserious en las próximas semanas para mejorar la API de Sendgrid. Con suerte, encontraremos algo que sea fácil de usar pero lo suficientemente flexible cuando sea necesario.

Hola a todos,

Pensé que podría estar interesado en el rediseño de SendGrid Node.js Mail Helper: https://github.com/sendgrid/sendgrid-nodejs/pull/378

¡Tus comentarios serán muy apreciados!

Con los mejores deseos,

Elmer

Pase al n. ° 378 para obtener actualizaciones, ¡gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Loriot-n picture Loriot-n  ·  4Comentarios

danielflippance picture danielflippance  ·  4Comentarios

thinkingserious picture thinkingserious  ·  4Comentarios

umarhussain15 picture umarhussain15  ·  3Comentarios

thidasapankaja picture thidasapankaja  ·  4Comentarios