Sendgrid-nodejs: Exemplo fácil de entender

Criado em 28 jun. 2016  ·  75Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

Olá,

Seria ótimo fornecer um exemplo fácil de entender em seu leia-me, algo tão simples como https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/ por exemplo, porque tbh se eu quisesse escrever 30 linhas de código javascript para enviar um e-mail simples, eu não usaria sendgrid.

Sua biblioteca é bastante frustrante de usar, mesmo para um desenvolvedor experiente.

Felicidades,
e desculpe por este discurso furioso

ps: este exemplo é exatamente o que estou procurando https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html , tão fácil de usar

help wanted community enhancement

Comentários muito úteis

@thinkingserious Eu finalmente entendi o que me incomoda tanto sobre todas as classes auxiliares Sendgrid introduzidas na v3 ... há muitas delas e tornam o envio de e-mails desnecessariamente complicado: P

Eu não queria revisar todo o código de Sendgrid, então decidi fazer um empacotador simples, sendgrid-mailer .

Embora as classes auxiliares de Sendgrid sejam úteis nos bastidores, para criar e validar modelos de email, não acho que elas devam ser forçadas apenas a interagir com a API. Acho que isso torna a escrita de aplicativos Node mais complicada do que deveria ser, e a nomenclatura dos ajudantes pode ser bastante confusa, por exemplo, Mail vs Email .

Acho que o exemplo básico ilustra bem o problema:

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

Isso parece muito complicado para algo tão básico como "Quero enviar um e-mail". Requer que você carregue 8 dependências diferentes e escreva 15 linhas de código antes de enviar um e-mail.

Não usar as classes auxiliares é indiscutivelmente ainda pior, já que você precisa conhecer a estrutura necessária da solicitação JSON de email e preenchê-la corretamente. Um erro quebrará o pedido facilmente.

Então eu abstraiai toda a lógica das classes auxiliares atrás de um auxiliar API simples e fácil de usar, para que enviar e-mails com Sendgrid se tornasse fácil e divertido novamente :)

O exemplo mais básico se torna:

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

A solicitação é construída nos bastidores e usa os ajudantes do Sendgrid de maneira transparente.

Ele também suporta o envio de vários e-mails, expõe o objeto Sendgrid no caso de personalização adicional ser necessária, também aceita instâncias de Sendgrid Mail e uma ampla variedade de formatos para os campos de / para, por exemplo, Name <[email protected]> ou um objeto com propriedades de nome / email. Veja o README para mais detalhes.

Provavelmente ainda há espaço para melhorias, mas eu gostaria de compartilhar esta solução aqui para pessoas que procuram usar a API Sendgrid sem se sobrecarregar com ela.

Espero que seja útil para alguém e talvez possa fornecer alguma direção para o futuro desta biblioteca, expondo uma API mais simples :)

cc @julesbou um pouco tarde, mas espero que você ainda encontre um uso para ele.

Todos 75 comentários

Olá @julesbou ,

Discursos raivosos estão bem para mim, especialmente se eles tiverem soluções anexadas :)

Obrigado por nos informar.

No momento, estamos planejando as melhorias para a próxima iteração, então você teve um bom momento!

Se você tiver alguma outra solicitação específica, informe-nos neste tópico ou abra outras edições.

Obrigado!

Como usamos a classe auxiliar? Tudo que eu quero fazer é definir o nome de origem ??

@jsgandalf ,

A maneira mais fácil é: https://github.com/sendgrid/sendgrid-nodejs#hello -email, especificamente: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail/example. js # L4

Você também pode simplesmente construir seu próprio json da seguinte forma: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js#L31 (aqui está uma visão geral do json: https: / /sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html)

Obrigado!

Muito útil! Isso deve estar no readme !!

@jsgandalf @thinkingserious Eu também acho a biblioteca bastante frustrante de usar. Estou tentando enviar um e-mail modelo. Achei os exemplos aqui não muito úteis. Estou confuso sobre como definir os endereços de e-mail "para" e "de", e esse código nem mesmo envia meu e-mail. Estou coçando minha cabeça nos últimos três dias. Qualquer ajuda?

Obrigado pelo feedback @bcootner. Sua solicitação ajuda a resolver isso na fila. Este é um problema que estou ansioso para resolver.

Nesse ínterim, espero que este exemplo ajude:

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

Entre em contato se precisar de ajuda adicional.

