Sendgrid-nodejs: Las sustituciones no funcionan

Creado en 10 abr. 2018  ·  43Comentarios  ·  Fuente: sendgrid/sendgrid-nodejs

Resumen de asuntos

Siguió el ejemplo para usar sustituciones en correos electrónicos transaccionales , sin realizar ningún cambio. Las etiquetas de sustitución se eliminan, pero el texto no se inserta. Aquí hay una captura de pantalla del correo electrónico que recibo:

image

Pasos para reproducir

  1. Clonar https://github.com/panayi/test-sg/
  2. Copie el cuerpo de la
  3. Edite test.js para insertar su clave API, su dirección de correo electrónico y templateId que creó anteriormente.
  4. Ejecute node test.js .

Detalles técnicos:

unknown or a help wanted question

Comentario más útil

Hola, después de leer el comentario de @himanshupnt , probé con una plantilla heredada y funcionó. Gracias @himanshupnt .

Más tarde encontré la documentación de Sendgrid Mail Send con Dynamic Transactional Templates , tengo la nueva plantilla (no la heredada) funcionando. Usé la misma plantilla HTML y mi código se actualizó a:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Tenga en cuenta que reemplacé "sustituciones" con "datos_de_template_dinámico" y coloqué "a" dentro de "personalizaciones" como lo requieren los documentos. Y también traté el tema como uno de los "datos_template_dinámicos" y funciona. (ponga {{asunto}} en el campo de asunto de la plantilla)

Gracias.

Todos 43 comentarios

Hola @panayi ,

Algunas cosas para comprobar:

  1. Verifique que la ID de la plantilla sea correcta
  2. Verifique que la plantilla esté marcada como activa en la interfaz de usuario

¿También puedes compartir cómo se ve tu HTML?

¡Gracias!

Con los mejores deseos,

Elmer

Hola, @thinkingserious , pude reproducir el mismo problema que mencionó @panayi .
Mi código HTML se parece a esto

Hola first_name (empleado: employee_id)
Algún código HTML

Código

sgMail.setApiKey('apikey');
sgMail.setSubstitutionWrappers('{{', '}}'); // Triied sgMail.setSubstitutionWrappers('-', '-'); as well`

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: 'Hello HTML world!',
  templateId: 'template-id',
  substitutions: {
    first_name: 'Tejas',
    employee_id: 'emp123',
  },
};
sgMail.send(msg);

Nota: incluso he intentado usar substitutionWrappers: ['{{', '}}']
dentro de msg pero sin suerte.

Detalles técnicos:

Se agradece cualquier ayuda / solución ya que he invertido mucho tiempo en este problema

Hola @tjstlekr ,

En su código HTML, cambie first_name a {{first_name}} y employee_id a {{employee_id}} .

¡Gracias!

Con los mejores deseos,

Elmer

Hola @thinkingserious ,
Por código HTML, ¿te refieres al código de plantilla?
¿Por qué la etiqueta de sustitución funcionaría bien cuando se especifica dentro del cuerpo de la solicitud aquí , pero no cuando se utilizan los ejemplos predefinidos en la página ?
¡Gracias!

@tjstlekr , me refiero al código de plantilla como se describe en este ejemplo .

No puedo responder a su segunda pregunta sin ejemplos concretos. (por ejemplo, el cuerpo de la solicitud y el código de la plantilla).

Con los mejores deseos,

Elmer

¡Tristemente! No tengo acceso al código de la plantilla. Me quedo con otra versión.
Gracias de todos modos @thinkingserious

Has probado:

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

Sí, @thinkingserious lo intentó. También he probado las siguientes formas


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

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

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

@tjstlekr ,

Creo que su solución es conseguir que quien pueda cambiar el código de la plantilla HTML envuelva las variables con un carácter de sustitución.

Con los mejores deseos,

Elmer

@thinkingserious es correcto. Las variables de la plantilla DEBEN estar entre corchetes dobles {{nombre}}. De lo contrario, SendGrid no sabrá dónde colocar las sustituciones que ha enviado.

las variables realmente necesitan corchetes dobles? Seguiré adelante y lo intentaré, pero una publicación diferente de la misma persona mostró que las sustituciones funcionan con guiones, no con corchetes dobles:
screenshot 2018-06-26 14 08 12

Hola @tetreault ,

Por defecto utilizamos corchetes dobles. setSubstitutionWrappers permite modificarlos como demostró.

¡Gracias!

Con los mejores deseos,

Elmer

Encontré el mismo problema que @panayi .

Seguí el ejemplo de las plantillas transaccionales . He configurado envoltorios de sustitución y, en la plantilla, envuelto sustituciones entre corchetes dobles. Sin embargo, el correo electrónico que recibí había eliminado todas las sustituciones sin reemplazarlas con las que proporcioné.

