Как улучшить доставляемость писем? Знакомимся с SPF и DKIM

Если по каким-то причинам письма от вашего сайта будут отправляться в СПАМ, это может стать большой проблемой, особенно если речь идет об интернет-магазине. В этой статье я расскажу, как этого избежать. Начнем с разбора основных концепций в этом вопросе и закончим активацией SPF и DKIM на своем сайте.
Вечная проблема
Всего через 9 лет после появления интернета (2 сентября 1969) было отправлено первое нежелательное рекламное сообщение. И с тех пор ситуация радикально не решилась. Ежедневно рассылаются миллионы рекламных и вредоносных писем.
Наличие проблемы привело к ужесточению требований к проверке писем. Благодаря этому большая часть нежелательных сообщений автоматически определяется как СПАМ.
Что влияет на доставляемость писем
Разные почтовые провайдеры используют разные алгоритмы для сканирования писем, но есть общий ряд факторов.
Заголовок письма From
Заголовок From в электронном письме содержит информацию об отправителе: адрес электронной почты или имя с адресом.
From: email@example.com
или
From: "John Doe" <email@example.com>
Домен в адресе отправителя должен совпадать с доменом сайта, который пытается отправлять письма. Например, если ваш домен example.com, то адрес отправителя должен быть [xxx]@example.com.
Если домены будут отличаться, то почтовый провайдер может определить письмо как нежелательное. Как показывает опыт, это требование необходимое, но не единственное.
Sender Policy Framework (SPF)
В заголовке письма From фактически можно указать любой адрес отправителя. А что, если кто-то укажет там updates@microsoft.com и вставит вредоносную ссылку в письмо?
Необходимо как-то проверять, отправляются ли письма с почтового сервера, который ассоциирован с адресом отправителя, а не с почтового сервера злоумышленника. Большинством почтовых провайдеров для этого применяется технология SPF, на разработку которой ушло почти десятилетие.
Стандарт аутентификации электронной почты SPF помогает защитить отправителей и получателей от спама, спуфинга и фишинга. С помощью добавления SPF-записи к вашей системе доменных имен (DNS) вы можете создать доступный для всех список отправителей, которым разрешено отправлять письма с вашего домена.
Благодаря этому списку принимающий сервер убедится (или нет), что электронное письмо было отправлено с сервера, которому разрешена отправка с вашего домена.
Как работает SPF
Давайте разберем ближе, как работает стандарт SPF на примере.

- Сервер с IP-адресом 1.2.3.4 отправляет письмо. Заголовок Return-Path этого письма содержит адрес bounces@example.com.
- Принимающий сервер берет заголовок Return-Path, получает домен. Затем читает DNS-записи для этого домена, ищет SPF-запись.
- Если SPF-запись найдена, принимающий сервер проверяет, имеется ли в публичном списке разрешенных отправителей IP-адрес сервера, с которого пришло письмо.
- В нашем примере адрес сервера отправителя совпадает с одним из адресов, указанных в SPF-записи. Поэтому проверка SPF проходит успешно. Если бы адреса отправляющего сервера не было в SPF-записи, то проверка бы провалилась. Скорее всего, это вызвало бы подозрения у принимающего севера, и он бы пометил это письмо как нежелательное.
Как добавить SPF-запись на свой домен
Прежде всего, проверьте, как обстоят текущие дела. Отправьте с сайта какое-нибудь письмо себе. Например, уведомление о заказе, если вы хотите улучшить доставляемость писем в интернет-магазине.

Откройте исходный код письма. Received-SPF: pass говорит о том, что проверка пройдена, fail — провалена. Если нет сигнала об успешной проверке, стоит заняться созданием корректной SPF-записи.
Проверка SPF связана напрямую с доменом из заголовка Return-Path в письме, а не из заголовка From. Убедитесь, что в заголовке Return-Path исходящих писем с сайта содержится разрешенный в SPF-записи домен.

