Найти тему

hMailServer — переадресация писем от DMARC защищённых доменов

Коллеги сообщили об интересной проблеме. Если hMailServer переадресует почту с mail.ru на gmail.com, то письма без вложений доходят, а с вложениями не доходят с ошибкой:

Your message did not reach some or all of the intended recipients.

Sent: Wed, 04 Dec 2019 12:51:25 +0300
Subject: test1

The following recipient(s) could not be reached:

recipient@gmail.com
Error Type: SMTP
Remote server (64.233.162.26) issued an error.
hMailServer sent: .
Remote server replied: 550-5.7.26 Unauthenticated email from mail.ru is not accepted due to domain's
550-5.7.26 DMARC policy. Please contact the administrator of mail.ru domain if
550-5.7.26 this was a legitimate mail. Please visit
550-5.7.26 https://support.google.com/mail/answer/2451690 to learn about the
550 5.7.26 DMARC initiative. t3si4544018ljk.9 - gsmtp



hMailServer

Проблема связана с тем, что домен mail.ru имеет DMARC запись, запрещающую отправлять их письма со сторонних серверов. hMailServer при переадресации в заголовок "From" вставляет e-mail адрес отправителя с mail.ru, вот gmail.com и проверяет DMARC на домене mail.ru.

Здесь разбираем на конкретном примере:

Письмо отправляется с ящика mail.ru на ящик домена internet-lab.ru. Далее письмо с ящика домена internet-lab.ru переадресуется почтовым сервером hMailServer на ящик домена gmail.com.

RewriteEnvelopeFromWhenForwarding

Прочитал про недокументированную опцию RewriteEnvelopeFromWhenForwarding.

https://www.hmailserver.com/forum/viewtopic.php?f=10&t=30900

RewriteEnvelopeFromWhenForwarding=1
; Defaults to 0 or disabled.
; This will rewrite the FROM envelope of an email message when forwarding it on to another address.
; The default is to retain the original FROM address (potentially causing SPF checking failures by the forward address server).

Попробуем её применить. По идее, если gmail.com получит письмо с нашего домена, то он не полезет в mail.ru проверять DMARC, а проверит его в нашем домене.

RewriteEnvelopeFromWhenForwarding=0, письмо без вложений

Отправляю письмо без вложений из mail.ru, hMailServer переадресует его на gmail.com:

-2

spf=softfail (google.com: domain of transitioning sender@mail.ru does not designate 46.39.246.23 as permitted sender) smtp.mailfrom=sender@mail.ru;

dkim=pass, тоже проверяется по открытому ключу домена mail.ru.

dmarc=pass, снова mail.ru.

Return-Path: <seneder@mail.ru>

Т.е. домен нашего hMailServer не принимает участие в проверке, а SPF запись mail.ru оставляет на усмотрение получателя действия с письмами, отправленными с неизвестных IP адресов.

Действительно, SPF запись mail.ru содержит "~all":

-3

RewriteEnvelopeFromWhenForwarding=0, письмо с вложением

Отправляю письмо с вложением из mail.ru, hMailServer переадресует его на gmail.com. Письмо попадает на сервер hMailServer, переадресуется на gmail.com, и ошибка:

RECEIVED: 550-5.7.26 Unauthenticated email from mail.ru is not accepted due to domain's DMARC policy. Please contact the administrator of mail.ru domain if this was a legitimate mail. Please visit https://support.google.com/mail/answer/2451690 to learn about the DMARC initiative.

Можно сделать вывод, что gmail.com не пропускает письма, переадресованные с mail.ru и содержащие вложения.

RewriteEnvelopeFromWhenForwarding=1, письмо без вложений

В файл C:\Program Files (x86)\hMailServer\Bin\hMailServer.INI добавляем настройку:

[Settings]
RewriteEnvelopeFromWhenForwarding=1

Перезагружаем hMailServer:

net stop hmailserver
net start hmailserver
-4

