Takeaways -chave
- O NodeMailer é o módulo NPM mais popular para enviar e -mails dos aplicativos Node.js, com mais de três milhões de downloads por semana. Requer um servidor SMTP para enviar emails.
- A criação de e -mails HTML para diferentes clientes de email pode ser um desafio devido a vários mecanismos de renderização e limitações. Ferramentas e recursos como modelos pré-criados, ferramentas de design e linguagens de marcação por e-mail podem simplificar o processo.
- Para garantir a confiabilidade, é recomendável enviar dados de email para uma fila de tarefas em vez de enviar e -mails diretamente no aplicativo Node.js. Isso permite que o usuário continue usando o aplicativo enquanto o email está sendo processado.
- A leitura de e -mails recebidos nos aplicativos Node.js é possível usando módulos como o IMAPFlow. Isso pode ser útil para lidar com o registro de serviços, solicitações de cancelamento de inscrição, suporte automatizado e muito mais.
A maioria dos aplicativos da Web precisa enviar email. Pode ser para registro, redefinições de senha, relatórios de status, embora para campanhas de marketing completas, como boletins e promoções. Este tutorial explica como enviar email no Node.js, mas os conceitos e desafios se aplicam aos sistemas que você está usando.
Você encontrará muitos módulos relacionados a e-mails em npm. O mais popular é NodeMailerque recebe mais de três milhões de downloads toda semana.
Para usá -lo, você precisará de um servidor SMTP que possa enviar email. Você pode usar seu próprio provedor de e -mail, mas, para os fins desta demonstração, estou usando o grátis Servidor SMTP de teste wpoven.
Crie uma nova pasta do projeto:
mkdir emailtest
cd emailtest
Em seguida, crie um novo package.json
Arquivo com o seguinte conteúdo JSON:
{
"name": "emailtest",
"type": "module",
"main": "index.js",
"dependencies": {
"nodemailer": "^6.0.0"
}
}
Instale os módulos (NodeMailer):
npm install
e crie o seguinte index.js
código:
import nodemailer from 'nodemailer';
const transporter = nodemailer.createTransport({
host: 'smtp.freesmtpservers.com',
port: 25
});
try {
const send = await transporter.sendMail({
from: '"Test Email" ' ,
to: 'someone@example.com',
subject: 'Hello!',
text: 'Hello world!',
html: 'Hello world!
',
});
console.dir(send, { depth: null, color: true });
}
catch(e) {
console.dir(e, { depth: null, color: true });
}
(Considere mudar o to:
Endereço para algo único para que você possa examinar seus próprios e -mails de teste!)
Execute o código. Você deve ver um resultado com um 250 OK
response
e a messageId
:
$ node index.js
{
accepted: ( 'someone@example.com' ),
rejected: (),
ehlo: ( 'SIZE 33554432', '8BITMIME', 'SMTPUTF8', 'HELP' ),
envelopeTime: 486,
messageTime: 289,
messageSize: 595,
response: '250 OK',
envelope: {
from: 'test@email.com',
to: ( 'someone@example.com' )
},
messageId: '<4673597e-a9e4-e422-85f7-4422edf31774@email.com>'
}
Verifique a caixa de entrada do to:
endereço que você usou inserindo -o no Página do servidor SMTP de teste wpoven e clicando Caixa de entrada de acesso. Clique no “Olá!” mensagem para examinar o conteúdo.
NodeMailer Basics
Para enviar e -mails, você deve criar um noilador transportador Objeto de definir o tipo de serviço. SMTP é mais comum, mas outros estão disponíveis Para serviços alternativos. Geralmente é necessário um ID de usuário e a senha de autenticação:
import nodemailer from 'nodemailer';
const transporter = nodemailer.createTransport({
host: 'smtp.yourserver.com',
port: 587,
auth: {
user: 'myid@yourserver.com',
pass: 'my-password'
},
});
Você pode enviar e -mails para um ou mais destinatários usando o transportador sendMail()
método:
const send = await transporter.sendMail({
from: '"Test Email" ' ,
to: 'someone@example.com, sometwo@example.com',
cc: 'somethree@example.com',
bcc: 'somefour@example.com',
subject: 'Hello!',
text: 'Plain text version of the message',
html: 'HTML version of the message
',
});
Todos os clientes de email suportam mensagens de texto simples. Você também pode enviar uma versão rica da mesma mensagem usada quando o cliente de email suporta HTML (mais sobre isso abaixo).
NodeMailer fornece bastante Outras opções de mensagensmas o mais comum é anexos. Uma variedade de objetos define nomes de arquivos e conteúdo. Por exemplo:
const send = await transporter.sendMail({
attachments: (
{
filename: 'text1.txt',
path: '/path/to/file1.txt'
},
{
filename: 'text2.txt',
path: 'https://myserver.com/text2.txt'
},
{
filename: 'text3.txt',
content: 'This is the file content!'
},
{
filename: 'text4.txt',
path: 'data:text/plain;base64,SGVsbG8gd29ybGQh'
}
)
});
Envio de serviços
É fácil enviar e-mails únicos simples, mas não subestime o desafio à medida que seus requisitos evoluem.
-
Você pode não ter um servidor SMTP. Nem todos os serviços de email fornecem SMTP (o Google é Retirando o suporte básico de SMTP no Gmail).
-
A maioria dos serviços limita os e -mails de saída. Se você estiver enviando muitos e -mails, poderá atingir o limite do seu provedor. Nesse ponto, todos os e -mails que passam pelo mesmo serviço fracassarão: esse é o seu boletim informativo e mensagens pessoais e comerciais.
-
Você pode se tornar um spammer. É fácil para os destinatários marcar seu e -mail como “lixo” – mesmo quando não é. Quando um número suficiente de pessoas faz isso, você pode descobrir que todos os e -mails do seu domínio ficam bloqueados na Internet.
É melhor usar um serviço de email dedicado em vez do seu próprio servidor de email. Os serviços a seguir reduzem os problemas em potencial e alguns oferecem planos gratuitos para aqueles com baixos requisitos de uso:
Arquitetura de aplicativos assíncronos
Enviar um único e -mail geralmente é rápido, mas:
- O servidor SMTP pode estar diminuindo para que as tentativas sejam necessárias, ou
- A mensagem pode ser pega no meio de uma postagem de boletim informativo em massa
Em vez de enviar e -mails diretamente no seu aplicativo Node.js, geralmente é melhor enviar os dados para um fila de tarefas. O usuário final não precisa esperar por uma resposta e pode continuar a usar o aplicativo.
Outro processo pode monitorar a fila de email, enviar a próxima mensagem e requer itens quando ocorrer uma falha.
Criação de e -mails HTML
HTML5 e CSS3 funcionam consistentemente bem nos navegadores modernos. Os clientes de email são outro assunto, levando -nos de volta aos frustrantes dias dos dias dos anos 90 de tabelas e estilos em linha.
Estes são alguns dos problemas que você enfrentará:
-
Existem dezenas de clientes de email nativos e baseados na Web, incluindo Gmail, Yahoo Mail, Apple Mail, iOS Mail, Android Mail, Windows Mail, Outlook, Outlook.com, (novo) Outlook, Thunderbird, AOL, Garws, Roundcube e, portanto, assim sobre.
-
Todos usam seus próprios motores de renderização estranhos e maravilhosos com problemas e bugs únicos. Um pouco bizarramente, o Outlook usou o Microsoft Word para renderizar HTML desde 2007 (embora a nova versão de visualização seja baseada no navegador).
-
A maioria dos clientes bloqueia ou limita fontes, imagens, rastreadores, consultas de mídia, iframes, vídeos, áudio, formulários e scripts.
-
Mesmo os clientes de email baseados na Web em execução no navegador devem remover HTML, CSS e JavaScript que são perigosos ou que podem afetar o layout da interface do usuário. Por exemplo, não deve ser possível para um email clicar automaticamente seus próprios links ou posicionar absolutamente um elemento sobre um botão de exclusão.
-
Os clientes de email podem reformar seu HTML para garantir que seja uma única coluna ou adere às preferências do modo claro/escuro do usuário.
É possível Código de mão HTML E-mails Mas, a menos que seu layout seja simples, é difícil, frustrante e propenso a erros. As seções a seguir sugerem ferramentas e recursos que podem facilitar sua vida.
Modelos de e-mail pré-criados
Os sites a seguir fornecem modelos de e -mail robustos gratuitos e comerciais que você pode visualizar, baixar e usar com o mínimo esforço:
Ferramentas de design de modelo de e -mail
As seguintes ferramentas de design sem código permitem criar seus próprios modelos de e-mail HTML usando um editor Wyswyg mais simples:
Alguns desses serviços também fornecem instalações de validação e teste de código.
Conversão de modelo de email
Preparador é uma ferramenta da Web que pega um URL da página ou código-fonte colado e o transforma em modelos de texto HTML e texto sem formatação compatíveis por email. Há um Rest API e Node.js premailer-api
módulo Se você precisar automatizar o processo.
Ferramentas semelhantes incluem:
Ferramentas de marcação de modelo de e -mail
CerberusAssim, Estrutura de emailAssim, Esqueleto de e -maile Bom código de e -mail Forneça trechos de componentes HTML que você pode copiar e adaptar em seus próprios modelos.
Heml e Mjml são idiomas de marcação por e -mail. Eles são semelhantes ao HTML, mas impedem problemas de compatibilidade típicos. Maizizle adota uma abordagem semelhante usando Tailwind CSS.
Parcela é um editor de código que entende a formatação de email e pode mostrar visualizações. Você também encontrará muito Extensões de email para o código VS.
Caniemail.com é o equivalente de email da página da web caniuse.com e relata se um recurso HTML ou CSS específico é utilizável em vários clientes. Finalmente, Email acessível fornece recursos e links associados.
Ferramentas de teste de email
Embora um email HTML possa funcionar em seus próprios aplicativos de e -mail, você pode ter certeza de que ele funciona em outras pessoas? As ferramentas a seguir ajudarão, mas não há substituto para testar uma variedade de dispositivos reais, sistemas operacionais e e -mails.
Verificação de email em HTML e MailTrap Validar seu código -fonte e relatar problemas que você pode encontrar em clientes específicos.
EmailPreviewAssim, Mailosaure Serviços de visualização por e -mail Forneça instalações de visualização de layout para que você possa verificar como seu design parecerá uma variedade de clientes.
Finalmente, Tornassus e E -mail em ácido Tenha uma variedade de ferramentas para validar o código, verificar a acessibilidade, visualizar entre clientes, registrar análises e executar campanhas de marketing completas.
Aprenda a codificar e -mails da maneira certa
Como vimos acima, existem muitas ferramentas que podem ajudá -lo a criar layouts de email que funcionam nos muitos clientes de e -mail. Mas não há nada como entender como codificar sozinho, especialmente quando você precisa resolver os bugs inevitáveis que surgem.
Se você quiser aprender os meandros da codificação por e -mail (mesmo que seja apenas como um backup), confira Criação de e -mail HTMLpor Rémi Parmentier. Ele abrange perspectivas modernas sobre a construção de seus próprios modelos de e -mail, práticas recomendadas essenciais, como adicionar interatividade aos e -mails e como tornar seus modelos acessíveis. Até o leva a um estudo de caso para ver tudo isso na prática.
Lendo e -mail recebido
A maioria dos aplicativos precisa apenas enviar e -mails, mas pode haver ocasiões em que você deseja examinar e -mails recebidos – para itens como registro de serviço, contratação de inscrição, suporte automatizado e assim por diante. Embora esteja além do escopo deste tutorial, módulos Node.js IMAPFLOW Permita que seu aplicativo se conecte a uma caixa de entrada IMAP, busque mensagens e processe uma resposta:
import ImapFlow from 'imapflow';
const client = new ImapFlow({
host: 'imap.email',
port: 993,
secure: true,
auth: {
user: 'account@imap.email',
pass: 'mypassword'
}
});
try {
await client.connect();
const lock = await client.getMailboxLock('INBOX');
const msg = await client.fetchOne(client.mailbox.exists, { source: true });
console.log( msg.source.toString() );
lock.release();
await client.logout();
}
catch (e) {
console.log(e);
}
Conclusão
O envio de e -mails do Node.JS Web Apps é fácil. Enviar e -mails que parecem bons, trabalham de maneira confiável em todos os clientes de email, não interrompem o usuário e não causam problemas de spam pode ser consideravelmente mais difícil.
Eu recomendo que você mantenha e -mails simples para começar, talvez optando por mensagens de texto simples pouco frequentes. Obviamente, seus clientes e departamento de marketing em breve desejam cores e animações sofisticadas, mas você pode entregar isso amanhã!
Perguntas frequentes (perguntas frequentes) sobre o envio de e -mails usando o node.js
Como posso anexar arquivos aos meus e -mails usando node.js?
Anexar arquivos aos seus e -mails usando o Node.js é bastante direto. Você pode usar a propriedade ‘Anexos’ nas opções de email. Esta propriedade exige uma variedade de opções de anexo. Cada opção de anexo é um objeto que contém o nome do arquivo e as propriedades do caminho. A propriedade FileName é o nome do arquivo, como aparecerá no email e a propriedade Path é o local do arquivo no seu sistema.
Aqui está um exemplo:
let mailOptions = {
from: 'sender@example.com',
to: 'receiver@example.com',
subject: 'Hello',
text: 'Hello world',
attachments: (
{
filename: 'file.txt',
path: '/path/to/file.txt'
}
)
};
Posso enviar e -mails html usando o node.js?
Sim, você pode enviar e -mails HTML usando o Node.JS. Em vez de usar a propriedade ‘Text’ nas opções de email, você usa a propriedade ‘HTML’. O valor desta propriedade é o conteúdo HTML do email.
Aqui está um exemplo:
let mailOptions = {
from: 'sender@example.com',
to: 'receiver@example.com',
subject: 'Hello',
html: ''
};
Como posso enviar e -mails para vários destinatários?
Para enviar e -mails para vários destinatários, você pode fornecer uma lista de endereços de email separados por vírgulas na propriedade ‘para’ das opções de email.
Aqui está um exemplo:
let mailOptions = {
from: 'sender@example.com',
to: 'receiver1@example.com, receiver2@example.com',
subject: 'Hello',
text: 'Hello world'
};
Como posso lidar com erros ao enviar e -mails?
Você pode lidar com erros ao enviar e -mails usando uma função de retorno de chamada. Esta função é passada como o segundo argumento para o método ‘Sendmail’. A função de retorno de chamada leva dois parâmetros: um objeto de erro e um objeto de informação. Se ocorrer um erro ao enviar o email, o objeto de erro conterá informações sobre o erro.
Aqui está um exemplo:
transporter.sendMail(mailOptions, function(error, info){
if (error) { console.log(error); } else {console.log('Email sent: ' + info.response); } });
Posso usar uma conta do Gmail para enviar e -mails?
Sim, você pode usar uma conta do Gmail para enviar e -mails. No entanto, você precisa ativar ‘aplicativos menos seguros’ nas configurações da sua conta do Gmail. Além disso, você precisa usar ‘smtp.gmail.com’ como host e 587 como a porta nas opções do transportador.
Aqui está um exemplo:
let transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 587,
auth: {
user: 'your-email@gmail.com',
pass: 'your-password'
}
});
Como posso enviar e -mails de forma assíncrona?
Você pode enviar e -mails de forma assíncrona usando promessas. O método ‘Sendmail’ retorna uma promessa que resolve com um objeto de informação quando o email é enviado.
Aqui está um exemplo:
transporter.sendMail(mailOptions)
.then(info => console.log('Email sent: ' + info.response))
.catch(error => console.log(error));
Posso usar um servidor SMTP personalizado para enviar e -mails?
Sim, você pode usar um servidor SMTP personalizado para enviar emails. Você precisa fornecer os detalhes do host, porta e autenticação do servidor SMTP nas opções do transportador.
Aqui está um exemplo:
let transporter = nodemailer.createTransport({
host: 'smtp.example.com',
port: 587,
auth: {
user: 'username',
pass: 'password'
}
});
Como posso enviar e -mails com um charset específico?
Você pode enviar e -mails com um charset específico usando a propriedade ‘Charset’ nas opções de email. Esta propriedade define o charset do email.
Aqui está um exemplo:
let mailOptions = {
from: 'sender@example.com',
to: 'receiver@example.com',
subject: 'Hello',
text: 'Hello world',
charset: 'UTF-8'
};
Posso enviar e -mails com um tipo de conteúdo específico?
Sim, você pode enviar e -mails com um tipo de conteúdo específico. Você pode usar a propriedade ‘ContentType’ nas opções de email. Esta propriedade define o tipo de conteúdo do email.
Aqui está um exemplo:
let mailOptions = {
from: 'sender@example.com',
to: 'receiver@example.com',
subject: 'Hello',
text: 'Hello world'
contentType: 'text/plain
};
Como posso enviar e -mails com uma codificação específica?
Você pode enviar e -mails com uma codificação específica usando a propriedade ‘codificação’ nas opções de email. Esta propriedade define a codificação do email.
Aqui está um exemplo:
let mailOptions = {
from: 'sender@example.com',
to: 'receiver@example.com',
subject: 'Hello',
text: 'Hello world',
encoding: 'base64'
};