Коллеги сообщили об интересной проблеме. Если 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:
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":
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
Отправляю письмо без вложений из mail.ru, hMailServer переадресует его на gmail.com:
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, настраиваем ящик, с которого осуществляется переадресация.
Во вкладке Пересылка отключаем переадресацию (если она там была).
Переходим во вкладку Правила и добавляем новое правило, Добавить.
Создаём правило переадресации по аналогии с:
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
Немного модифицируем инструкцию, чтобы письмо не сохранялось.
Критерий: Размер сообщения больше нуля.
Действия: установить значение заголовка "From" — меняем на имя текущего ящика.
Действия: переслать сообщение — пересылаем на gmail.
Действия: удаляем сообщение.
Правило должно быть включено.
Сохранить.
From, письмо без вложений
Отправляю письмо без вложений из mail.ru, hMailServer переадресует его на gmail.com. На этот раз письмо идёт дольше, но доходит.
Все проверки PASS, однако, отправитель теперь другой, тот что мы подставили. Реальный адрес отправителя можно посмотреть в заголовке Reply-To.
From, письмо с вложением
Отправляю письмо с вложением из mail.ru, hMailServer переадресует его на gmail.com. Письмо попадает на сервер hMailServer, переадресуется на gmail.com и... приходит. Все проверки пройдены.
Некрасиво выглядит отправитель, не тот что нужно.
Реальный адрес отправителя можно посмотреть в заголовке Reply-To. При попытке ответить, письмо отправляется реальному отправителю с mail.ru.
dkim=neutral для домена mail.ru, поскольку письмо модифицировано. Может быть даже dkim=fail. Но сообщение-таки доходит.
Добавляем заголовок Reply-To
А как быть, если заголовка Reply-To в письме нет?
Навеяно статьёй:
https://www.hmailserver.com/forum/viewtopic.php?t=32981
Появилась идея добавлять заголовок Reply-To, если его в письме нет. Сделать это можно с помощью скриптов. В админке hMailServer включаем скрипты: Настройки > Дополнительно > Скрипты.
Сохранить.
Кнопка Показать откроет директорию с файлом скриптов. По умолчанию это C:\Program Files (x86)\hMailServer\Events\EventHandlers.vbs.
Редактируем файл, добавляем функцию:
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
Сохраняем файл. hMailServer хранит данные в памяти, для обновления нужно сначала проверить корректность скрипта кнопкой Проверка. Затем нажать кнопку Перезагрузить.
Идём в настройки ящика для переадресации и модифицируем правило.
Добавляем действие Выполнить скрипт и помещаем его выше чем Установить значение заголовка.
В качестве скрипта пишем ReplyTo.
Теперь, если у входящего письма отсутствует заголовок Reply-To, то он будет скопирован из заголовка From. При попытке ответить на письмо заголовок Reply-To имеет преимущество перед Return-Path (Envelop-From), поэтому ответ будет отправлен реальному отправителю.
Итог
Мы смогли добиться переадресации письма с домена, защищённого политиками DMARC на gmail.com. Плохо то, что реальный отправитель не виден, однако, ответ отправляется ему без проблем. Главная задача с получением вложении решена.