Отправляю письмо без вложений из mail.ru, hMailServer переадресует его на gmail.com:

-5

spf=pass (google.com: domain of test@internet-lab.ru designates 46.39.246.23 as permitted sender) smtp.mailfrom=test@internet-lab.ru;

Return-Path: <test@internet-lab.ru>

Теперь в заголовке Return-Path прописывается адрес ящика, который переадресовал почту, SPF проверяется на домене hMailServer и IP адрес уже проходит проверку.

dkim=pass, домен hMailServer.

dmarc=pass, а вот здесь снова домен mail.ru.

RewriteEnvelopeFromWhenForwarding=1, письмо с вложением

Отправляю письмо с вложением из mail.ru, hMailServer переадресует его на gmail.com. Письмо попадает на сервер hMailServer, переадресуется на gmail.com, и снова ошибка:

RECEIVED: 550-5.7.26 Unauthenticated email from mail.ru is not accepted due to domain's DMARC policy. Please contact the administrator of mail.ru domain if this was a legitimate mail. Please visit https://support.google.com/mail/answer/2451690 to learn about the DMARC initiative.

Вывод

Установив настройку RewriteEnvelopeFromWhenForwarding=1 мы указали серверу hMailServer изменять заголовок Return-Path (Envelop-From) с адреса отправителя на адрес ящика, осуществляющего переадресацию. Это даёт несколько плюсов:

  • SPF проверка осуществляется на домене ящика, осуществляющего переадресацию. Мы имеем к этому домену доступ и можем пройти SPF проверку.
  • DKIM проверка осуществляется на домене ящика, осуществляющего переадресацию. Тоже можно этим рулить.

Однако, на проверку DMARC это никак не влияет, и письма с вложениями от mail.ru не переадресуются на gmail.com всё равно.

Есть ещё один плюс, теперь отбой от gmail.com о недоставленном письме приходит к нам, попадает на переадресацию и улетает получателю в gmail.com:

Your message did not reach some or all of the intended recipients.

Sent: Wed, 04 Dec 2019 16:53:55 +0300
Subject: test4

The following recipient(s) could not be reached:

recipient@gmail.com
Error Type: SMTP
Remote server (64.233.162.26) issued an error.
hMailServer sent: .
Remote server replied: 550-5.7.26 Unauthenticated email from mail.ru is not accepted due to domain's
550-5.7.26 DMARC policy. Please contact the administrator of mail.ru domain if
550-5.7.26 this was a legitimate mail. Please visit
550-5.7.26 https://support.google.com/mail/answer/2451690 to learn about the
550 5.7.26 DMARC initiative. t3si4544018ljk.9 - gsmtp



hMailServer

Получатель теперь знает, что ему было отправлено письмо, и оно не дошло.

Я не понял только один момент, почему письмо с mail.ru без вложений всё-таки доходит до gmail.com? Не должно же доходить... Или Google здесь послабление делает? Кто знает ответ — напишите в комментариях.

Что можно попробовать сделать? Давайте подменим заголовок From при переадресации, вдруг, gmail.com теперь не полезет на mail.ru проверять DMARC? Для определения реального отправителя у нас останется заголовок Reply-To.

Подменяем заголовок FROM

Заходим в админку hMailServer, настраиваем ящик, с которого осуществляется переадресация.

Во вкладке Пересылка отключаем переадресацию (если она там была).

-6

Переходим во вкладку Правила и добавляем новое правило, Добавить.

-7

Создаём правило переадресации по аналогии с:

https://www.hmailserver.com/documentation/v4.4/?page=feature_rules_examples

Example 2, forward messages

Forward all messages addressed to an external email address. The original message will still be delivered normally. Don't set up a rule that forwards email to yourself, since that would cause an endless loop.

  • Start hMailAdmin and navigate to the account settings.
  • Select the Rules tab.
  • Click on Add. Enter the name ForwardRule
  • Under Criteria, click on Add.
  • Under Pre-defined field, select Message size
  • Under Search type, select Greater than.
  • In the Value textbox, enter the value 0. This will cause all messages larger than 0 bytes to be affected by the rule.
  • Click on Save to add the criteria to the rule.
  • Under Actions, click on Add.
  • Select Forward email from the drop down. Enter the external address to forward to.
  • Click on Save to save the Action
  • Click again on Save to save the entire rule

