O e-mail continua sendo um dos métodos de comunicação escrita mais usados, especialmente para empresas. Seja para compartilhar informações de marketing, registros transacionais ou qualquer outra coisa, existem várias maneiras de enviar e-mails. Nesta postagem, veremos como podemos usar Node.js e SendGrid para enviar um e-mail de confirmação de pedido (transacional) para nossos clientes quando eles fizerem um pedido.

Por que usar SendGrid para enviar e-mails com Node.js?

Podemos enviar e-mails de várias maneiras a partir de qualquer linguagem de programação, incluindo Node.js. Poderíamos usar um pacote como Nodemailer , por exemplo, que pode usar vários transportes como SMTP, Sendmail ou até mesmo Amazon SES.

O problema com um SMTP ou Sendmail aleatório, no entanto, é que os e-mails provavelmente serão classificados como spam e chegarão às pastas de lixo eletrônico de nossos clientes. E definitivamente não queremos que isso aconteça.

Para resolver esse problema, é melhor usar um SaaS de e-mail confiável de terceiros. SendGrid é indiscutivelmente o líder da indústria no espaço de e-mail transacional. Seus preços começam em US $ 14,95 para 50 mil e-mails por mês.

Para nossos objetivos, porém, eles têm um plano gratuito que ainda nos permite enviar até 100 e-mails por dia. Além de uma entrega melhor, eles fornecem recursos essenciais, como análises e um editor de modelos.

Pré-requisitos

Abaixo estão alguns dos pré-requisitos para este tutorial prático:

  1. Você geralmente sabe como JavaScript e Node.js funcionam
  2. Você conhece a sintaxe async/await em JavaScript
  3. Você sabe como usar o comando node na linha de comando
  4. Você conhece a função Express.js e como os middlewares funcionam no Express.js

A seguir, começaremos a configurar o SendGrid para enviar e-mails. Vamos começar!

Como enviar e-mails com Node.js e SendGrid

Para enviar e-mails usando SendGrid do Node.js, primeiro precisamos nos registrar para uma conta SendGrid gratuita. Então, podemos seguir o guia passo a passo de integração da API de e-mail da seguinte maneira.

Registre e gere uma chave API no SendGrid

Para se registrar para uma conta gratuita, você precisará de um endereço de e-mail válido e uma senha de pelo menos 16 caracteres (dica profissional: você pode usar o Gerador de senha para isso):

Sendgrid API conta para gerar exibição da página inicial

Agora podemos clicar em Criar conta . Posteriormente, precisaremos fornecer mais detalhes sobre nós para continuarmos nos registrando no SendGrid:

SendGrid Criar conta seção de informações do usuário

Assim que tivermos registrado (e verificado nosso e-mail), podemos Criar um único remetente clicando no botão azul:

SendGrid API Gerar exibição da página inicial

No formulário de criação do remetente, preencha os detalhes da seguinte maneira (observe que é melhor não usar um e-mail geral como o Gmail):

Sende r Detalhes do usuário do formulário de criação

Depois disso, podemos clicar no botão azul Iniciar em Integrar usando nossa API da Web ou redirecionamento SMTP , conforme mostrado abaixo:

Integrate Web API Button SMTP Relay Choice

Posteriormente, teremos a opção de usar a API da Web ou o SMTP Relay . Selecione a opção Web API clicando no botão Escolher correspondente:

API SMTP Rela y Método de configuração

Agora selecione a opção Node.js , conforme abaixo:

SendGrid Setu p Guia Integrar

Então podemos gerar a chave API que usaremos em nosso código. Eu o chamei de primeira chave , mas você pode nomeá-lo como desejar. Copie a chave de API e mantenha-a segura-vamos usá-la na próxima etapa:

Gerar código de chave API

Podemos ir para o final do formulário acima e marcar a caixa Eu integrei o código acima e, a seguir, clique no botão Próximo: Verificar integração .

Se você efetuar logout e login novamente no SendGrid, será solicitado a habilitar a autenticação de dois fatores. Você pode configurá-lo com seu número de celular e SMS.

Feito isso, veremos como testar rapidamente o envio de e-mails com Node.js usando a chave de API SendGrid.

Configure um script Node.js simples para enviar e-mail

Para configurar um novo aplicativo Node.js com npm, podemos executar o seguinte:

 npm init-y

O sinalizador -y definirá todos os valores padrão para nós. A seguir, definiremos a chave API que criamos no arquivo sengrid.env e a adicionaremos a gitignore da seguinte maneira:

 echo"export SENDGRID_API_KEY='YOUR_API_KEY'"> sendgrid.env && echo"sendgrid.env">>.gitignore && source./sendgrid.env

Certifique-se de substituir YOUR_API_KEY no bloco acima pela chave API que geramos na etapa anterior.

