Три способа отправки электронной почты в Node: транзакционные почтовые службы, AWS SES и настраиваемые SMTP-серверы. Плюс как их проверить.

О

Отправка электронных писем - основное требование многих современных предприятий. Будь то квитанции по счетам, сброс пароля или сообщения службы поддержки, многие приложения программно отправляют электронные письма в ответ на различные события. В наши дни отправлять электронные письма очень просто, и не требуется знание SMTP, POP3 или IMAP! Вот три способа отправки электронной почты в NodeJS и способы их тестирования.

Услуги транзакционной почты

Существует множество API-интерфейсов электронной почты как услуги. Некоторые из самых популярных имен включают SendGrid, MailJet, MailGun. Каждый из них предлагает разные функции и модели ценообразования, но все они отправляют электронные письма по запросу через API-запросы.

Обычно требуется настройка службы, чтобы разрешить отправку из личного домена. После этого электронные письма обычно отправляются с запросом SDK и REST API. В этом примере мы продемонстрируем отправку электронных писем с помощью SDK SendGrid и Node.

Установка SendGrid SDK

Вы можете получить официальную библиотеку Javascript SendGrid от NPM.

npm install -s @sendgrid/mail

Отправка электронного письма с помощью SendGrid

Отправить электронное письмо очень просто. Просто укажите свой ключ API и опишите сообщение, которое хотите отправить. Наконец, вызовите send и позвольте SendGrid сделать все остальное.

// get a instance of sendgrid and set the API key
const sendgrid = require('@sendgrid/mail');
sendgrid.setApiKey(SENDGRID_API_KEY);
// construct an email
const email = {
  to: '[email protected]',
  from: '[email protected]',
  subject: 'My first email',
  text: 'Hello world',
};
// send the email via sendgrid
sendgrid.send(email)

SendGrid также поддерживает свойство html для отправки электронных писем в формате HTML. Он также имеет многофункциональную систему шаблонов с дизайнером пользовательского интерфейса на основе браузера. Цены разумные, но для большего контроля попробуйте следующий вариант: AWS SES.

Электронная почта как инфраструктура

Если вы запустите свое приложение в облачной инфраструктуре, скорее всего, у вашего облачного провайдера будет служба отправки электронной почты. Amazon AWS имеет Простую службу электронной почты под названием SES. Это отличный вариант для тех, кто хочет немного больше контроля. Вы можете определять домены электронной почты и правила маршрутизации с помощью Terraform, чтобы электронная почта стала управляемой частью вашей инфраструктуры.

Настройте AWS SES с Terraform

SES требует небольшой настройки, но после включения его можно легко использовать с NodeJS. Всю инфраструктуру AWS можно включить вручную в консоли, но лучший способ управлять облачными ресурсами - использовать Terraform.

Вот как настроить домен SES с Terraform. Это позволит нам отправлять электронные письма с определенного адреса.

resource "aws_ses_domain_identity" "example" {
  domain = "yourdomain.com"
}
resource "aws_route53_record" "example_amazonses_verification_record" {
  zone_id = "your_zone_id"
  name    = "_amazonses.yourdomain.com"
  type    = "TXT"
  ttl     = "600"
  records = ["${aws_ses_domain_identity.example.verification_token}"]
}

Отправка электронной почты с помощью AWS SES и Node

Итак, теперь, когда SES настроена, мы можем вызывать ее из Node. Для начала нам понадобится AWS SDK.

npm install -s aws-sdk

Теперь давайте создадим скрипт для отправки электронного письма.

// configure the AWS sdk
const AWS = require('aws-sdk');
AWS.config.update({region: 'us-west-2'});
// Create email params
const params = {
  Destination: { 
    ToAddresses: [
      '[email protected]'
    ]
  },
  Message: { 
    Body: { 
      Text: {
       Charset: "UTF-8",
       Data: "Hello world!"
      }
     },
     Subject: {
      Charset: 'UTF-8',
      Data: 'My email subject'
     }
    },
  Source: '[email protected]', 
};
// Create the promise and SES service object
const sendPromise = new AWS
  .SES({apiVersion: '2010-12-01'})
  .sendEmail(params)
  .promise();