Самый простой способ получить корректную SPF-запись — это найти код этой записи в документации у своего почтового провайдера.
Из чего состоит SPF-запись
Предположим, что сайт, для которого мы хотим улучшить доставляемость писем, хостится на Siteground, но домен и его DNS управляется другой компанией, например, Cloudflare. В таком случае SPF-запись может выглядеть следующим образом.

v=spf1 a mx ip4:35.214.114.121 include:_spf.mailspamprotection.com -all
- v=spf1 — первая часть SPF-записи, это версия технологии.
Затем идут механизмы записи.
- a mx — проверка проходит, если письмо отправлено с почтовых серверов, адреса которых указаны в A и MX записях домена.
- ip4:35.214.114.121 — проверка проходит, если письмо отправлено с указанного IP-адреса.
- include:_spf.mailspamprotection.com — ссылается на результат проверки SPF другого домена. Если для этого домена SPF проходит (получает pass), то и SPF для текущего домена (из заголовка Return-Path) получит pass.
Вы можете заметить, что на скриншоте используется два механизма include. Все верно, include:spf.protection.outlook.com я не стал упоминать. Это подключение домена, который нужен для прохождения проверки SPF корпоративной почты и не имеет отношения к улучшению доставляемости писем с сайта. - -all — говорит о том, что если предыдущие механизмы не совпадают, то письмо должно быть помечено как нежелательное.

Принимающий сервер берет домен из Return-Path и выполняет проверку для него на основе результата проверки SPF домена _spf.mailspamprotection.com, указанном в include.
_spf.mailspamprotection.com — это специальный домен, который Siteground использует для хранения общего списка всех почтовых серверов. Сам же этот домен содержит еще несколько include со вспомогательными доменами. А уже они в свою очередь возвращают реальные IP-адреса почтовых серверов.
Не так сложно, как могло показаться на первый взгляд. Еще раз повторюсь — смотрите в первую очередь документацию вашего почтового провайдера.
Несколько полезных ссылок о SPF:
- Проверка SPF записи на каком-либо домене
- SPF Record: Protect your domain reputation and email delivery
- Sender Policy Framework
Даже если проверка SPF прошла успешно, и письмо пришло от разрешенного почтового сервера, нет никакой уверенности в том, что сообщение не было изменено по пути следования. И вот здесь на помощь приходит DKIM.
DomainKeys Identified Mail (DKIM)
DKIM — стандарт безопасности электронной почты, который помогает проверить целостность сообщения, убедиться что оно не было изменено во время передачи между отправляющим и принимающим серверами. Письмо подписывается при отправке закрытым ключом, хранящемся на отправляющем сервере. Электронная цифровая подпись (DKIM-подпись) сохраняется в заголовок письма DKIM-Signature. Принимающий сервер извлекает публичный ключ из DKIM записи в DNS и использует его для верификации отправителя и проверки целостности тела письма.
Хотя использование DKIM и не является обязательным, это может улучшить доставляемость сообщений. Спуфинг электронной почты с доверенных доменов — популярный метод для злонамеренного спама и фишинговых кампаний, а DKIM затрудняет подделку электронной почты с доменов, которые его используют.
DKIM совместим с современной структурой email-писем и отлично работает вместе с SPF и DMARC, что позволяет создать многоуровневую защиту доменов, с которых отправляются сообщения. Почтовые сервера, которые не поддерживают DKIM, просто проигнорируют подпись и смогут получить письмо без каких-либо проблем. DKIM — это опциональный протокол безопасности.
Gmail, Yahoo и другие крупные почтовые сервисы используют DKIM для проверки писем. Поэтому внедрение этого протокола безопасности может улучшить доставляемость писем с вашего сайта.
Как работает DKIM
Рассмотрим ближе алгоритм проверки DKIM.