Em seguida, instalamos o pacote @ sendgrid/mail npm, pois enviaremos apenas um e-mail, conforme o escopo deste tutorial:

 npm i--save @ sendgrid/mail

O comando acima adicionará a versão mais recente do pacote @ sendgrid/mail npm ao nosso package.json e o instalará localmente em nossos node_modules pasta.

A seguir, escreveremos o seguinte código para testar se podemos enviar e-mails com SendGrid:

 const sendGridMail=require ('@ sendgrid/mail');
sendGridMail.setApiKey (process.env.SENDGRID_API_KEY); function getMessage () { const body='Este é um e-mail de teste usando SendGrid do Node.js'; Retorna { para:'[email protected]', de:'[email protected]', assunto:'Testar e-mail com Node.js e SendGrid', texto: corpo, html: ` $ {body} `, };
} função assíncrona sendEmail () { tentar { aguarde sendGridMail.send (getMessage ()); console.log ('Email de teste enviado com sucesso'); } catch (erro) { console.error ('Erro ao enviar e-mail de teste'); console.error (erro); if (error.response) { console.error (error.response.body) } }
} (assíncrono ()=> { console.log ('Enviando e-mail de teste'); aguarde sendEmail ();
}) ();

Vamos revisar rapidamente o que o código acima está fazendo.

Em primeiro lugar, estamos incluindo o pacote @ sendgrid/mail e, em seguida, definimos a chave API da variável de ambiente.

Depois disso, temos uma função getMessage que constrói a mensagem de e-mail contendo para, de, assunto e corpo em formato de texto e HTML.

A seguir, adicionamos a função sendEmail , que obtém a mensagem e envia o e-mail usando o método send no pacote de e-mail SendGrid. Ele está envolvido em um try... catch para que possamos registrar quaisquer erros em potencial. Se for bem-sucedido, imprimimos um log dizendo Email de teste enviado com sucesso .

Está tudo colado com um ES8 assíncrono IIFE (expressão de função imediatamente invocada) para fazer tudo funcionar. Eu salvei como send-test-email.js na raiz do projeto.

Abaixo está uma captura de tela de como podemos executá-lo com node send-test-email.js :

eSendGrid Sendmail Package Node Run Code

Depois de alguns segundos, vi o e-mail na minha caixa de entrada:

Nodejs Send Grid Test Email Inbox

Nesse momento, podemos ir para a página Atividade de e-mail no SendGrid e pesquisar pelo Para o endereço de e-mail . Veremos que o e-mail foi enviado e aberto, conforme mostrado abaixo:

Sendgrid Email Activity Page

Viva! Nossa prova de conceito está funcionando. Você pode ver todas as alterações de código feitas até este ponto na solicitação pull . Agora, vamos transformá-lo em uma API que podemos chamar para qualquer e-mail de transação. A título de exemplo, enviaremos um e-mail de confirmação do pedido.

Crie a API de envio de e-mail de confirmação de pedido

Para um exemplo mais prático da vida real, criaremos agora uma API de envio de e-mail de confirmação de pedido. Esta API será chamada sempre que um usuário fizer um pedido com sucesso. Digamos que tenhamos um método de salvamento de pedido que faz quatro coisas:

Diagrama de quatro tarefas do método de salvar do pedido

Nossa chamada de API de envio de confirmação de pedido seria chamada depois que o pedido do cliente fosse salvo com sucesso no armazenamento de dados.

Para transformar nosso script de teste em uma API, precisaremos de um framework web; para isso, usaremos Express.js. Para instalar Express.js, execute o seguinte na raiz do projeto:

 npm i-salvar expresso 

Em seguida, adicionaremos dois arquivos: index.js , o servidor web; e email.js , o serviço para enviar o e-mail. O arquivo index.js está abaixo:

 const express=require ('express');
const email=require ('./email'); const app=express ();
porta const=3000 || process.env.PORT; app.use (express.json ());
app.use (express.urlencoded ({extended: false})); app.get ('/', (req, res)=> { res.json ({mensagem:'vivo'});
}) app.post ('/api/email/order-confirmation', async (req, res, next)=> { tentar { res.json (await email.sendOrderConfirmation (req.body)); } catch (errar) { próximo (errar); }
}); app.use ((err, req, res, próximo)=> { const statusCode=err.statusCode || 500; console.error (err.message, err.stack); res.status (statusCode).json ({'mensagem': err.message}); Retorna;
}); app.listen (porta, ()=> { console.log (`Exemplo de API ouvindo em http://localhost: $ {port}`)
});

Vamos examinar algumas das partes principais do servidor da web Express acima.

Primeiro, precisamos do Express e inicializá-lo. Em seguida, usamos middlewares codificados por JSON e URL para nos permitir aceitar dados para o endpoint POST para o e-mail de confirmação do pedido.