Intenté con el editor de código y el editor de diseño para la plantilla.

Detalles técnicos:

¡Gracias!

Hola @nrator ,

Si las sustituciones fueran reemplazadas con cadenas en blanco, verificaría dos veces que las variables en las que está iterando no estén vacías. Si verifica que no estén vacíos, ¿podría compartir el fragmento de código junto con el HTML relevante para que pueda intentar reproducirlo?

¡Gracias!

Con los mejores deseos,

Elmer

Hola @thinkingserious

No estoy usando variables sino cadenas para que no estén vacías. A continuación se muestra el fragmento de código, HTML y el resultado que obtuve:

Código

const sgMail = require("@sendgrid/mail");
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

const msg = {
  from: "[email protected]", // my personal email
  to: "[email protected]", // my another personal email
  subject: "Hello world",
  text: "Hello plain world!",
  html: "<p>Hello HTML world!</p>",
  templateId: "d-27e7d954368c46519eddc806e5cf8156",
  substitutions: {
    name: "Some One",
    city: "Denver"
  }
};

  sgMail.send(msg).catch(err => console.error(err.message));

Plantilla HTML

<html>
<head>
    <title></title>
</head>
<body>
Hello {{name}},
<br /><br/>
I'm glad you are trying out the template feature!
<br /><br/>
<%body%>
<br /><br/>
I hope you are having a great day in {{city}} :)
<br /><br/>
</body>
</html>

Correo electrónico que tengo

Hello , 

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

<%body%> 

I hope you are having a great day in :) 

Detalles técnicos
sendgrid-nodejs Versión: @ sendgrid / [email protected]
Versión de Node.js: 8.11.2

Atentamente,
Jason

Hola, tengo el mismo problema con las plantillas transaccionales. Las variables no se recuperan. Usando datos de prueba para obtener una vista previa de la plantilla en el panel de SG, todo parece correcto.
Los correos electrónicos se envían a la persona adecuada y con la plantilla correcta, excepto los valores de variables que faltan.
Creé una plantilla heredada hace 2 días que funcionó bien y hoy cambié a una más nueva
plantillas transaccionales y no funciona. Acabo de duplicar la antigua plantilla heredada que estaba
funcionando bien.
"@ sendgrid / mail": "6.3.1" | Node.js 8.10
Aquí está mi código:

async function sendEmail({ email, firstName, password }) {
  const msg = {
    to: [{ email, firstName }],
    from: {
      email: "[email protected]",
      name: "name"
    },
    asm: {
      group_id: 1234
    },
    templateId: "d-64b15a042b2d41d7a4b5b6a4eea649c5",
    substitutions: {
      userName: firstName,
      email,
      password
    }
  }
  try {
    await sgMail.send(msg);
  } catch(e){
    e.message
  }

  };

Y aquí está la plantilla html:

<h3>Hi {{userName}},</h3>

<div><span style="font-size:16px;">Your account has been setup. To login please use</span></div>

<div><span style="font-size:16px;">the credentials below.</span></div>

<div>&nbsp;</div>

<div><span style="font-size:16px;"><strong>Email:</strong>&nbsp;{{email}}</span></div>

<div><strong><span style="font-size:16px;">Password:&nbsp;</span></strong><span style="color: rgb(0, 0, 0); font-family: arial; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400;">{{password}}</span></div>

<div><span style="font-weight: 600; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-family: arial; font-size: 14px; color: rgb(0, 0, 0);"><span style="font-size: 16px;">SignIn Url: <a href="https://a.abc.com">https://a.abc.com/</a></span></span></div>

<div>&nbsp;</div>

<div>&nbsp;</div>

<div><span style="font-size:16px;">Please let us know if you need any help, email us at <a href="mailto:[email protected]">[email protected]</a></span></div>

Salud

Acabo de cambiar a la plantilla heredada con el mismo código html y funciona. ¿Puede deberse a nuevos cambios en la API V3?

Hola, después de leer el comentario de @himanshupnt , probé con una plantilla heredada y funcionó. Gracias @himanshupnt .

Más tarde encontré la documentación de Sendgrid Mail Send con Dynamic Transactional Templates , tengo la nueva plantilla (no la heredada) funcionando. Usé la misma plantilla HTML y mi código se actualizó a:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Tenga en cuenta que reemplacé "sustituciones" con "datos_de_template_dinámico" y coloqué "a" dentro de "personalizaciones" como lo requieren los documentos. Y también traté el tema como uno de los "datos_template_dinámicos" y funciona. (ponga {{asunto}} en el campo de asunto de la plantilla)

Gracias.

@nrator Eso también lo hizo por mí. ¡Gracias por publicarlo!

