Nodemailer e Handlebars
1. 📩 Estrutura Funcional
1.1 Instalação
$ yarn add nodemailer
1.2 Provedores de e-mail
- Amazon SES (o melhor)
- Mailgun
- Sparkpost
- Mandril (Mailchimp)
- Mailtrap (ambientes de desenvolvimento)
1.3 Arquivo de configurações src/config/mail.js
As informações abaixos, caso obtidos pelo mailtrap encontram-se em SMTP Settings
export default {host: '', // Host do e-mail. Exemplo: smtp.mailtrap.ioport: '', // Porta do e-mail. Padrão: 2525secure: false, // Segurança do e-mail.auth: { // Login para autenticaruser: '',pass: '',},default: {from: 'Nome do Remetente <noreply@email.com>',},};
1.4 Arquivo de configurações src/lib/Mail.js
Arquivo de configurações gerais do NodeMailer
import nodemailer from 'nodemailer';import mailConfig from '../config/mail';class Mail {constructor() {const { host, port, secure, auth } = mailConfig;this.transporter = nodemailer.createTransport({host,port,secure,auth: auth.user ? auth : null,});}sendMail(message) {return this.transporter.sendMail({...mailConfig.default,...message,});}}export default new Mail();
1.5 Importação do Mail.js nos Controllers (exemplo)
import Mail from '../../lib/Mail'; // Importação da lib Mailawait Mail.sendMail({to: `${appointment.provider.name} <${appointment.provider.email}>`,subject: 'Agendamento cancelado',// O text é para enviar apenas um texto.text: 'Você tem um novo cancelamento.',// Caso utilizar o nodemailer hbs, utilizar OS DOIS métodos abaixo.template: 'cancellation', // Não utiliza o .hbscontext: {provider: appointment.provider.name,user: appointment.user.name,date: format(appointment.date, "'dia' dd 'de' MMMM', às' H:mm'h'", {locale: pt,}),},});
2. 💅 Template Engines com HBS para o corpo do e-mail
2.1 Instalação
$ yarn add express-handlebars nodemailer-express-handlebars
2.2 Integração com o src/lib/Mail.js
Importações
import { resolve } from 'path';import exphbs from 'express-handlebars';import nodemailerhbs from 'nodemailer-express-handlebars';
Chamada dentro do método constructor()
this.configureTemplates();
Chamada fora do método constructor()
configureTemplates() {const viewPath = resolve(__dirname, '..', 'app', 'views', 'emails');this.transporter.use('compile',nodemailerhbs({viewEngine: exphbs.create({layoutsDir: resolve(viewPath, 'layouts'),partialsDir: resolve(viewPath, 'partials'),defaultLayout: 'default',extname: '.hbs',}),viewPath,extName: '.hbs',}));}
2.3 Configurações do Nodemailer Express Handlebars
Criação e estrutura de pastas para configurações do layout:
- src
- app
- views
- emails
- layouts
- default.hbs <- Arquivo de layout default
- partials
- cancellation.hbs <- Arquivo de e-mail para cancelamentos (exemplo)
- layouts
- emails
- views
- app