Sendgrid-nodejs: Error inesperado al intentar enviar un correo electrónico transaccional

Creado en 31 ago. 2017  ·  23Comentarios  ·  Fuente: sendgrid/sendgrid-nodejs

Resumen de asuntos

Obteniendo un error de "Solicitud incorrecta" con la siguiente carga útil.

Solicitud

cosnt msg = {
        "to": "[email protected]",
        "from": "[email protected]",
        "subject": "Support Pay Transparency at PayCheck",
        "templateId": "24ae3147-4faa-4380-8613-c5be144f4542",
        "customArgs": {
            "ally_id": "cj6zlh7yd000001qir4r5suuk"
        }
};
sgMail.send(msg)

Respuesta

{
        "message": "Bad Request",
        "code": 400,
        "response": {
            "headers": {
                "server": "nginx",
                "date": "Wed, 30 Aug 2017 22:30:41 GMT",
                "content-type": "application/json",
                "content-length": "365",
                "connection": "close",
                "access-control-allow-origin": "https://sendgrid.api-docs.io",
                "access-control-allow-methods": "POST",
                "access-control-allow-headers": "Authorization, Content-Type, On-behalf-of, x-sg-elas-acl",
                "access-control-max-age": "600",
                "x-no-cors-reason": "https://sendgrid.com/docs/Classroom/Basics/API/cors.html"
            },
            "body": {
                "errors": [
                    {
                        "message": "Unless a valid template_id is provided, the content parameter is required. There must be at least one defined content block. We typically suggest both text/plain and text/html blocks are included, but only one block is required.",
                        "field": "content",
                        "help": "http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.content"
                    }
                ]
            }
        }
    }

Notas

En la documentación dice templateId pero en el mensaje de error dice template_id . Probé ambos y recibí el mismo mensaje de error. Adjunté una captura de pantalla de la pantalla de mi plantilla como una verificación de cordura para asegurarme de que la tengo configurada correctamente en sendgrid.

Detalles técnicos:

  • sendgrid-nodejs Versión: master (última confirmación: [número de confirmación])
  • Versión de Node.js: 6.10.3
  • Ejecución en una función de AWS Lambda

screen shot 2017-08-30 at 6 43 57 pm

help wanted bug

Comentario más útil

Gracias por la ayuda, píos. Literalmente estaba perdiendo la cabeza. Finalmente descubrí una solución a última hora de la noche anterior y venía aquí para informar más información, pero parece que todos ustedes ya lo están :-)

Todos 23 comentarios

@onesien, la nueva API de correo independiente de las templateId o template_id . Camel case es más común en JS land, por lo tanto, hemos agregado soporte para eso, mientras que la API en sí consume snake case.

Echaré un vistazo para ver qué sucede con el ID de la plantilla.

Hola @onesien ,

También es posible que desee consultar con el soporte . Creo que el problema puede estar relacionado con el antiguo editor de plantillas.

¿También puedes intentar hacer una nueva plantilla y usar esa identificación?

Con los mejores deseos,

Elmer

@thinkingserious, ¿puedes comprobar esto por tu cuenta? Parece que estamos enviando correctamente el parámetro template_id con la solicitud. Acabo de crear una nueva plantilla y también tengo este problema.

@adamreisnz ,

Mis pruebas locales están funcionando, pero solo tengo nuevas plantillas en nuestra cuenta.

Voy a comprobar

No, utilicé una plantilla nueva, recién creada, obteniendo el mismo problema

Lo siguiente funciona para mí (usando la versión v6.1.1) siguiendo el ejemplo aquí :

// Setup sendgrid api
const sendGridMail = require('@sendGrid/mail');
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);
sendGridMail.setSubstitutionWrappers('-', '-');

//build object 
var mailOptions = {
    personalizations:[{
      to: '[email protected]',
      substitutions: {'name':'John', 'city':'Denver'}
    }],
    from: '[email protected]',
    reply_to: '[email protected]',
    subject: 'Hello',
    html: 'email text goes here',
    templateId: '13b8f94f-bcae-4ec6-b752-70d6cb59f932'
  };

//send 
sendGridMail.send(mailOptions);

Ah, creo que tenemos un viejo error resurgiendo, donde la API requiere un bloque de contenido en todos los casos. Entonces esto funciona:

// Setup sendgrid api
const sendGridMail = require('@sendGrid/mail');
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);
sendGridMail.setSubstitutionWrappers('-', '-');

//build object 
var mailOptions = {
    to: '[email protected]',
    from: '[email protected]',
    reply_to: '[email protected]',
    subject: 'Hello',
    templateId: '13b8f94f-bcae-4ec6-b752-70d6cb59f932',
    html: ' ',
    substitutions: {
      name: 'Some One',
      city: 'Denver',
    }
  };

//send 
sendGridMail.send(mailOptions);

pero no esto:

