Sendgrid-nodejs: substituições não funcionam em modelos transacionais

Criado em 8 dez. 2017  ·  20Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

screenshot from 2017-12-08 10-36-46

Resumo do problema

As substituições não funcionam ao usar esta biblioteca. Funciona ao usar curl.

Passos para reproduzir

  1. Crie um modelo de email transacional em sua conta SendGrid
  2. Ter <% body%> no modelo,% firstName% ou ambos (tentei os dois)
  3. Execute este código de nó (preencha a configuração)
`'use strict';

var config = {

    apiKey: '',
    from: '',
    to: '',
    templateId: ''

}

const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(config.apiKey);

async function sendTest() {

 var newMsg = {

   "from": {
    "name": "Test Script",
    "email": config.from
   },
   "personalizations": [{
    "to": config.to,
    "substitutions": {
     "-firstName-": "Maciejs", 
     "%firstName%": "Maciej",
     "-first_name": "Maciej",
     "%first_name%": "Maciej"
    }
   }],
   "subject": "test subject",
   "content": [{
     "type": "text/plain",
     "value": "Hello, %firstName%!"
    },
    {
     "type": "text/html",
     "value": "<html><p>Hello, %firstName%!</html> "
    }],
    "template_id": config.templateId
 }

   await sgMail.send(newMsg);

}

sendTest();`
  1. Observe que nada será substituído no e-mail entregue. Novamente, funciona perfeitamente com curl.

Também estou anexando uma captura de tela do modelo no editor SendGrid e o e-mail que recebo
screenshot from 2017-12-08 10-36-26

Detalhes técnicos:

  • sendgrid-nodejs Versão: 6.1.4
  • Versão Node.js: 8.9.2
medium help wanted help wanted community enhancement up for grabs up-for-grabs

Comentários muito úteis

Para todos tão desesperados quanto eu ontem: na API v3, você precisa usar dynamic_template_data vez de substitutions , isso ainda não está documentado em lugar nenhum!

Em seguida, use {{var_name}} no modelo de e-mail e dynamic_template_data: { var_name: "var_value" } na chamada de API.

Todos 20 comentários

@MaciejKrawczyk Você tentou usar setSubstitutionWrapper e omitir os invólucros de substitutions ?

Ex:
sgMail.setSubstitutionWrappers('-', '-');
"substitutions": { "firstName": "Maciejs" }

Não tenho certeza de como você faria vários wrappers ao mesmo tempo dessa maneira, mas consegui fazer com que as assinaturas funcionassem com essa versão não especificando os wrappers no atributo de substituição. Meus subs parecem
emailOptions.substitutions = {}
emailOptions.substitutions.CLIENT_NAME = myClientName

Funciona. Obrigado!

Obrigado por ajudar @kmcurry!

Estou feliz que você esteja usando @MaciejKrawczyk!

Isso deve ser definitivamente colocado no README! Me custou 2 horas para descobrir isso!

@LASkuma ,

Isso não é bom :(

Esta documentação ajuda? Em caso afirmativo, você poderia me indicar onde procurou ajuda pela primeira vez para que eu possa ter certeza de que temos um link claro?

Obrigado!

Obrigado pela atenção,

Elmer

@thinkingserious Sim. Este doc ajudou muito. No entanto, como vim do site oficial, onde as chaves de substituição devem incluir o wrapper, não prestei muita atenção aos casos de uso.

Olá @LASkuma ,

Quando você disser que veio do site oficial, poderia me dizer a qual URL está se referindo? Obrigado!

Olá, @thinkingserious ,
Eu estava me referindo a esta página . Mesmo a seção de teste tem chaves de substituição com os invólucros incluídos. Depois de ler a documentação, achei que a biblioteca Node era naturalmente consistente com a documentação.

Obrigado @LASkuma!

Esse é um feedback muito útil.

Não tenho certeza da solução, porém. Esses documentos são para aqueles que desejam interagir com nossa API diretamente em vez de usar uma de nossas bibliotecas auxiliares.

Você mencionou anteriormente que devemos incluir esta documentação no README. Você quer dizer aqui ? Devemos chamar especificamente o caso de uso de substituição lá?

Obrigado novamente por sua ajuda!

Obrigado pela atenção,

Elmer

Isso definitivamente deve estar no readme. Tentei de tudo, li todos os documentos sobre a referência da API SendGrid, tudo que está no GitHub (pensei), entrei em contato com o suporte e estaria fazendo meu próprio api wrapper se não fosse por @kmcurry acho que seria muito mais fácil e menos confuso se a biblioteca auxiliar funcionaria exatamente como a própria API (veja meu código no início do thread).

Obrigado @MaciejKrawczyk ,

Este é um feedback muito bom e eu adicionei isso ao backlog de nossa equipe para um mergulho mais profundo. Iremos fornecer atualizações neste tópico.

Obrigado!

Obrigado pela atenção,

Elmer

Isso está feito? Estou tendo o mesmo problema;

Olá @sriharrsha ,

Você já experimentou a sugestão de @kmcurry ?

Ainda não. Vou atualizar se funciona ou não em breve.
Desculpe pelo atraso na resposta.

Para todos tão desesperados quanto eu ontem: na API v3, você precisa usar dynamic_template_data vez de substitutions , isso ainda não está documentado em lugar nenhum!

Em seguida, use {{var_name}} no modelo de e-mail e dynamic_template_data: { var_name: "var_value" } na chamada de API.

@tkafka oh meu deus! obrigado por este homem, tenho puxado meu cabelo com isso nos últimos 2 dias.

@tkafka Muito obrigado! Isso é tão frustrante! Demorou 3 horas do meu dia ...

Aqui está o código completo, caso alguém esteja procurando o mesmo:

var sendgrid = require('@sendgrid/mail');
sendgrid.setApiKey(env.sendgridApiKey);
sendgrid.setSubstitutionWrappers('{{', '}}');

var newMsg = {
      "from": {
       "name": "Your Company",
       "email": env.businessEmail
      },
      "personalizations": [{
       "to": order.email,
       "dynamic_template_data": {"order_id": "1234", "first_name": "Max", "last_name": "Mustermann"}
      }],
      "subject": "test subject",
      "content": [{
        "type": "text/plain",
        "value": "Hello, {{firstName}}!"
       },
       {
        "type": "text/html",
        "value": "<html><p>Hello, {{'firstName}}!</html> "
       }],
       "template_id": env.sendgridOrderConfirmationTemplateId
    };
    console.log("Sending confirmation email...")
    return sendgrid.send(newMsg);

A documentação do sendgrid é horrível para dizer o mínimo.

Olá a todos,

Por favor, veja este problema para o progresso. No momento, estamos trabalhando na atualização para C #, depois para Java, e este SDK vem logo em seguida. Obrigado pela sua paciência e minhas desculpas pelo atraso.

Obrigado pela atenção,

Elmer

Hah, dynamic_template_data . Resolvi seu pequeno quebra-cabeça! :sorrir:

Para outros usuários do typescript - Crie o arquivo mail.d.ts :

import {MailData} from "@sendgrid/helpers/classes/mail";

// see https://github.com/sendgrid/sendgrid-nodejs/issues/638

declare module "@sendgrid/helpers/classes/mail" {
    export interface MailData {
        dynamic_template_data: {[key: string]: string};
    }
}

Obrigado @xduseko !

Esta página foi útil?
0 / 5 - 0 avaliações