@thinkingserious Obrigado pelo seu tempo e resposta atenciosa. Eu tenho o seguinte 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)
       })
}

E então eu chamo esse código de sendMail(welcomeTemplate()) mas isso não funciona. O "modelo" e "enviar" aparecem nos logs, mas o statusCode, corpo ou cabeçalhos não aparecem, nenhum e-mail está sendo recebido e nada aparece no meu painel.

Depois de requestPost.body = requestBody você poderia fazer console.log(JSON.stringify(requestBody)) e me dizer o que você conseguiu.

@thinkingserious Após alguma depuração, parece que nada é impresso no log após a linha var emptyRequest = require('sendgrid-rest').request . Primeiro, o "modelo" é registrado e, cerca de 5 minutos depois, o "envio" é impresso (e se eu descomentar as linhas que você comentou na função de envio, elas funcionam bem). Há algo que estou faltando para esta declaração de requerimento? Acabei de fazer npm install sendgrid

Por favor, tente isto:

A. Crie um arquivo chamado post.json com a seguinte carga útil:

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

B. Substitua os e-mails de exemplo

C. Execute o seguinte 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. Substitua $ SENDGRID_API_KEY por sua API KEY ou adicione sua API Key a uma variável de ambiente chamada SENDGRID_API_KEY

@thinkingserious Recebi aquele e-mail de teste, também consegui fazer o Hello Test funcionar bem, apenas esses modelos não querem funcionar.

EDITAR: Então eu substituí var emptyRequest = require('sendgrid-rest').request por var emptyRequest = sg.emptyRequest() e isso envia o e-mail, simplesmente não há nenhuma formatação do design do modelo ou imagens.

@bcootner ,

Infelizmente, não consigo reproduzir seu erro, então estou tentando ajudar a identificar onde pode haver um problema. Como você pode enviar um e-mail via curl, isso significa que sua chave de API é boa. Talvez o ID do modelo tenha um problema?

Se você remover mail.setTemplateId("5a****-*******-******-9") o e-mail será enviado?

@thinkingserious Portanto, se eu remover o setTemplateID, ele enviará o teste "Hello World from the SendGrid Node.js Library".

Não tenho certeza se você viu minha edição, mas ao substituir var emptyRequest = require('sendgrid-rest').request por var emptyRequest = sg.emptyRequest() o texto do meu modelo é enviado, mas não há formatação (sem fontes, sem imagens). Recebo a seguinte impressão agora do console.

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 faz pensar que é um problema com 'text / plain', mas não tenho certeza. Obrigado novamente!

Olá @bcootner ,

_Params_

  • de (por exemplo, '[email protected]')
  • para (por exemplo, '[email protected]')
  • assunto (por exemplo, 'assunto de teste')
  • mensagem (por exemplo, 'mensagem de teste')
  • modelo (id do modelo que você deseja usar)
  • templateVariables (objeto, onde variável - chave no email, valor - valor para substituí-lo) { ":name": "someName", ":email": "someEmail" } . Observe que :email e :name é como eu defini minhas variáveis ​​no modelo de e-mail, pode ser -email- ou o que você tiver
  • retorno de chamada de sucesso
  • retorno de chamada de erro
    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);
            }
        });
    }

A documentação realmente precisa de alguma refatoração, com exemplos básicos e simples. Espero que minha função ajude você :)

@ByEmke obrigado pelo seu apoio! Você poderia nos enviar um e-mail para [email protected] com o tamanho de sua camiseta e endereço de correspondência?

Com relação à documentação, um refatorador está a caminho, assim como para o próprio auxiliar de correio. Estamos coletando todos os seus comentários e estamos entusiasmados com a próxima iteração.

Além disso, uma grande confusão é que você ainda precisa definir o conteúdo ao usar o modelo. Felizmente, isso mudará muito em breve (dias).

@bcootner Acho que você content_html = new helper.Content("text/html", message) . Felizmente, esse requisito será removido em alguns dias. Nossa equipe está alterando esse comportamento para que, quando você especificar um modelo, não precise mais definir o conteúdo.

@ByEmke @thinkingserious obrigado por sua ajuda neste problema, consegui fazê-lo funcionar com o seguinte código ontem à noite:

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

Obrigado novamente!

Também acho que os documentos são muito difíceis de seguir, especialmente ao usar modelos e alguns outros recursos.