- Отправляющий почтовый сервер берет закрытый ключ и подписывает им письмо, после чего отправляет. DKIM-подпись содержится в заголовке DKIM-Signature.
- Принимающий почтовый сервер извлекает DKIM-подпись из заголовков письма, берет оттуда домен и получает DKIM-запись хранящуюся на DNS сервере этого домена.
- Из DKIM-записи извлекается открытый ключ. Происходит проверка целостности письма и корректности отправителя на основе полученного открытого ключа.
- Если сообщение не изменялось, то проверка пройдена, изменялось — провалена.
Из чего состоит DKIM-подпись
Итак, при корректной настройке DKIM во время отправки каждое письмо получает DKIM-подпись.

Разберем пример DKIM-подписи на примере письма с сайта на хостинге Siteground.
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thegoodpainter.co.uk; s=default; h=Content-Transfer-Encoding:Content-Type:MIME-Version:Message-ID:Subject:Reply-To:From:To:Date:Sender:Cc:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc-:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=d+FV/hS/FF3Ei0eLnEZ2WW0zxybUeDrWWP05NJf5WEQ=; b=UMMaxtJ9hKNKAdVmouAXwGouIc4JDR3G4w9q3tv6iv6ZXTjHaEfWddETqVC0VvwvjTSpMzkVCieMQvrIg/pY9mBxDQyig1nHIu4FGVVC27BNwXsC9YGs7zNd4Qh36CcHgE5wtGzIvOBmV1w2vCLxny5X+VeOuuOlLgVpWL/LFm4=;
Вот, что означает каждая часть заголовка.
- DKIM-Signature: — зарегистрированный заголовок для сообщений, подписанных с помощью DKIM.
- v=1; — версия DKIM, используемая отправляющим сервером.
- a=rsa-sha256; — название алгоритма, используемого для генерации хэша с помощью закрытого и открытого ключей.
- c=relaxed/relaxed; — название алгоритма нормализации для сообщения. Он регулирует изменения пробелов и переноса текста в сообщении. Есть 2 варианта. Simple и relaxed. Simple не позволяет никаких изменений, а relaxed позволяет вносить общие изменения в пробелы и перенос строки заголовка. Нормализация в заголовке и теле может управляться индивидуально и использует формат header/body, например, relaxed/relaxed.
- s=default; — используется как селектор для открытого ключа во время верификации. Домены могут иметь целый список открытых DKIM-ключей, а селектор помогает разделять их и быть уверенным в том, что принимающий сервер получит корректный публичный ключ из этого списка.
- d=thegoodpainter.co.uk; — домен электронной почты, который подписывает сообщение.
- h=Content-Transfer-Encoding:Content-Type:MIME-Version:Message-ID:Subject:Reply-To:From:To:Date:Sender:Cc:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc-:Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; — список заголовков, включенных в письмо в момент создания DKIM-подписи.
- bh=d+FV/hS/FF3Ei0eLnEZ2WW0zxybUeDrWWP05NJf5WEQ=; — хэш тела письма до подписания заголовков сообщения.
- b=UMMaxtJ9hKNKAdVmouAXwGouIc4JDR3G4w9q3tv6iv6ZXTjHaEfWddETqVC0VvwvjTSpMzkVCieMQvrIg/pY9mBxDQyig1nHIu4FGVVC27BNwXsC9YGs7zNd4Qh36CcHgE5wtGzIvOBmV1w2vCLxny5X+VeOuuOlLgVpWL/LFm4=; — криптографическая подпись всей предыдщей информации из поля DKIM-Signature. В процессе проверки эта запись обрабатывается как пустая строка.
DKIM-подпись вычисляется и добавляется к заголовкам отправляемого письма. Теперь сообщение готово к DKIM-проверке на стороне принимающего сервера.
Как добавить DKIM-запись на свой домен
Прежде всего, проверьте, не работает ли DKIM уже на вашем домене. Отправьте себе письмо с проблемного сайта и откройте исходный код письма.
Если результат проверки — это pass, значит все в порядке, и ничего делать не нужно. В противном случае, потребуется выполнить настройку.