// Handle promise's fulfilled/rejected states
sendPromise.then(data => {
    console.log(data.MessageId);
  }).catch(err => {
    console.error(err, err.stack);
  });

Пользовательский SMTP-сервер

Хотя сервисы транзакционной почты и SES довольно просты, если вам нужен полный контроль, лучше всего развернуть собственный SMTP-сервер.

Вы можете развернуть SMTP-сервер на Kubernetes с небольшой настройкой и настройкой. Я не буду вдаваться в подробности, это довольно большая работа. Примечание. Решения SMTP предлагаются только в том случае, если у вас есть необычные требования к отправке электронной почты.

Отправка электронной почты через SMTP в Node

После этого вы сможете легко взаимодействовать со своим SMTP-сервером с помощью пакета NPM nodemailer.

npm install -s nodemailer

А вот пример отправки электронного письма с помощью nodemailer.

const nodemailer = require("nodemailer");
const transporter = nodemailer.createTransport({
  host: "smtp.yourdomain.email",
  port: 587,
  secure: false,
  auth: {
    user: SMTP_USER
    pass: SMTP_PASSWORD
  }
});
// send mail with defined transport object
transporter.sendMail({
  from: '"YourCompany" <[email protected]>', 
  to: "[email protected]", 
  subject: "Test email", 
  text: "Hello world"
});

Проверка отправки электронной почты

Итак, мы только что рассмотрели три различных способа отправки электронных писем с помощью Node. Но как это проверить? Мы могли протестировать наши скрипты вручную и использовать наши собственные адреса электронной почты в качестве получателей, но этот процесс медленный и ненадежный. В идеале мы хотим тестировать отправку электронной почты автоматически как часть сквозного или дымового теста.

С MailSlurp вы можете создавать новые почтовые ящики для входящих сообщений на лету, отправлять им электронные письма, используя свой сервис, а затем проверять результаты - и все это в рамках набора тестов.

Установить MailSlurp SDK

Сначала вы хотите подписаться на MailSlurp - это бесплатно. Затем давайте установим MailSlurp SDK и тестовую платформу Jest (вы можете использовать любую платформу, которая вам нравится).

npm install -s jest mailslurp-client

Проверка писем с помощью Jest

Напишем простой тест, который:

  • создает новый адрес электронной почты с MailSlurp
  • вызывает функцию отправки электронной почты нашего сервиса
  • отправляет электронное письмо на наш адрес MailSlurp
  • вызывает MailSlurp, чтобы получить это письмо
  • проверяет результаты

Используя пример SendGrid в качестве основы, наш тест может выглядеть примерно так:

// can your app handle inbound emails
import { MailSlurp } from "mailslurp-client"
const api = new MailSlurp({ apiKey: "test" })
test('my app can send emails', async () => {
    // create a new email address for this test
    const inbox = await api.createInbox()
    // trigger an app action that sends an email
    await signUpForMyApp(inbox.emailAddress)
    // fetch sent email from the inbox
    // include a retryTimeout and minCount so that
    // MailSlurp waits for an email
    const emails = await api.getEmails(inbox.id, { minCount: 1, retryTimeout: 60000 })
    // assert that the correct email was sent
    expect(emails[0].length).toBe(1)
    expect(emails[0].content).toBe("Hello world")
})

Вот и все! Теперь вы можете протестировать свои функции отправки электронной почты с реальными адресами электронной почты, чтобы убедиться, что ваши электронные письма работают.

Резюме

В наши дни отправлять электронные письма очень просто. Доступно множество услуг, каждая с разными функциями, ценами и контролем. Для быстрого старта попробуйте SendGrid, MailJet или MailGun. Для большего контроля попробуйте Amazon SES. Для еще большего контроля попробуйте запустить SMTP-сервер и использовать Nodemailer.

В каждом решении для электронной почты важно проверять, действительно ли сообщения отправляются и принимаются. Многие поставщики услуг электронной почты применяют фильтры спама, поэтому единственный способ убедиться, что ваши электронные письма работают, - это сквозное тестирование с использованием реальных адресов. К счастью, MailSlurp позаботился о вас. Зацени!