Eu prefiro a sintaxe request.body = {} em vez da sintaxe helper (), pois isso torna as coisas mais detalhadas e menos fáceis de ler (pelo menos para mim).

Passei algum tempo examinando os documentos, testando alterações, examinando seus exemplos e tentando novamente apenas para vir aqui e descobrir que _do_ precisa definir conteúdo ao usar modelos, embora os documentos indiquem o contrário. Argh. Coisas como essa podem deixá-lo louco. De qualquer forma, parabéns a @ByEmke por fornecer um exemplo

@peterkuiper (ou devo dizer Adam :))

Obrigado pelo feedback, estamos muito interessados ​​em como podemos melhorar os documentos da biblioteca.

Para ser claro, você está se referindo a eles? https://github.com/sendgrid/sendgrid-nodejs/blob/master/USAGE.md

Com relação ao problema de conteúdo (ouvimos todos vocês :)), está quase resolvido. Implementaremos uma versão para a API que não exigirá que o conteúdo seja definido ao usar um modelo. Esperamos que a mudança torne a experiência do modelo muito melhor.

@thinkingserious Eu estava verificando os documentos em sendgrid.com (ou seja, https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html) enquanto deveria ter ido direto para o Github. Eu folheei o README deste repositório, verifiquei os exemplos e perdi totalmente o USAGE.md (meu erro). O arquivo USAGE.md deve ser aquele que deve ser colocado em sendgrid.com, pois tem meu formato preferido :) Ainda não tenho certeza sobre algumas das melhores práticas ao usar modelos, mas espero poder descobrir isso sozinho ou encontrá-lo no docs.

Estava navegando naquele arquivo e acabei de encontrar um exemplo aleatório de algo que acho 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)
  })

Que tipos são start_time, limit, end_time e offset e o que isso significa? Existem mais queryParams? E por que não é request.body?

Há um link para o Guia do Usuário (que não ajuda em nada), embora deveria haver um link para os documentos da API que esclarece as coisas https://sendgrid.com/docs/API_Reference/Web_API_v3/blocks.html.

Portanto, você precisa ir e voltar tentando descobrir onde encontrar as informações de que precisa.

Excelente feedback @peterkuiper!

Eu gostaria de ganhar com você também. Envie-nos o tamanho da sua camiseta e endereço de correspondência para [email protected].

Atualizaremos os documentos USAGE.md para incluir descrições dos corpos de consulta e resposta.

Com relação aos modelos, o plano é criar um auxiliar como fizemos para o terminal de correio, completo com exemplos de casos de uso comuns. Além disso, há uma correção em que você não terá que especificar o conteúdo ao usar os modelos. Essa é uma grande fonte de confusão.

@thinkingserious cool, thanks :) email enviado!

Enquanto estou nisso, percebi algo mais que também se refere às melhores práticas (e está causando alguma confusão para minha equipe). Um dos meus colegas de equipe criou modelos para alguns recursos (ou seja, verificar e-mail) e adicionou verify-nl, verify-en etc. Portanto, cada modelo era basicamente o mesmo, com a única diferença sendo o texto (idioma diferente). Eu vi <% subject%> en <% body%> e não consegui encontrar nenhuma referência a ele (TL; DR de minha parte, talvez), então presumo que seja uma substituição interna de sua parte que acontece ao usar a API.

Estou curioso para saber o que uma prática "normal" pode ser:

  • Crie um modelo para cada recurso em um idioma diferente e faça apenas algumas pequenas substituições (ou seja, nome)

Parece que usar essa abordagem pode causar muito trabalho quando você altera partes do seu modelo. Não tenho certeza se você seria capaz de criar "modelos de modelo" (ou seja, cabeçalho / rodapé / qualquer parte). Além disso, o limite de 300 modelos pode ser facilmente alcançado quando você tem vários idiomas diferentes (isso não é um problema em nosso caso).

  • Crie um modelo para cada recurso e use <% body%> para definir o corpo de seu aplicativo e tenha apenas um modelo "mestre" (ou use sua sub tag)

Espero que a pergunta faça sentido :)

@peterkuiper ,

Não sei, mas coloquei algumas sondagens. Vou responder com o que descobrir. Obrigado!

@thinkingserious acabei usando a versão 2.0.0 que realmente gosto de como 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);

Estou tentando ver como isso ficaria na versão 3.x.x . Acho os exemplos atuais muito confusos.

Ótimo feedback @IonicaBizau!

Definitivamente consideraremos suas idéias para a próxima iteração.