Для добавления DKIM-записи потребуется изменить DNS. В первую очередь, попробуйте найти DKIM-запись в документации своего почтового сервера.
В нашем примере сайт хостится на Siteground, но его домен управляется с помощью Cloudflare, поэтому нужно вручную настроить DKIM-запись в DNS.

Имя DKIM-записи
Прежде всего обратите внимание на название DNS записи. В отличие от большинства других TXT-записей DNS, DKIM записи хранятся под специальным именем. Формат имени DKIM-записи выглядит следующим образом:
[selector]._domainkey.[domain]
- [selector] — это тот самый селектор, хранящийся в части ‘s=‘ заголовка DKIM-Signature о котором шла речь при разборе DKIM-подписи.
- [domain] — домен отправителя сообщения.
- ._domainkey. — включается во все имена DKIM-записей.
Содержание DKIM-записи
v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkewy3EMOFcOb999/zKf7ZnR8dwRBOayPdILfSyA2B3iQKKX9Po5XI7cMKWCFj9ycBt84LejK1qeKTClKFNTHq2D1G3onP41X9WD8AbwdqFTSnBomOCr3fscPbL3UM5uLCvLj8pQda5IhCgPZI+HJNCloCo0LIQV3A15prZxBA4wIDAQAB;s=email
- v=DKIM1; — версия DKIM-записи.
- k=rsa; — алгоритм шифрования, используемый при создании подписи.
- p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkewy3EMOFcOb999/zKf7ZnR8dwRBOayPdILfSyA2B3iQKKX9Po5XI7cMKWCFj9ycBt84LejK1qeKTClKFNTHq2D1G3onP41X9WD8AbwdqFTSnBomOCr3fscPbL3UM5uLCvLj8pQda5IhCgPZI+HJNCloCo0LIQV3A15prZxBA4wIDAQAB; — тот самый открытый ключ шифрования, который используется для верификации.
- s=email — тип сервиса, к которому применима данная DKIM-запись. Не стоит путать с записью селектора в DKIM-подписи. Опциональный тэг.
Содержимое DKIM записи я скопировал из панели управления хостингом Siteground. Если же вы используете свой собственный почтовый сервер, вам потребуется настроить процесс создания DKIM-подписи вручную, своими средствами генерировать ключи. Но этот вариант в данной статье мы разбирать не будем.
Может ли DKIM предотвратить спуфинг (подмену) домена?
Сам по себе DKIM не предотвращает спуфинг домена. Можно подписать сообщение, используя закрытый ключ DKIM, связанный с другим доменом, чем тот, что используется в заголовке From.
Однако, если для вашего домена настроена политика DMARC, принимающий почтовый сервер будет проверять, что ключ DKIM, используемый для подписи сообщения, соответствует домену из заголовка From при определении соответствия DMARC.
Как DKIM улучшает доставляемость писем?
Такие крупные почтовые сервисы как Gmail, Yahoo и другие используют DKIM для определения легитимности сообщения. Тесты Postmark показывают, что корректная настройка DKIM существенно улучшает доставляемость писем.
Какое отношение SPF и DMARC имеет к DKIM?
Пока DKIM обеспечивает целостность сообщений при передаче между серверами, SPF проверяет, что отправляющему серверу разрешено использовать указанный домен.
DMARC — это протокол, который указывает серверу, что делать с нелегитимными сообщениями. Он использует DKIM и SPF, чтобы определить, является ли сообщение безопасным и должно ли оно быть доставлено получателю или заблокировано.
Несколько полезных ссылок по DKIM:
- Проверка DKIM-записи на каком-либо домене
- DKIM: What is it and why is it important?
- DKIM DNS record overview
- DomainKeys Identified Mail
Заключение
Таким образом, мы видим, что улучшить доставляемость писем можно с помощью трех основных вещей.
- Использование корректного домена в заголовке Form
- Настройка SPF
- Настройка DKIM
Для моих проектов этого было достаточно, чтобы письма переставали отправляться в Junk или SPAM и надежно доходили до адресата.
Спасибо за внимание!