Depois disso, criamos uma rota / que mostrará uma mensagem como alive . A seguir, temos o cerne da questão, onde definimos uma API POST em /api/email/order-confirmation . Isso chama o método sendOrderConfirmation no módulo email que definiremos mais tarde.

Posteriormente, vemos um middleware de manipulador de erros básico que pode lidar com quaisquer erros lançados nas rotas acima. Por fim, iniciamos o servidor com app.listen e registramos que o servidor foi iniciado.

A seguir, veremos como nosso arquivo email.js é escrito. Usei o plano gratuito Stripo.email para gerar o e-mail de confirmação de pedido simulado; faz parte do modelo fornecido. Abaixo está nosso arquivo email.js , que compila o e-mail e o envia usando SendGrid:

 const sendGridMail=require ('@ sendgrid/mail');
sendGridMail.setApiKey (process.env.SENDGRID_API_KEY); function getOrderConfirmationEmailHtml (customerName, orderNr) { return `        Novo modelo de e-mail 2021-02-21              96        

Put your preheader text here

SEE THIS EMAIL ONLINE

Your order is confirmed.

Hi ${customerName}, we've received order № ${orderNr} and are working on it now.

We'll email you an update when we've shipped it.

View your order details
`; } function getMessage(emailParams) { Retorna { to: emailParams.toEmail, from:'[email protected]', subject:'We have got your order, you will receive it soon', text: `Hey ${emailParams.name}, we have received your order ${emailParams.orderNr}. We will ship it soon`, html: getOrderConfirmationEmailHtml(emailParams.name, emailParams.orderNr), }; } async function sendOrderConfirmation(emailParams) { try { await sendGridMail.send(getMessage(emailParams)); return { message: `Order confirmation email sent successfully for orderNr: ${emailParams.orderNr}`}; } catch (error) { const message=`Error sending order confirmation email or orderNr: ${emailParams.orderNr}`; console.error(message); console.error(error); if (error.response) { console.error(error.response.body) } return {message}; } } module.exports={ sendOrderConfirmation }

Let’s take a deeper look at what email.js is doing.

First we include the sendGrid mail module and add the API key to it. After that, we see a long function getOrderConfirmationEmailHtml, which has the HTML template of our order confirmation email. It takes in two variables, customerName and orderNr, that are filled in dynamically.

Next, we have a getMessage method that puts together the email message with to, from, subject, text, and HTML body. The HTML body is pulled in from the above getOrderConfirmationEmailHtml method.

Consequently, we have the async sendOrderConfirmation function that glues everything together with error handling. Here, we call the send method on the sendGridMail module passing the correct parameters we get from the getMessage function.

If all goes well, we respond back with a positive message inside an object. If there are any errors, we log them and respond back with an error message to the caller, which in this case is the route.

Only the sendOrderConfirmation is exposed from this module at the end of the email.js file.

After we have set up both files correctly, we can start the server with node index.js, which will show us something like the below:

Node Indexjs Server Start Display

Now, we can test our order confirmation email API with the following cURL command:

curl-i-X POST-H'Accept: application/json'\ -H'Content-type: application/json'http://localhost:3000/api/email/order-confirmation \ --data'{"name":"YourName","orderNr":"12344","toEmail":"[email protected]"}'

If everything goes well with the cURL command, we will see a 200 response like below:

Curl Command Success 200 Response

Then, we should be able to see that email in our inbox, too:

Order Confirmation Email Inbox

Congratulations! Our basic order confirmation email is working. As seen above, the two parameters — the customer’s name and order number — are dynamically placed in the email. All the code in this step with the Express.js web server is available in this pull request.

I know the HTML template for the email is a bit too long; we can replace it by using SendGrid’s Dynamic templates. This guide shows how to use it.

Scalability considerations

Depending on how many orders you get in a day, you might want to scale your email sending task. To do this, we mainly have two options.

The first is to use a queue system like RabbitMQ. Whenever a user successfully places an order, a producer will send a message to an exchange, which will be placed in one or more queues depending on the configuration.

Consumers would constantly listen to the queue and process the messages as they land in the queue. We can scale this approach by increasing the number of consumers as the number of messages grows.

Another low-maintenance way to scale the email sending task would be to use a serverless FaaS (function-as-a-service) — something like AWS Lambda or Vercel — to deploy our mini email sending service. The order placement logic can call this API in an async way so that even if the call fails, it is still OK.

The scalability here is handled by AWS, and as the resources are allocated per request, we don’t need to worry about resources, either. The cost factor might come into play if the scale is really big. I will leave further exploration on this topic to you. You may even find free Node.js hosting options that meet your needs.

Conclusão

We have seen how to send emails with Node.js using SendGrid in this step-by-step guide. The order confirmation is just one of many transactional emails we can send. If the email system is set up correctly and templates are dynamic, sending emails becomes a breeze with Node.js and SendGrid.

The post How to send emails with Node.js using SendGrid appeared first on LogRocket Blog.

Source link