@thinkingserious Ótimo! Ainda assim, gostaria de saber como isso ficaria em 3.x.x .

Não há mapeamento um para um, pois este cliente foi recriado do zero para se separar do ponto de extremidade de correio v2 e permitir acesso aos pontos de extremidade v3.

Dito isso, o objetivo do auxiliar de correio é chegar a um ponto em que a chamada possa ser tão fácil quanto era com a v2. Ainda não chegamos lá, voltamos ao início e esperamos muitas outras iterações.

@thinkingserious Eu vi isso, mas não gosto dos seguintes pontos:

  1. É confuso porque existem variáveis ​​globais (declaradas sem var ou let ou palavra-chave semelhante). Por exemplo: from_email = new helper.Email("[email protected]") vez de var from_email = ...
  2. Usar new helper.Email apenas para um recurso de e-mail é muito hostil. Isso pode ser envolvido provavelmente em uma funcionalidade de nível inferior dentro do módulo. Mesma coisa para Content , Mail etc.
  3. Definir manualmente method , path e body é novamente bastante hostil.
  4. A função de retorno de chamada deve estar no formato err, data, ... (em vez de resposta).

Resumindo, IMHO, o _início rápido_ é uma implementação de baixo nível para o envio de um e-mail. Pode ser útil para funcionalidades mais profundas, mas definitivamente não para um _início rápido_. 😁


Muito obrigado pelo incrível serviço e módulo. ✨

@IonicaBizau ,

Feedback incrível, obrigado!

Definitivamente, nos referiremos às suas idéias ao construirmos a próxima iteração do auxiliar de correio.

Você está correto, esta primeira versão é um wrapper fino sobre a API. O plano é melhorar gradualmente sua funcionalidade com base no feedback da comunidade, como o que você fez!

Por seu apoio e contribuição para a comunidade, gostaríamos de enviar alguns brindes. Envie-nos um e-mail para [email protected] com o tamanho da sua camiseta e endereço para correspondência.

Sinta-se à vontade para adicionar comentários adicionais conforme achar necessário. Obrigado novamente!

@IonicaBizau

Você também pode fazer algo assim:

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

Eu prefiro essa sintaxe em vez da sintaxe auxiliar. Dê uma olhada nos exemplos, eles me ajudaram bastante.

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

HTH

@thinkingserious Wowowow! Definitivamente servirei. Obrigado - prazer em ajudar! 😁

@peterkuiper Eu tentei isso também, mas acho que cometi o erro de substituir text/html por html e o conteúdo apareceu como anexo. Então, decidi fazer o downgrade da versão.

Mas, novamente, isso ainda parece de baixo nível ( request.method = ... , enviando o tipo MIME no array content , response no argumento de retorno de chamada etc.)

Obrigado @peterkuiper!

Eu adicionei esse estilo de exemplo ao README semana passada :)

@IonicaBizau ,

Sim, essas coisas de baixo nível serão ocultadas em breve.

@thinkingserious fico feliz em saber que o material do pedido será ocultado em breve 👍

Seguindo as ótimas sugestões de @IonicaBizau , outra recomendação seria ocultar os detalhes de implementação das "personalizações", se possível. Por exemplo, fazer algo como:

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

Parece desnecessário expor esse nível de detalhe por meio do SDK.

Além disso, não tenho certeza se isso já é um recurso, mas seria ótimo poder encadear essas chamadas:

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

Obrigado e continue com o bom trabalho 👍

@jamesdixon ,

Obrigado pelo feedback adicional!

Até que possamos aprimorar o auxiliar de e-mail para permitir mais ocultação de implementação, verifique a incrível solicitação de pull de @adambuczynski : https://github.com/sendgrid/sendgrid-nodejs/pull/261. Ele não aborda diretamente sua ideia específica, mas é um passo na direção certa.

@thinkingserious você mencionou que as coisas de solicitação de baixo nível serão ocultadas em breve, vocês já têm algo planejado para isso? Eu estava pensando sobre isso ontem e, embora seja bom ter acesso a toda a API, você pode usar sendgrid-rest para isso também. Dessa forma, tudo que essa biblioteca tem a fazer é permitir que você envie e-mail e, como tal, exponha apenas a API de envio de e-mail.

Isso separou as preocupações e estreitou um pouco o foco deste pacote, permitindo uma API mais limpa com encadeamento, etc., como sugeriu @jamesdixon .

