Интеграция Amazon SES для email-рассылок
Отметим: когда суточный объём транзакционных писем превышает 50 000, стоимость отправки через SendGrid или Postmark становится заметной статьёй расходов. Amazon SES предлагает низкую стоимость за письмо, но его настройка требует понимания механизмов репутации: DKIM, SPF, DMARC, обработка bounces и complaints. Неправильная конфигурация может привести к блокировке домена провайдерами. Мы специализируемся на бесшовной интеграции SES с современными стеками — от Next.js до Laravel — с гарантией доставляемости 98%+. Опыт с AWS SES — десятки проектов с миллионными рассылками. Получите консультацию инженера сегодня — оценим ваш проект в течение дня.
Как выйти из песочницы SES?
По умолчанию SES работает в Sandbox — можно отправлять только на верифицированные адреса. Для production подайте запрос через AWS Console → SES → Account Dashboard → Request production access. Опишите use case: объём писем, тип (транзакционные или маркетинговые), меры по управлению репутацией. Обычно одобряется за 24 часа. Если нужно срочно — мы помогаем с заявкой. После выхода из песочницы вы сможете отправлять письма на любые адреса без ограничений.
Почему SES выгоднее конкурентов?
SES в несколько раз дешевле: при больших объёмах разница с SendGrid составляет тысячи долларов в месяц. В отличие от других провайдеров, SES даёт полный контроль: собственные IP-пулы, кастомные конфигурации, интеграция с CloudWatch для мониторинга. Благодаря SNS вы можете гибко реагировать на события и автоматически блокировать проблемные адреса, поддерживая репутацию отправителя на высоком уровне (Sender Score 95+).
| Критерий | Amazon SES | SendGrid | Postmark |
|---|---|---|---|
| Тип оплаты | Pay-as-you-go, без фикс. платы | Фиксированная плата + дополнительно | Фиксированная плата + дополнительно |
| Скорость отправки | Высокая, до 100+ писем/сек | Ограничена тарифом | Ограничена тарифом |
| Кастомизация | Полная: собственные IP, Configuration Set | Ограниченная | Ограниченная |
| Обработка bounces | Встроенная через SNS/SQS | Встроенная | Встроенная |
| Мониторинг | CloudWatch, SNS | Встроенный дашборд | Встроенный дашборд |
Кейс: миграция с SendGrid на SES
Из нашей практики — проект миграции с SendGrid на SES для крупного e-commerce клиента с объёмом 2 млн писем в месяц. Экономия составила более 80% — существенная сумма ежемесячно. Дополнительно настроили SNS/SQS для автоматической обработки bounces, что снизило показатель жалоб с 0.5% до 0.02%. Весь процесс занял 5 дней. Ключевым моментом была настройка максимальной репутации отправителя: мы провели процедуру прогрева IP-адресов и настроили DMARC политики.
Что входит в нашу работу
- Верификация домена, настройка DKIM, SPF, DMARC
- Создание IAM-пользователя с минимальными правами
- Настройка Configuration Set + SNS для событий
- Обработка bounces и complaints через SQS + Lambda
- Интеграция
@aws-sdk/client-sesв ваше приложение - Тестирование и документация
- Поддержка 6 месяцев после запуска
Процесс работы
- Аудит — анализируем текущие рассылки, объём, требования
- Проектирование — выбираем архитектуру (Lambda/EC2/Serverless)
- Реализация — настраиваем SES, пишем код
- Тестирование — проверяем доставляемость, спам-рейтинг
- Деплой — разворачиваем в production, настраиваем мониторинг
Типичные ошибки при настройке SES
Ошибка №1: игнорирование прогрева IP-адресов. Если начать отправлять с нового IP сразу миллион писем, провайдеры заблокируют его. Ошибка №2: неправильная настройка обратных DNS записей (PTR). AWS позволяет задать custom MAIL FROM, но его нужно верифицировать. Ошибка №3: отсутствие обработки bounces. Если не удалять жалобы и несуществующие адреса, репутация упадёт и письма будут уходить в спам. Мы автоматизируем этот процесс через SQS и Lambda.
Лимиты SES
| Тип лимита | Значение |
|---|---|
| Количество отправок в день в песочнице | Ограничено (требуется запрос на увеличение) |
| Максимальный размер письма | 10 MB |
| Количество получателей в одном запросе | 50 (через SendBulkTemplatedEmail) |
| Скорость отправки | До 100 писем/сек (может быть увеличено) |
Техническая реализация
Установка SDK и базовая отправка
npm install @aws-sdk/client-ses
import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';
const ses = new SESClient({
region: process.env.AWS_REGION ?? 'eu-west-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
},
});
async function sendEmail(params: {
to: string | string[];
subject: string;
html: string;
text?: string;
}) {
const command = new SendEmailCommand({
Source: 'Acme <[email protected]>',
Destination: {
ToAddresses: Array.isArray(params.to) ? params.to : [params.to],
},
Message: {
Subject: { Data: params.subject, Charset: 'UTF-8' },
Body: {
Html: { Data: params.html, Charset: 'UTF-8' },
...(params.text ? { Text: { Data: params.text, Charset: 'UTF-8' } } : {}),
},
},
// ConfigurationSetName для отслеживания событий
ConfigurationSetName: 'production-config-set',
});
return ses.send(command);
}
Bulk-рассылка через шаблоны
import { SendBulkTemplatedEmailCommand } from '@aws-sdk/client-ses';
// До 50 получателей за запрос, шаблон хранится в SES
await ses.send(new SendBulkTemplatedEmailCommand({
Source: '[email protected]',
Template: 'weekly-digest-ru',
DefaultTemplateData: JSON.stringify({ name: 'Пользователь', articles: [] }),
Destinations: users.map(user => ({
Destination: { ToAddresses: [user.email] },
ReplacementTemplateData: JSON.stringify({
name: user.name,
articles: user.personalizedArticles,
}),
})),
}));
Настройка Configuration Set
import {
CreateConfigurationSetCommand,
CreateConfigurationSetEventDestinationCommand,
EventType,
} from '@aws-sdk/client-ses';
// Создать Configuration Set
await ses.send(new CreateConfigurationSetCommand({
ConfigurationSet: { Name: 'production-config-set' }
}));
// Добавить SNS destination для событий
await ses.send(new CreateConfigurationSetEventDestinationCommand({
ConfigurationSetName: 'production-config-set',
EventDestination: {
Name: 'sns-events',
Enabled: true,
MatchingEventTypes: [
EventType.BOUNCE,
EventType.COMPLAINT,
EventType.DELIVERY,
EventType.OPEN,
EventType.CLICK,
],
SNSDestination: {
TopicARN: process.env.AWS_SNS_TOPIC_ARN,
},
},
}));
Обработка bounces и complaints через SNS
// SQS worker обрабатывает события SES
for (const record of event.Records) {
const snsMessage = JSON.parse(record.body);
const sesEvent = JSON.parse(snsMessage.Message);
if (sesEvent.notificationType === 'Bounce') {
for (const recipient of sesEvent.bounce.bouncedRecipients) {
await suppressEmail(recipient.emailAddress, 'bounce');
}
}
if (sesEvent.notificationType === 'Complaint') {
for (const recipient of sesEvent.complaint.complainedRecipients) {
await suppressEmail(recipient.emailAddress, 'complaint');
}
}
}
Сроки
Настройка SES + верификация домена + интеграция в приложение — 2–3 дня. С SNS/SQS обработкой bounces — ещё 1–2 дня. Свяжитесь с нами для расчета стоимости под ваш объём рассылок — получите консультацию в течение дня. Закажите интеграцию Amazon SES и снижайте затраты на email-коммуникации уже сегодня.
Amazon Simple Email Service (SES) — Wikipedia