Tengo el mismo problema y también abrí un problema (después de probar las soluciones mencionadas al principio). Sin embargo, pude agregar name y city a la siguiente plantilla mencionada por @nrator . Pero no pude reemplazar <%subject%> y <%body%> ya que están incluidos en el correo electrónico que recibí. ¿Cómo puedo reemplazar <%body%> y <%subject%> ? @himanshupnt ¿cómo

Hola @ pankaja92 , no pude hacer que <% subject%> funcionara tan bien. Ahora mi forma de tratar el tema es tratarlo como uno de los "datos_de_template_dinámico", lo que significa que lo envuelvo en {{}} en lugar de <%%> y lo manejo dentro de "datos_de_template_dinámico".

Encontré estos documentos de sendgrid que pueden ayudar. Sin embargo, el parámetro sujeto no parece funcionar.

@nrator Gracias. Funcionó. Por lo tanto, no hay necesidad de <% body%> bien (ya que tampoco funcionará como el ejemplo dado).

Por cierto, no es el problema específico, pero, ¿tiene alguna experiencia o ejemplo para enviar una lista de detalles a través de esta biblioteca? Estoy buscando algo que pueda ayudarme a crear mi aplicación :)

@ pankaja92 No estoy seguro de a qué te refieres con enviar una lista de detalles. Puede leer esta publicación de blog de sendgrid sobre las nuevas características de las plantillas dinámicas, básicamente ahora puede iterar sobre listas de elementos o usar condicionales básicos para generar contenido dinámico.

Para conocer los códigos reales, puede consultar este repositorio .

¡Espero eso ayude!

Hola a todos, también dediqué unas horas a este tema.

En lugar de usar substitutions , use dynamicTemplateData en el objeto principal msg lugar:

const sgMail = require('@sendgrid/mail')

sgMail.setApiKey(process.env.SENDGRID_API_KEY)
sgMail.setSubstitutionWrappers('{{', '}}')

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  templateId: 'd-27e7d954368c46519eddc806e5cf8156',
  dynamicTemplateData: {
    name: 'Some One',
    city: 'Denver',
  },
}

sgMail.send(msg)

Referencia: https://github.com/sendgrid/sendgrid-nodejs/pull/691

De acuerdo con ese PR, cuando el templateId es una plantilla dinámica (con el prefijo d- ), el substitutions no se envía en absoluto, entonces el dynamicTemplateData se debe utilizar el objeto.

Han creado un problema aquí para mejorar el uso de agregar plantillas dinámicas a los documentos, pero hasta entonces espero que esto ayude. 🎉

Siga este problema: # 703

cambiar 'sustituciones' a 'datos_de_template_dinámico'

@jseyfert ¿no debería ser dynamic_template_data ?

@aroach tienes razón. He actualizado mi comentario.

Al principio tampoco funcionó de mi lado.
Me di cuenta de que mi versión estaba un poco desactualizada (estaba usando @ sendgrid / mail @ 6.2.1)
Actualicé el paquete, cambié mi código y ahora está funcionando:

usando @ sendgrid / [email protected]

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

Debo señalar que el siguiente código no funciona:

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

Sí, necesita usar v6.3.1 para la compatibilidad con dynamic_template_data.

El martes 11 de diciembre de 2018 a las 4:15 a. M., Roy Milder [email protected] escribió:

Al principio tampoco funcionó de mi lado.
Me di cuenta de que mi versión estaba un poco desactualizada (estaba usando
@ sendgrid / mail @ 6.2.1)
Actualicé el paquete, cambié mi código y ahora está funcionando:

usando @ sendgrid / [email protected]

resultado constante = espera esto.sgMail.send ({
personalizaciones: [{
to: this._to
}],
dynamicTemplateData: {
prueba: 'prueba' <== funcionando (código en la plantilla: {{prueba}})
},
templateId: this._templateId,
});

-
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/676#issuecomment-446166152 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ACL-sjFRFP8txUETNWFVLs0chW5yyL1Nks5u35OzgaJpZM4TOB5l
.

Hola no te olvides
No cree una plantilla transaccional, cree una plantilla heredada y haga una copia de ella.
entonces cada paso que hagas funcionará.

dynamicTemplateData

Funciona para mi. Tengo la última versión de la biblioteca SendGrid y la estoy usando a través de Firebase (Funciones). El problema principal ahora es la falta de compatibilidad con TypeScript y la documentación.

@roymilder , muchas gracias. Tu respuesta me alegró el día: las sustituciones de las plantillas dinámicas son muy poco claras.
¡Prestigio!

Hola @OleksiiM ,

¿Ayuda este ejemplo ?

@ darren-dev,

¡Gracias por ayudar! Con respecto a la falta de soporte y documentación de TypeScript, ¿te refieres al lado de Firebase?