@adambuczynski ,

Nosso plano é executar a camada de abstração por meio dos ajudantes. Mail é o primeiro, mas em um futuro próximo planejamos adicionar um para gerenciamento de subusuário e modelos. Mas primeiro precisamos polir o auxiliar de correio e torná-lo o padrão.

Você está correto, esta biblioteca é apenas uma camada muito fina sobre sendgrid-rest e simplesmente adiciona exemplos, um arquivo USAGE e testes de unidade (todos eles são automatizados [esperamos abrir o código também] usando nossa definição Swagger ). A longo prazo, prevemos a implementação de código auxiliar para todos os terminais, completos com validação de dados em ambos os sentidos, com o núcleo dessa funcionalidade também automatizado. Fluxos de trabalho e casos de uso serão feitos à mão.

Nas próximas semanas / meses, iremos expor o roteiro aqui no GitHub para mais comentários.

Além disso, no final de agosto, adicionaremos suporte para o Webhook Parse de entrada a esta biblioteca.

Obrigado por fazer esta pergunta e espero que minha resposta traga mais comentários de você e da comunidade. Queremos que esta seja uma biblioteca dirigida pela comunidade, com suporte e liderada pelo SendGrid.

Obrigado pela atualização @thinkingserious. Ficarei feliz em desempenhar um papel na biblioteca sendgrid nodejs daqui para frente.

Por que você está adicionando suporte para Parse neste estágio? Achei que o serviço Parse estava sendo desativado em janeiro próximo.

@thinkingserious Esqueci de mencionar que se houver algo em que eu possa ajudar aqui, é só me

@adambuczynski isso é uma ótima notícia! Além disso, sua solicitação pull está chegando perto do topo. Estou pensando que poderei mesclá-lo no início da semana que vem.

Com relação ao Parse, ainda não decidimos retirá-lo oficialmente. Adicionar suporte nas bibliotecas faz parte do nosso teste para determinar se vamos mantê-lo funcionando ou não.

@IonicaBizau ,

Obrigado! Seu apoio é muito apreciado!

Existe uma maneira de definir vários destinatários usando o auxiliar de email?
Percebo que helper.Mail(from_email, subject, to_email, content) usa personalization.addTo para definir o destinatário. Acredito que isso só funciona com 1 destinatário, não com um conjunto de destinatários (talvez eu esteja errado) e o auxiliar não fornece um setTo function (forma ideal de definir os tos).

Vejo que se eu mesmo estivesse configurando a personalização com let personalization = new helper.Personalization(); , poderia fazer personalization.tos = [email, email]//email=new helper.Email(email_address, name) é seguro? É provável que mude em versões futuras?

@ albert-the-creator eu o uso da seguinte maneira:

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

Acho que você pode adicionar vários destinatários repetindo a linha recipients.addTo , por exemplo, em um loop.

Acho essa abordagem bastante prolixa, com a divisão em classes de e-mail e personalização. Às vezes, você só quer adicionar um endereço de e-mail e mandá-lo embora, e parece que você precisa de muitas linhas de código para fazer isso.

@ albert-the-creator,

Esse construtor foi feito para ajudar as pessoas a enviar um único e-mail com mais facilidade, basicamente é uma função de "hello email".

Para vários e-mails, você provavelmente deseja seguir este exemplo (como você já começou por este caminho definindo a personalização sozinho): https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail /example.js#L15

Também pode ser útil ler sobre personalizações: https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html

O auxiliar definitivamente irá evoluir, mas quaisquer mudanças significativas serão significadas com uma liberação de ponto principal. Não espero que a API mude muito.

@adambuczynski ,

Obrigado por ajudar! Precisamos atualizar o auxiliar para contabilizar casos de uso comuns adicionais como este e enviar e-mails com modelos, por exemplo.

@thinkingserious, a API dos helpers é algo que também estou interessado em possivelmente refatorar / melhorar quando tiver tempo novamente :)

@adambuczynski ,

Isso é incrível, quando você decidir começar com isso, por favor, me ping. Ou, se começarmos antes de você, vou enviar um ping para você.

Usei o código de @bcootner e funcionou bem. No entanto, seria ótimo ter um exemplo oficial e adequado de como usar um modelo com este plugin de nó.

@otmezger ,

Obrigado pelo seguimento!

Estou trabalhando nesse exemplo esta semana, e você encontrará um link no README.

