Sendgrid-nodejs: Adicionar suporte de modelo dinâmico

Criado em 24 jul. 2018  ·  30Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

Resumo do problema

Em 24/07/2018, nossa equipe lançou publicamente conteúdo dinâmico para modelos transacionais. Ele agora está disponível para todos os clientes que enviam pela v3 de nossa API Mail Send. Faça a iteração em listas, lide com condicionais e muito mais, graças ao suporte nativo para um subconjunto da sintaxe de Handlebars!

Mais informações podem ser encontradas em nosso anúncio de postagem no

Atualmente, você pode usar esse recurso criando manualmente o corpo da solicitação, conforme mostrado aqui .

Agora, precisamos criar o código auxiliar ( isso está completo ) e exemplos para este SDK.

Critérios de Aceitação

  • [[COMPLETO] (https://github.com/sendgrid/sendgrid-nodejs/pull/691#issuecomment-407490342)] [Implementar um auxiliar semelhante ao que temos para os modelos legados] (https://github.com /sendgrid/sendgrid-nodejs/blob/master/packages/mail/USE_CASES.md#transactional-templates)
  • Atualize o exemplo USE_CASES.md para demonstrar os novos modelos dinâmicos usando o auxiliar e renomeie o exemplo atual para Legado

Documentação

medium docs update

Comentários muito úteis

Atualize sua documentação - Passei uma hora tentando descobrir por que as substituições não funcionavam com a API v3.

Todos 30 comentários

Atualize sua documentação - Passei uma hora tentando descobrir por que as substituições não funcionavam com a API v3.

Minhas desculpas pela má experiência @jharris-code.

Eu adicionei seu voto a esta questão para ajudá-la a ganhar prioridade. Acho que será atualizado em breve porque só temos o PR # 711.

É muito bobo que a ausência de documentação bloqueie a liberação do código real.

Olá @ catanfetamina ,

O código foi lançado na v6.3.1 . Espero que ajude, obrigado!

Obrigado pela atenção,

Elmer

@thinkingserious Oh, legal, na verdade não passou pela minha cabeça atualizar a versão da biblioteca.
Vou tentar isso, obrigado.

Nota para os usuários: ao usar modelos, passe dynamic_template_data vez de substitutions .

Agora você deve alterar "substituições:" para "dynamic_template_data:"

E os modelos usam guidão e não há mais necessidade de especificar "substitutionWrappers"

Este exemplo em seus casos de uso ainda usa substituições em vez de dynamic_template_data. Plz update, definitivamente me levou algumas horas brincando com o SDK e pesquisando antes de encontrar este tópico. (Além disso, seus documentos da API não mencionam nada sobre isso, o que também não ajudou.
Além disso, substitutionWrappers não parece funcionar com dynamic_template_data. Independentemente de incluir o par de valores-chave substitutionWrappers: ['*|', '|*'] em meu objeto de mensagem, apenas vars de modelo envoltos em chaves foram preenchidos. (Vocês estão agora intencionalmente forçando todo mundo a usar sintaxe de guiador para modelos?)

Minhas desculpas @ josh-yonomi,

Atualizei a documentação com base em seus comentários.

Para nossos novos modelos, eles usam sintaxe de guiador. Os modelos legados ainda funcionam como antes.

Obrigado pela atenção,

Elmer

Recebo o email mas as substituições não funcionam. O que pode causar o problema?

const msg = {
    to: email,
    from: sendGridMail,
    templateId: emailTemplate.confirmationEmail,
    dynamic_template_data: {
      firstName: firstName,
      lastName: lastName,
      link: link
    }
  };

EDITAR via @thinkingserious

Importa-se de nos informar onde está o problema? Adoraríamos entender suas frustrações para que possamos melhorar.

@ drav96 ,

Você se importa em compartilhar a aparência do seu modelo?

Obrigado pela atenção,

Elmer

por que você remove caracteres especiais em substitutionWrappers ??

dynamic_template_data: {
      'foo-bar': 'wtf',
      'bar_baz': 'wtf',
      'baz.bro': 'wtf',
      'foo': 'wtf'
    }

apenas {{foo}} return wtf string em e-mails.

Não tenho certeza @larafale , mas isso certamente não parece razoável. Olhando para o código-fonte deste SDK, não vejo onde essas chaves estão sendo modificadas.

Você se importa em criar um problema separado para esse problema e incluir a aparência do seu modelo HTML? Vou marcar o novo problema como um bug e tentar reproduzi-lo e corrigi-lo, se necessário.

Olá,

Então, estou tentando enviar um e-mail de modelo dinâmico, mas não consigo usar substituições ou dynamic_template_data .
Meu modelo tem tags como {{fullname}} ou {{date}} e essas propriedades foram enviadas para a função send :

const msg = {
        to,
        from,
        templateId: template.id,
        dynamic_template_data: substitutions,
    };

    return sgMail.send(msg)

Confirmei que o objeto substitutions tem as propriedades corretas com os valores corretos, mas a substituição não funciona.

Alguma ideia do que estou fazendo de errado?

Obrigado.

@ gianfelipe93
A estrutura está correta. Eu tive o mesmo problema.
Minha solução foi desinstalar o pacote @sendgrid do meu projeto e instalá-lo novamente
Deixe-me saber se funciona para você
const msg= { to: email, from: sendGridMail, templateId: emailTemplate.requestDemoEmail, dynamic_template_data: { name: data.name, email: data.email, } };

@ drav96 obrigado amigo, está funcionando agora

Adicionando o que espero ser uma documentação definitiva depois de perder mais uma hora do meu tempo com isso. (Em primeiro lugar, obrigado a todos que perderam horas de seu tempo antes de mim.)

  1. Se o id do modelo começar com d- , então substitutions não funcionará e você deve usar CAMEL-CASE dynamicTemplateData (veja aqui , onde eles convertem as chaves snake_case para camelCase de qualquer maneira )
  2. Se o seu modelo começa com d- , setSubstitutionWrappers é silenciosamente ignorado e você deve usar {{ e }} em seus modelos

Adicionando o que espero ser uma documentação definitiva depois de perder mais uma hora do meu tempo com isso. (Em primeiro lugar, obrigado a todos que perderam horas de seu tempo antes de mim.)

  1. Se o id do modelo começar com d- , então substitutions não funcionará e você deve usar CAMEL-CASE dynamicTemplateData (veja aqui , onde eles convertem as chaves snake_case para camelCase de qualquer maneira )
  2. Se o seu modelo começa com d- , setSubstitutionWrappers é silenciosamente ignorado e você deve usar {{ e }} em seus modelos

No meu caso funciona com dynamic_template_data mesmo que tenha no id do modelo a letra d-

Sim, ele funciona com as chaves do snake case, mas parece que os desenvolvedores se comprometeram internamente com o camel case (veja a linha vinculada em meu relatório acima). Portanto, eu recomendaria que todos os novos códigos usassem estojo de camelo.

Olá @ kael-shipman,

Obrigado por nos ajudar, agradecemos muito!

Você viu esta documentação ? Caso contrário, você se importaria de descrever seu caminho de descoberta que o levou a uma hora perdida. Eu adoraria que isso nunca acontecesse novamente e minhas desculpas pela má experiência.

Obrigado pela atenção,

Elmer

@thinkingserious , obrigado por sua compreensão e disposição para melhorar a situação. E desculpe por me intrometer lá. Teve um dia looooooooooooooong;).

De qualquer forma, o problema não é tanto que a documentação correta (ish) exista em algum lugar, é que muita documentação antiga ainda está apanhada nas buscas do Google. Eu fiz uma pesquisa por "campos do modelo sendgrid" (agora mesmo) e o primeiro resultado não-anúncio é este , que ao que tudo indica é a documentação oficial, mas está claramente desatualizado. Não só isso, mas também tem dois formatos de substituição diferentes ( -firstName- e %firstName% ) e diz apenas "o que você usa pode depender da biblioteca SDK que você usa", o que parece realmente estranho, considerando que todas as bibliotecas SDK presumivelmente apontariam para o mesmo templo único (que tem apenas um estilo de tags de substituição).

Em minha experiência com sendgrid, embora eu aprecie muito o que foi construído, essa confusão de documentação é na verdade a regra, não a exceção. Eu sei que provavelmente está avançando tanto quanto o resto do mundo do software está, mas seria bom levar um mês ou mais para apenas normalizar toda a documentação, colocar números de versão nela, etc., e talvez fazer algo sobre o principais sucessos do Google.

De qualquer forma, obrigado novamente!

Além disso, a documentação que você vinculou ainda mostra dynamic_template_data no caso de cobra e, se estiver correto, não tenho certeza de por que o próprio código parece estar convertendo-o para camelCase. Conforme observado acima, eu reconheço que o estojo de cobra funciona, mas dado o código, não parece que a documentação deveria recomendar seu uso.

Olá @ kael-shipman,

Obrigado por nos fornecer comentários detalhados!

Com relação ao link que você forneceu, essa documentação é uma referência à nossa API SendGrid SMTP, não à API REST SendGrid v3 que este SDK suporta. Dito isso, não se deve esperar que você saiba disso. Vou levar esse problema à atenção de nossa equipe de documentação para ver se há uma maneira de esclarecê-lo.

Recentemente, atualizamos e relançamos nossa documentação de código-fonte aberto . Espero que seja mais fácil de navegar.

Vou corrigir o README para usar camelCase para consistência. Obrigado por perceber isso e chamar nossa atenção para o fato!

Obrigado mais uma vez e como um símbolo de nosso agradecimento por seus comentários detalhados, gostaríamos de oferecer alguns brindes . Aproveitar!

Obrigado pela atenção,

Elmer

Ei legal, obrigado: D

Na terça, 18 de setembro de 2018 às 18h09, Elmer Thomas [email protected]
escreveu:

Olá @ kael-shipman https://github.com/kael-shipman ,

Obrigado por nos fornecer comentários detalhados!

Com relação ao link que você forneceu, essa documentação é uma referência
para nossa API SendGrid SMTP, não a API REST SendGrid v3, que este SDK
apoia. Dito isso, não se deve esperar que você saiba disso. Eu vou trazer
este problema para a atenção de nossa equipe de documentação para ver se há um
maneira de deixar isso claro.

Recentemente, atualizamos e relançamos nossa documentação de código aberto
https://sendgrid.com/blog/how-to-get-the-most-from-sendgrids-new-knowledge-center/ .
Espero que seja mais fácil de navegar.

Vou corrigir o README para usar camelCase para consistência. Obrigado por
captando isso e trazendo-o à nossa atenção!

Obrigado mais uma vez e como um símbolo de nosso agradecimento por seus detalhes
feedback, gostaríamos de oferecer alguns brindes
https://dx.sendgrid.com/swag . Aproveitar!

Obrigado pela atenção,

Elmer

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/703#issuecomment-422588492 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ADUIglZIH2d7imy-H7dekTo5A-v2Xau8ks5ucX0agaJpZM4Vev8b
.

Consigo fazer dynamic_template_data funcionar para variáveis ​​gerais de e-mail, mas e se precisarmos adicionar dados dinâmicos por destinatário também? Por exemplo, números de pedidos, quantidade de pedidos, etc. Não vejo um caso de uso para isso nos documentos, mas talvez esteja ignorando isso.

Nota para os usuários: ao usar modelos, passe dynamic_template_data vez de substitutions .

@catamphetamine Infelizmente, eu dynamicTemplateData , mas no meu caso as substituições são simplesmente removidas. Só espero que outros tenham uma experiência melhor.

Minha versão:
"@sendgrid/mail": "^6.3.1"

Acontece que para mim eu tive que fazer o seguinte (o oposto do que as pessoas dizem):

// This seems to be the default, however, to avoid unexpected API changes,
// I'd rather set this manually
setSubstitutionWrappers("{{", "}}");

{
      subject: EMAIL_SUBJECT_ONBOARDING,
      templateId: "templateId",
      personalizations: [{
        to,
        // NOT WORKING WITH THIS ❌
        // dynamicTemplateData: {
        //   senderName: EMAIL_FROM_NAME,
        //   senderAddress: "an actual adress",
        // },

        // WORKS WITH THIS ✅
        substitutions: {
            senderName: EMAIL_FROM_NAME,
            senderAddress: "an actual adress",
        },
    }],
}

@thinkingserious amo a ferramenta. Continue a melhorar os documentos, cobrir casos extremos, etc. 🎉❤️


ATUALIZAR:

Graças a @catamphetamine downvote. Isso me fez pensar que substitutions funcionou porque eu fiz setSubstitutionWrappers("{{", "}}"); . Infelizmente, não. Não sei o que aconteceu, posso estar cansado, mas dynamicTemplateData funciona . Observe que é camelCase _ (veja o comentário de @ kael-shipman) _ Eu vejo a maioria dos exemplos de caso de cobra. Além disso, estou usando tipos de TS para sendgrid. Não há chave snake_case disponível na definição.


ATUALIZAÇÃO 2:

Quanto aos tipos disponíveis. Encontrei dynamic_template_data no tipo PersonalizationJSON . Se você usar o seguinte:
import { send } from "@sendgrid/mail";
então, após verificar o primeiro parâmetro para enviar, você verá MailData que tem a seguinte definição:

export interface MailData {
  // ...
  personalizations?: PersonalizationData[],
  // ...
}

Então, me deparo com os 2 tipos a seguir:

export interface PersonalizationData {
  // omitted keys...
  dynamicTemplateData?: { [key: string]: string; };
  customArgs?: { [key: string]: string };
  sendAt?: number;
}

export interface PersonalizationJSON {
  // same omitted keys...
  dynamic_template_data?: { [key: string]: string; };
  custom_args?: { [key: string]: string; };
  send_at?: number;
}

Finalmente, consigo que dynamic_template_data funcione consistentemente assim:

{
    templateId: "d-templateId",
    dynamic_template_data: { name: "elton yet again"}, // <-- either here
    personalizations: [{
        to,
        dynamic_template_data: { name: "Elton again" }, // <-- or here
    }],
}

@thinkingserious Claramente, existem problemas de definição de tipo que precisam ser corrigidos. Posso criar um PR mais tarde.

Ok, preciso investigar novamente. Estou estupefato porque agora nem dynamicTemplateData nem substitutions funcionam para mim.

ATUALIZAR:
Virei algumas tabelas, mas fiz funcionar e atualizei meu comentário anterior.

Finalmente, consigo que dynamic_template_data funcione consistentemente assim:

{
    templateId: "d-templateId",
    dynamic_template_data: { name: "elton yet again"}, // <-- either here
    personalizations: [{
        to,
        dynamic_template_data: { name: "Elton again" }, // <-- or here
    }],
}

Este foi um ponto importante para mim. Eu estava tentando definir o assunto em um modelo transacional diferente para e-mails cc vs. Funcionou quando coloquei a propriedade dynamic_template_data dentro da matriz de personalização conforme acima.

    const msg = {


         personalizations: [
            {
              to: req.body.to,
              dynamic_template_data : {
                subject: "Just to adsf...",
                full_name_from: req.body.full_name_from,
                full_name_to: req.body.full_name_to,
                manager: req.body.manager,
                message: req.body.message,
                badge: req.body.badge,
                badge_image: 'https://asdf' + req.body.badge_image
             }
            },
            {
              to: req.body.manager,
              dynamic_template_data : {
                subject: req.body.full_name_from + ' received a asdf asdf',
                full_name_from: req.body.full_name_from,
                full_name_to: req.body.full_name_to,
                manager: req.body.manager,
                message: req.body.message,
                badge: req.body.badge,
                badge_image: 'https://asdf' + req.body.badge_image
             }
            }
          ]
    };

A solução que funcionou para mim é colocar o dynamic_template_data dentro do objeto de personalização da maneira exata mostrada abaixo:

    "personalizations": [
        {
              "dynamic_template_data": {
            "fullname": "full Name",
            "useremail": ":[email protected]",
            "userphone": "56456",
            "usermsg": "tex fdsfgasdf t"
    },
            "to": [
                {
                    "email": "[email protected]"
                }
            ],
            "cc": [
                {
                    "email": "[email protected]"
                }
            ]
        }
]
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kiranshashiny picture kiranshashiny  ·  4Comentários

Loriot-n picture Loriot-n  ·  4Comentários

amlcodes picture amlcodes  ·  4Comentários

thinkingserious picture thinkingserious  ·  4Comentários

egges picture egges  ·  3Comentários