Перейти к основному содержанию
 

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

hmailserver

Коллеги сообщили об интересной проблеме. Если 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:

mail

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":

mail

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

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

mail

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, настраиваем ящик, с которого осуществляется переадресация.

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

mail

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

mail

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

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.

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

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

mail

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

mail

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

mail

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

mail

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

mail

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

mail

Сохранить.

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

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

mail

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

mail

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

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

mail

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

mail

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

mail

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

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

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

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

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

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

mail

Сохранить.

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

mail

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

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

mail

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

mail

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

mail

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

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

mail

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

Итог

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

Теги