Não uso o auxiliar de modelo, mas compartilharei minha abordagem para carregar templates e parciais de formato de texto e HTML por meio de um método auxiliar 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)));
  },

Isso pode ser usado da seguinte maneira para obter um objeto pronto para uso com 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,
    }));

Você pode facilmente adaptar o exemplo para usar algo como o modelo do guiador também. No exemplo acima, o replaceData helper é uma função simples que substitui as tags do tipo guidão pelos dados fornecidos.

Não tenho certeza se isso é relevante ou não, mas por NÃO usar o "mail helper" economizei uma quantidade imensurável de tempo. Isso depois de ficar tão frustrado que fiz o downgrade para 2.0 de propósito. Estou apenas usando uma função do tipo de fábrica para gerar JSON V3 válido e agora estou muito animado com as melhorias na API V3 (já que posso realmente usá-los agora).

Isso é algo com o qual eu também lutei no início. Eu acho que o
ajudantes provavelmente poderiam ser mais eficientes e fáceis de usar. Eu gostaria
até argumentar que talvez eles não devam fazer parte do módulo central do sendgrid,
para separar interesses e permitir que as pessoas optem por usá-los.

Vou dar uma outra olhada neles e ver se consigo encontrar algo concreto
sugestões.

Na sexta-feira, 26 de agosto de 2016, 05:48 Sean Lindo [email protected] escreveu:

Não tenho certeza se é por exemplo ou não, mas por NÃO usar o "auxiliar de correio"
Economizei uma quantidade imensurável de tempo. Isso é depois de conseguir
frustrado, fiz o downgrade para 2.0 propositalmente.

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

@seanlindo ,

Obrigado por nos fornecer alguns comentários!

Aqui está um exemplo de uso desta biblioteca sem o Mail Helper: https://github.com/sendgrid/sendgrid-nodejs#without -mail-helper-class

O Mail Helper é uma primeira versão e dependemos de comentários como os seus para nos ajudar a melhorar a próxima versão. Você se importa em compartilhar os problemas específicos que encontrou para que possamos criar tíquetes para corrigi-los?

Além disso, estou adicionando seu voto à nossa tarefa de backlog para melhorar o Mail Helper e ajudá-lo a subir na fila. Obrigado!

@adambuczynski ,

Vejo que sua grandiosidade continua :)

Aguardo seu feedback, sei que será ótimo!

@julesbou ,

Iniciamos um arquivo USE_CASES.md onde forneceremos exemplos para casos de uso comuns. O primeiro foram os modelos de transação :)

Aguardo seu feedback, sei que será ótimo!

👻

@thinkingserious Certo! Dê-me um ou dois dias e eu darei um exemplo concreto.

Este é um dos meus tópicos favoritos aqui :)

Acho que seu feedback será crítico para a próxima iteração desta biblioteca, que provavelmente será uma mudança significativa. Se você tiver um momento, poderia dar uma olhada em nossa proposta? https://github.com/sendgrid/sendgrid-nodejs/issues/290

Obrigado!

@thinkingserious Eu finalmente entendi o que me incomoda tanto sobre todas as classes auxiliares Sendgrid introduzidas na v3 ... há muitas delas e tornam o envio de e-mails desnecessariamente complicado: P

Eu não queria revisar todo o código de Sendgrid, então decidi fazer um empacotador simples, sendgrid-mailer .

Embora as classes auxiliares de Sendgrid sejam úteis nos bastidores, para criar e validar modelos de email, não acho que elas devam ser forçadas apenas a interagir com a API. Acho que isso torna a escrita de aplicativos Node mais complicada do que deveria ser, e a nomenclatura dos ajudantes pode ser bastante confusa, por exemplo, Mail vs Email .

Acho que o exemplo básico ilustra bem o problema:

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

Isso parece muito complicado para algo tão básico como "Quero enviar um e-mail". Requer que você carregue 8 dependências diferentes e escreva 15 linhas de código antes de enviar um e-mail.

Não usar as classes auxiliares é indiscutivelmente ainda pior, já que você precisa conhecer a estrutura necessária da solicitação JSON de email e preenchê-la corretamente. Um erro quebrará o pedido facilmente.

Então eu abstraiai toda a lógica das classes auxiliares atrás de um auxiliar API simples e fácil de usar, para que enviar e-mails com Sendgrid se tornasse fácil e divertido novamente :)

O exemplo mais básico se torna:

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

