29 Декабрь 2016

Отправка почты от несуществующего отправителя

Sending e-mail from non-existent senders

Электронная почта, несмотря на прошешие десятилетия и благодаря развитию технологий, остаётся главным средством личной и деловой коммуникации по всему миру.

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

Особенностям конфигурирования почтовых систем для беспроблемной работы с такого рода отправками и посвещена данная статья.

1. Зачем это?

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

Возможным вариантом для отправки также может быть отправка от пустого отправителя (команда MAIL FROM:<>), почта от которого согласно стандартам, включая ныне действующий RFC5321, должна приниматься всеми SMTP-серверами. Однако, на практике, некоторые почтовые системы не соблюдают эти требования. Кроме того, пустой отправитель часто используется непосредственно самим сервером для отправки отчётов о доставке DSN (Delivery Status Notification), NDR (Non-Delivery Report), NDN (Non-Delivery Notification). По этой причине применение пустого отправителя в качестве источника иной информации представляется моветоном.

Таким образом, возникает необходимость в использовании специального адреса отправителя. Удобно, чтобы такой адрес электронной почты уже своим именем показывал, что он предполагает никакого ответа от получателя. Например, часто он имеет вид подобный noreply@your.domain с различными вариациями локальной части (do-not-reply, no-reply, no-answer и т.п.).

2. Метод реализации

Рассмотрим способ реализации работы такого специального ящика на базе конфигурации SMTP-сервера Exim.

root@beta:~ # exim --version | head -1
Exim version 4.87_1 #0 (FreeBSD 11.0) built 26-Dec-2016 11:29:21

Используемая почтовая система обслуживает некоторое число различных доменов. Также она рассылает отчёты о применении политики DMARC для доменов-отправителей (см. статью "DMARC для борьбы со спам на локальном и глобальном фронтах") и ряд других сведений для которых целесообразно использовать отправку от несуществующего адреса отправителя.

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

Задавшись именем ящика несуществующего отправителя noreply которое будет зарезервировано для всех поддерживаемых данной почтовой системой доменов, можно привести конфигурацию к такому виду (в сокращённом виде).

root@beta:~ # cat /usr/local/etc/exim/configure
# $Cambridge: exim/exim-src/src/configure.default,v 1.14 2009/10/16 07:46:13 tom Exp $
# --- by Max Kostikov (c) 2010...2016 v.20161129
...
qualify_domain          = my.server
...
# -- DMARC settings
...
dmarc_forensic_sender   = noreply@$qualify_domain
...
acl_smtp_rcpt           = acl_check_rcpt
acl_smtp_dkim           = acl_check_dkim
acl_smtp_mime           = acl_check_mime
acl_smtp_data           = acl_check_data
...
begin acl
...
acl_check_rcpt:
...
  # --- enable incoming non-empty callout for report sender
  accept local_parts    = noreply
         domains        = +local_domains
...
  # --- check sender address
  deny  !senders        = ^.*(not?(-|_)?reply(s)?|gluck)@$sender_address_domain\$
        !verify         = sender/callout=10s,defer_ok

accept
...
begin routers

# -- remote delivery
...
# -- Don't deliver for report sender
blackhole:
  driver        = redirect
  local_parts   = noreply
  domains       = +local_domains
  data          = :blackhole:
...

Обратите внимание, что отчёты DMARC отправляются с адреса noreply@my.server (переменная dmarc_forensic_sender).

Далее в ACL RCPT ближе к его концу и сразу перед началом проверок на существование адреса в локальных и удалённых системах, для которых эта выступает релеем, идёт правило accept для всех локальных доменов с локальной частью noreply. Это необходимо для того, чтобы встречная проверка вызовом со стороны удалённой системы завершалась успехом. Перед финальным accept набора правил RCPT имеется также правило, которое запрещает делать вызовы callout при получении почты от внешних отправителей которые также используют аналогичные говорящие сами за себя адреса отправителей для доставки отчётов в различных вариациях, поскольку далеко не все отправители корректно обрабатывают такие запросы. За это отвечает специальный шаблон PCRE.

ACL DKIM, ACL MIME и ACL DATA не требуют каких-либо специальных правил для обработки несуществующих отправителей. Разве что в вашем конкретном случае потребуются специальные оговорки для их обработки. К примеру, если вы используете system-wide сканирование входящей почты на спам (см. статью "Особенности вызова и обучения Spamassassin") именно в ACL DATA, то, возможно, имеет смысл не делать его для отправителей типа noreply используя аналогичных шаблон.

Обработка возможных входящих ответов реализовано роутером blackhole который следует вторым в списке сразу же за роутером удалённой доставки. Он направляет всю входящую почту в специальный одноимённый транспорт т.е. фактически в dev/null.

Собственно, ничего сложного в корректной реализации отправки и обработки почты для несуществующего отправителя средствами Exim нет.

3. PROFIT!

Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.


exim