@uups ,

¡Gracias por ayudar!

Con los mejores deseos,

Elmer

@thinkingserious , sí lo hace. Gracias.

@OleksiiM ,

¿Dónde miraste primero? Estoy tratando de averiguar cómo asegurarme de que las personas que necesitan usar plantillas dinámicas accedan al enlace que les envié primero.

@pensamientosserios
Comenzó aquí .

Dice:
"Envío de plantillas transaccionales
Puede enviar plantillas transaccionales mediante una de estas tres formas:
Uso de la retransmisión SMTP
Incluir el ID de la plantilla en el parámetro de plantillas del extremo de envío de correo de la API web v3
Usando el parámetro x-smtpapi en el extremo de envío de correo de Web API v2 "

Así que salté a "Incluir el ID de plantilla en el parámetro de plantillas del punto final de envío de correo Web API v3 ".

Por qué no estaba claro:
La última página muestra la lista de posibles "Parámetros del cuerpo de la solicitud" que muestra el template_id pero no dice nada sobre el campo "dynamic_template_data". Intenté ir con "personalizaciones" + "sustituciones" + "template_id" y no funcionó.
Además, dado que soy un nuevo usuario de Sendgrid, no estaba al tanto de las plantillas "antiguas" y las plantillas "nuevas" (dinámicas) y la diferencia entre ellas (las páginas de documentos de Sendgrid de arriba no dicen nada al respecto).

Gracias por preguntar y mejorar los documentos. Espero que otras personas eviten este tipo de problemas.

@thinkingserious si puedo agregar:
Actualmente estoy usando estos documentos: https://sendgrid.com/docs/API_Reference/api_v3.html

Las instrucciones sobre el envío de correo electrónico (https://sendgrid.api-docs.io/v3.0/mail-send) no mencionan dynamic_template_data en absoluto en las personalizaciones.

Entonces eso tampoco está claro.

¡Espero eso ayude!

@Whatthefoxsays ^^

¡Gracias @OleksiiM y @roymilder! Agradecemos sus contribuciones a la comunidad de Twilio SendGrid :)

Hola a todos, también dediqué unas horas a este tema.

En lugar de usar substitutions , use dynamicTemplateData en el objeto principal msg lugar:

const sgMail = require('@sendgrid/mail')

sgMail.setApiKey(process.env.SENDGRID_API_KEY)
sgMail.setSubstitutionWrappers('{{', '}}')

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  templateId: 'd-27e7d954368c46519eddc806e5cf8156',
  dynamicTemplateData: {
    name: 'Some One',
    city: 'Denver',
  },
}

sgMail.send(msg)

Referencia: # 691

De acuerdo con ese PR, cuando el templateId es una plantilla dinámica (con el prefijo d- ), el substitutions no se envía en absoluto, entonces el dynamicTemplateData se debe utilizar el objeto.

Han creado un problema aquí para mejorar el uso de agregar plantillas dinámicas a los documentos, pero hasta entonces espero que esto ayude. 🎉

Empujándome desde hace 2 días vi esto y lo hice funcionar.

Hola @Travotics ,

¿Con qué documentación empezaste antes de encontrar lo anterior? Intento mejorar esta experiencia. ¡Gracias!

Con los mejores deseos,

Elmer

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

No tiene dynamicTemplateData pero tiene substitutionWrappers y substitutions .

Además de actualizar los documentos, también sería una buena idea actualizar la interfaz de tipo MailData (https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/helpers/classes/ mail.d.ts # L117). Para las versiones de @ sendgrid / mail que no son compatibles con substitutions , deben esperar un parámetro V2MailData que tenga los campos substititons y substitutionWrappers omitidos.

Hola, después de leer el comentario de @himanshupnt , probé con una plantilla heredada y funcionó. Gracias @himanshupnt .

Más tarde encontré la documentación de Sendgrid Mail Send con Dynamic Transactional Templates , tengo la nueva plantilla (no la heredada) funcionando. Usé la misma plantilla HTML y mi código se actualizó a:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Tenga en cuenta que reemplacé "sustituciones" con "datos_de_template_dinámico" y coloqué "a" dentro de "personalizaciones" como lo requieren los documentos. Y también traté el tema como uno de los "datos_template_dinámicos" y funciona. (ponga {{asunto}} en el campo de asunto de la plantilla)

Gracias.

muchas gracias por esto! Pasé un tiempo considerable depurando esto. : /

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

Temas relacionados

TobiahRex picture TobiahRex  ·  3Comentarios

agostonbonomi picture agostonbonomi  ·  3Comentarios

thinkingserious picture thinkingserious  ·  4Comentarios

Loriot-n picture Loriot-n  ·  4Comentarios

polkhovsky picture polkhovsky  ·  3Comentarios