Немного модифицируем инструкцию, чтобы письмо не сохранялось.

-8

Критерий: Размер сообщения больше нуля.

-9

Действия: установить значение заголовка "From" — меняем на имя текущего ящика.

-10

Действия: переслать сообщение — пересылаем на gmail.

-11

Действия: удаляем сообщение.

-12

Правило должно быть включено.

Сохранить.

From, письмо без вложений

Отправляю письмо без вложений из mail.ru, hMailServer переадресует его на gmail.com. На этот раз письмо идёт дольше, но доходит.

-13

Все проверки PASS, однако, отправитель теперь другой, тот что мы подставили. Реальный адрес отправителя можно посмотреть в заголовке Reply-To.

-14

From, письмо с вложением

Отправляю письмо с вложением из mail.ru, hMailServer переадресует его на gmail.com. Письмо попадает на сервер hMailServer, переадресуется на gmail.com и... приходит. Все проверки пройдены.

-15

Некрасиво выглядит отправитель, не тот что нужно.

-16

Реальный адрес отправителя можно посмотреть в заголовке Reply-To. При попытке ответить, письмо отправляется реальному отправителю с mail.ru.

-17

dkim=neutral для домена mail.ru, поскольку письмо модифицировано. Может быть даже dkim=fail. Но сообщение-таки доходит.

Добавляем заголовок Reply-To

А как быть, если заголовка Reply-To в письме нет?

Навеяно статьёй:

https://www.hmailserver.com/forum/viewtopic.php?t=32981

Появилась идея добавлять заголовок Reply-To, если его в письме нет. Сделать это можно с помощью скриптов. В админке hMailServer включаем скрипты: Настройки > Дополнительно > Скрипты.

-18

Сохранить.

Кнопка Показать откроет директорию с файлом скриптов. По умолчанию это C:\Program Files (x86)\hMailServer\Events\EventHandlers.vbs.

-19

Редактируем файл, добавляем функцию:

Sub ReplyTo(oMessage)
'custom event
'uses functions:
'uses globals:
'called from: Rules
if oMessage.HeaderValue("Reply-To")="" then
oMessage.HeaderValue("Reply-To")=oMessage.HeaderValue("From")
Dim i
For i = 0 To 30
On Error Resume Next
oMessage.save
If Err.Number = 0 Then
On Error Goto 0
Exit Sub
Else
EventLog.Write("Error : " & Err.Number)
EventLog.Write("Source : " & Err.Source)
EventLog.Write("Description : " & Err.Description)
Err.Clear
On Error Goto 0
Wait(1)
End If
Next
End if
End Sub
-20

Сохраняем файл. hMailServer хранит данные в памяти, для обновления нужно сначала проверить корректность скрипта кнопкой Проверка. Затем нажать кнопку Перезагрузить.

-21

Идём в настройки ящика для переадресации и модифицируем правило.

-22

Добавляем действие Выполнить скрипт и помещаем его выше чем Установить значение заголовка.

В качестве скрипта пишем ReplyTo.

-23

Теперь, если у входящего письма отсутствует заголовок Reply-To, то он будет скопирован из заголовка From. При попытке ответить на письмо заголовок Reply-To имеет преимущество перед Return-Path (Envelop-From), поэтому ответ будет отправлен реальному отправителю.

Итог

Мы смогли добиться переадресации письма с домена, защищённого политиками DMARC на gmail.com. Плохо то, что реальный отправитель не виден, однако, ответ отправляется ему без проблем. Главная задача с получением вложении решена.

Источник:
https://internet-lab.ru/hmailserver_dmarc_forwarding

Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.