A solicitação é construída nos bastidores e usa os ajudantes do Sendgrid de maneira transparente.

Ele também suporta o envio de vários e-mails, expõe o objeto Sendgrid no caso de personalização adicional ser necessária, também aceita instâncias de Sendgrid Mail e uma ampla variedade de formatos para os campos de / para, por exemplo, Name <[email protected]> ou um objeto com propriedades de nome / email. Veja o README para mais detalhes.

Provavelmente ainda há espaço para melhorias, mas eu gostaria de compartilhar esta solução aqui para pessoas que procuram usar a API Sendgrid sem se sobrecarregar com ela.

Espero que seja útil para alguém e talvez possa fornecer alguma direção para o futuro desta biblioteca, expondo uma API mais simples :)

cc @julesbou um pouco tarde, mas espero que você ainda encontre um uso para ele.

@adamreisnz sério, obrigado.

Meu trabalho em segundo plano que envia e-mails via sendgrid estava usando a v4.0.7, que já era complicado o suficiente. Eu atualizei para a versão mais recente e, infelizmente, tudo quebrou. Fiquei tão frustrado com a complexidade de enviar um e-mail que nem me incomodei em atualizar.

Dito isso, a simplicidade disso é exatamente o que eu procurava. Vou tentar no fim de semana.

Felicidades!

@jamesdixon Eu ainda estava preso na v3.xx e também não queria atualizar :)

Esperançosamente, você vai achar isso útil. Deixe-me saber como funciona para você e se houver alguma coisa crítica faltando, obrigado!

@adamreisnz ,

Isso é INCRÍVEL e obrigado por compartilhá-lo com nossa comunidade :)

tldr; nossas aulas de auxiliar não terminaram e você já chegou antes de nós :)

Concordamos totalmente com sua opinião e esta é a fase de atualização da biblioteca v3 na qual estamos trabalhando atualmente em todos os 7 de nossos SDKs. Consulte o projeto Mail Helper Enhancement aqui para obter mais detalhes sobre o projeto Node.js.

Atualmente, estamos finalizando a biblioteca C #. Para obter um exemplo concreto do que planejamos para esta biblioteca Node.js, consulte isto . Esperamos lançar esse dentro de alguns dias.

Então, eu tenho uma proposta:

Você se importaria de adicionar sua solução ao Mail Helper aqui (semelhante ao que fizemos em C #)? Acho que seu trabalho teria um alcance maior nesse caso. Se não, não há problema algum. Já que você postou seu projeto sob a licença do MIT, espero que você nos perdoe se emprestarmos um pouco do seu bom trabalho;) E, claro, vamos garantir que você receba crédito por suas contribuições.

Se você decidir manter seu trabalho separado, poderia adicionar um link aqui na seção Bibliotecas da comunidade?

Obrigado pelo seu incrível apoio contínuo. Você é demais!

@thinkingserious fico feliz em saber que você está pensando em seguir na mesma direção. O exemplo C # parece melhor, mas acho que ainda é um pouco complicado para uma implementação JS. Fazer tudo em classes nem sempre é necessariamente a melhor maneira de usar JS.

Quanto à sua proposta, como ainda estou usando as classes auxiliares por baixo do capô, não sei o quanto seria realmente útil para portar para a biblioteca oficial. Eu provavelmente estaria mais inclinado a ajudar com uma grande reescrita (por exemplo, v5) e começar do zero, pegando a opinião dos usuários e da comunidade Node e criar uma API incrível que seja fácil de usar, mas flexível, se necessário.

Mas se nesse meio tempo você quiser pegar emprestado algum código do meu wrapper para usar na biblioteca oficial, vá em frente :) Vou adicionar o link para meu wrapper naquela página 🎉

Na verdade, acho que pode ser uma boa ideia dividir o projeto em dois pacotes, um nível inferior que inclui a lógica de solicitação para interagir com a API e um nível superior apenas para enviar emails, semelhante ao que criei.

O pacote de nível inferior poderia ser usado para pessoas que precisam de acesso total à API, enquanto o pacote de mala direta seria adequado para pessoas que desejam apenas enviar e-mails. E, claro, nos bastidores, o remetente usaria o pacote API.

@thinkingserious, o que você

@adamreisnz ,

Obrigado pelo feedback atencioso, como sempre.