// Setup sendgrid api
const sendGridMail = require('@sendGrid/mail');
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);
sendGridMail.setSubstitutionWrappers('-', '-');

//build object 
var mailOptions = {
    to: '[email protected]',
    from: '[email protected]',
    reply_to: '[email protected]',
    subject: 'Hello',
    templateId: '13b8f94f-bcae-4ec6-b752-70d6cb59f932',
    substitutions: {
      name: 'Some One',
      city: 'Denver',
    }
  };

//send 
sendGridMail.send(mailOptions);

Comprobando internamente ...

Tuve que agregar el bloque de contenido para que se enviara la plantilla. Recibí un _Bad Request (400) "A menos que se proporcione un template_id válido, el parámetro de contenido es obligatorio. Debe haber al menos un bloque de contenido definido ..." _ mientras se usa la plantilla creada en el nuevo editor html.

sgMail.setApiKey(sgKey);
sgMail.setSubstitutionWrappers('-', '-');
var msg: any = {
  to: email,
  from: '[email protected]',
  templateId: 'xxxxxxx',
  substitutions: {
     verifyUrl: createAccountLink
  }
};
sgMail.send(msg)

Si agrego el bloque de contenido, la plantilla de correo electrónico se envía con el formato del editor html.

sgMail.setApiKey(sgKey);
sgMail.setSubstitutionWrappers('-', '-');
var msg: any = {
  to: email,
  from: '[email protected]',
  content: [{"type":"text/html","value":"0"}],
  templateId: 'xxxxxx',
  substitutions: {
     verifyUrl: createAccountLink
  }
};
sgMail.send(msg)

Bien, dejo esto abierto como un error.

Supongo que este SDK está agregando un objeto de contenido vacío cuando no está configurado. Creo que debemos omitir estas funciones cuando html y txt no están configurados.

Por ahora, la solución alternativa anterior hará lo que necesite.

@thinkingserious Creo que tienes razón. Leí los documentos de la API y pensé que el campo era obligatorio. Solo tiene un comentario bien escondido (¡que tiene un estilo increíble!) Que me perdí:

image

¡Crearé un PR para abordar esto!

Jeje, gracias Adam!

PR está activo, esto debería solucionar el problema y no enviar el campo de contenido con la solicitud si no se proporciona contenido.

Gracias por la ayuda, píos. Literalmente estaba perdiendo la cabeza. Finalmente descubrí una solución a última hora de la noche anterior y venía aquí para informar más información, pero parece que todos ustedes ya lo están :-)

Lo siento @onesien ,

La solución se acaba de enviar a npm (v6.1.2).

Usé el código textualmente de la respuesta de tengo problemas.

Solo estoy tratando de obtener las sustituciones más básicas en una plantilla que creé en sengrid para que me envíen. La respuesta en CloudWatch (ya que se está ejecutando en Lambda) se muestra como 202 pero el correo electrónico que recibo es: A message was received from this address by our systems that had errors in the smtpapi header, and cannot be processed. The error detected was: The template id must be a valid template id for your account.

¿Qué estoy haciendo mal aquí chicos? Estoy tratando de examinar los documentos de sendgrid, pero todo parece muy poco sistemático.

¿Cómo envía el ID de la plantilla? ¿Es a través de una variable ambiental cuando se llama a la lambda?

gracias por la respuesta rápida @cbilliau ; no, en mi caso, la cadena de la plantilla está codificada, ya que solo estoy tratando de obtener el andamio funcional entre el frente y la parte posterior. Mi ejemplo textualmente es:

const sgMail = require("@sendgrid/mail");
sgMail.setApiKey(
  "XXXXX"
);
sgMail.setSubstitutionWrappers("%", "%"); // Configure the substitution tag wrappers globally
  const msg = {
    to: formFields.toEmail,
    from: formFields.fromEmail,
    subject: "Hello world",
    text: "test",
    html: "<p>test</p>",
    templateId: "be2cc0da-5b2c-428f-8e45-c140f6cfb6eb",
    substitutions: {
      name1: formFields.fromName,
      name2: formFields.fromName,
      date: formFields.date
    }
  };

  sgMail.send(msg);

@tetreault Verifique mi respuesta anterior, agrego content: [{"type":"text/html","value":"0"}], a mi función y funcionó. Desconocido por qué.

solo lo probé, desafortunadamente no cambió el resultado final @cbilliau :(. Recibí el mismo correo electrónico:

A message was received from this address by our systems that had errors in the smtpapi header, and cannot be processed. 
The error detected was: The template id must be a valid template id for your account. You provided be2cc0da-5b2c-428f-8e45-c140f6cfb6eb 

wow déjame despedirme por un segundo

Palma de la cara total, fijando en mi extremo y luego esperando que funcione.

kk - confirmando que funciona ahora, especialmente usando la línea content: [{ type: "text/html", value: "0" }] que @cbilliau mencionó 👍

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