Назад | Перейти на главную страницу

Перепишите «от» для конкретных адресов «до».

У нас есть настройка, в которой postfix отправляет почту через Amazon SES relay. Все работает нормально, кроме пересылки электронной почты.

Хотя эта тема уже обсуждалась как минимум Вот и Вот, есть еще некоторые моменты, которые я не могу понять.

Проблема в том, что Amazon SES не отправляет электронные письма, где From: не проверено. Поэтому, когда внутренний адрес хочет пересылать на внешний, а отправитель также является внешним, почта не будет отправлена.

Чтобы решить эту проблему, в настоящее время мы используем следующую конфигурацию в main.cf

header_checks = regexp:/etc/postfix/first_header_checks
smtp_header_checks = regexp:/etc/postfix/second_header_checks
sender_canonical_maps = regexp:/etc/postfix/sender_canonical
sender_canonical_classes = envelope_sender
smtpd_data_restrictions = check_sender_access pcre:/etc/postfix/sender_access

С first_header_checks

/^From:(\s)?(.*)/i PREPEND X-Original-From: $2
/^To:(\s)?(.*)$/i PREPEND X-Original-To: $2

second_header_checks

/^From:(.*)/i REPLACE From: <no-reply@verified-domain.com>

sender_canonical

/.*/    user@verified-domain.com

sender_access

/(.*)/  prepend Reply-To: <$1>

Это отлично подходит для входящей почты. user@external.com отправляет письмо на адрес me@verified-domain.com и пересылает его на адрес new@another-external.com

Reply-To: <user@external.com>
X-Original-To: <me@verified-domain.com>
To: new@another-external.com
From: <no-reply@verified-domain.com>
X-Original-From: <user@external.com>

Проблема, так же бывает и с исходящей почтой с сервера. Скажем, me@verified-domain.com отправляет письмо, from будет переписан на no-reply и будет установлен Reply-To. Я хочу это исправить. Заголовки писем следует переписывать только для входящей почты, которая будет пересылаться.

Я пробовал использовать регулярные выражения вроде !/^From:(\s)?(.*@verified-domain\.com)/ но пока безуспешно.

Postfix 2.1 и выше поддерживает условные операторы внутри regex и pcre таблицы. В твоем случае second_header_checks использование этих условных выражений должно выглядеть так:

if !/^From:(.*)@verified-domain.com/i
/^From:(.*)/i REPLACE From: <no-reply@verified-domain.com>
endif

Вы можете протестировать свои таблицы поиска, не отправляя ничего подобного:

peter@mail:~peter $ cat msgheaders
From: <peter@external.com>
To: new@another-external.com

peter@mail:~peter $ postmap -hmq - regexp:/etc/postfix/second_header_checks < msgheaders
From: <peter@external.com>     REPLACE From: <no-reply@verified-domain.com>

peter@mail:~peter $ cat msgheaders-1
From: <peter@verified-domain.com>
To: new@another-external.com

peter@mail:~peter $ postmap -hmq - regexp:/etc/postfix/second_header_checks < msgheaders-1
peter@mail:~peter $ 

Я пытался сделать что-то очень похожее на эту с другой почтовой службой, вот как я это решил (после того, как получил большую помощь из этой темы):

  1. Настройте транспортную карту, которая устанавливает следующий переход для локально запущенного демона smtp для примера внешнего назначения: somebody@external.com smtp:localhost:9999
  2. Добавьте новый локально работающий демон smtp в master.cf, примените проверки заголовков, канонические карты и canonical_classes только к этому демону
  3. используйте content_filter на локально работающем демоне, чтобы указать на mx-сервер внешнего dest. Мой выглядел так -o content_filter=smtp:[mx.somedomain.com]:25
  4. Возможно, вам потребуется изменить smtpd_recipient_restrictions на локально запущенном демоне только для того, чтобы он мог действовать как ретранслятор. Например: -o smtpd_recipient_restrictions=permit_mynetworks,defer (Это может быть не идеально, проверьте политику безопасности перед запуском)

Удачи тебе, если тебе нужна дополнительная информация, я могу попробовать и помочь.