Não tenho certeza se precisamos dividir o projeto neste momento. Acho que podemos alcançar resultados semelhantes com o modelo auxiliar atual. Dito isso, estou aberto para explorar uma nova arquitetura em uma versão futura e adoraria ter você a bordo para isso.

Esperançosamente, outras pessoas da comunidade participem.

Vou pensar mais sobre isso e voltar a me envolver quando chegar a hora de implementar o Mail Helper atualizado.

Obrigado novamente por seu apoio e por adicionar o link aos nossos documentos!

É uma questão de separar as preocupações. Você poderia incluir um ajudante / invólucro para facilitar o envio de correspondência dentro da biblioteca principal, mas, em minha opinião, isso é uma mistura de duas preocupações distintas, com provável prejuízo ou complicação desnecessária de ambas. Mantê-los separados permitirá que os consumidores escolham a biblioteca de que precisam (ou ambas) e provavelmente tornaria o desenvolvimento de ambas as bibliotecas mais fácil devido aos limites claramente definidos.

Acho que é da natureza dos módulos Node e npm ter o máximo possível de separação de interesses e fazer com que cada pacote execute uma tarefa específica (e seja bom nisso!). É algo com o qual eu tive que me acostumar quando comecei com o Node, mas depois que fiz, gostei da liberdade e da capacidade de desenvolver pacotes simples e limpos que ele oferece.

Ansioso para ouvir alguns comentários da comunidade.

Bem, você é definitivamente persuasivo com um argumento sólido :)

Eu realmente aprecio você dedicar seu tempo para elaborar.

Eu já estava ansioso para voltar a trabalhar nesta biblioteca e agora você me deixou muito animado para voltar a trabalhar neste SDK com você e a comunidade.

Ótimo, deixe-me saber quando você vai trabalhar nisso :)
Estou de licença por 4 semanas, o que significa que finalmente terei algum tempo livre para trabalhar em projetos de código aberto também 🌴

@adamreisnz ,

Parabéns!

Um "pacote de mala direta" de nível muito mais alto é exatamente o que queremos. Só preciso enviar alguns emails.

Com a última versão era muito simples, e agora é uma bagunça profana. O exemplo "básico" atualmente possui 8 vars definidos , exigindo construtores especiais. Grande retrocesso em termos de facilidade de uso.

Deve ser tão simples quanto

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

Zero docs são necessários, apenas um exemplo que podemos copiar e colar no nosso caminho. Esse é o principal valor do SendGrid para nossa equipe e, infelizmente, agora não existe.

@adamreisnz Parece ótimo; decisões de design muito óbvias. Espero que você esteja na folha de pagamento do SendGrid!

@thinkingserious por favor considere seriamente apontar os documentos principais para o projeto @adamreisnz , já que simplifica tudo significativamente, e se eu soubesse sobre isso hoje, teria me poupado horas de dor de cabeça tentando usar o que imho é um Java com excesso de engenharia API inspirada em JS. Dê aos seus usuários o que eles querem, não o que você acha que eles querem :-)

Além disso, apenas para observar que não ficaria surpreso se outros desenvolvedores começassem a chegar aqui com mais frequência agora que a API V2 foi desativada e novas contas serão forçadas a usar a API V3. Pessoalmente, a primeira coisa que tentei foi usar o nodemailer (cujo transporte sendgrid ainda funciona com v2) que fez sentido para dezenas de projetos no passado, mas demorou uma eternidade para começar a funcionar desta vez. Se eu tivesse que adivinhar, dada a popularidade do nodemailer na comunidade do node, não serei o único a se sentir assim nos próximos meses.

@ fisch0920 obrigado por seus comentários, estarei trabalhando junto com @thinkingserious nas próximas semanas para melhorar a API Sendgrid. Esperamos encontrar algo que seja fácil de usar, mas ainda flexível o suficiente quando necessário.

Olá a todos,

Achei que você pudesse se interessar pelo redesenho do SendGrid Node.js Mail Helper: https://github.com/sendgrid/sendgrid-nodejs/pull/378

Seu feedback seria muito apreciado!

Obrigado pela atenção,

Elmer

Passe para # 378 para atualizações, obrigado!

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

Questões relacionadas

murphman300 picture murphman300  ·  4Comentários

mikemaccana picture mikemaccana  ·  4Comentários

prasoonjalan picture prasoonjalan  ·  3Comentários

nicoasp picture nicoasp  ·  3Comentários

amlcodes picture amlcodes  ·  4Comentários