Postfix - доставка входящих писем сразу на несколько серверов (dual delivery)

Сама статья и описание: http://pjrlost.blogspot.ru/2012/11/smtp-delivery-to-two-mail-servers-via.html

Внимание, оригинальный скрипт не умеет доставлять почту если в списке получателей больше одного адреса! См. прикрепленные файлы и описание!
  • Оригинальный скрипт: smtpdd.tar.gz
  • Модифицированный скрипт, для доставки писем с несколькими получателями: smtpdd.many-users.zip

Необходимо доставлять приходящие на почтовый шлюз письма сразу на несколько почтовых серверов без использования пересылок, сборщиков писем и т.д. Это может быть необходимо для:

  • резервирование почтовых серверов
  • тестирование настроек почтовых серверов
  • тестирование антиспамовых и антивирусных продуктов
  • сбор всей проходящий почты (мало ли зачем это может быть вам необходимо)

Будем использовать Postfix (в роли MTA), msmtp (для пересылки почты) и скрипт smtpdd.sh который и реализует логику пересылки писем.

Сервера:

  • mailrelay - сервер, принимающий почту из Интернета
  • mainserver - основной почтовый сервер организации
  • backupserver - дополнительный (резервный) сервер организации
  • testserver - тестовый сервер, доставка на который неважна (дошло письмо - хорошо, не дошло - не страшно)

Таким образом, путь почты выглядит следующим образом:

  • письмо приходит из Интернета на сервер mailrelay
  • сервер mailrelay пересылает его на следующие сервера:
    • mainserver - доставка обязательна
    • backupserver - доставка обязательна
    • testserver - доставка желательна

Устанавливаем msmtp:

$ apt-get install msmtp

Важное примечание: в Ubuntu 14.04.4 версия msmtp довольно старая - 1.4.31-1, возможно стоит собрать более новую версию самостоятельно, как описано вот тут: Компиляция пакетов для Ubuntu

Скачать прилагаемый к данной заметке скрипт smtpdd.many-users.zip и развернуть его в /opt:

# mkdir /opt/smtpdd
# unzip smtpdd.many-users.zip

Создать папку для временного хранения очереди доставки:

# mkdir /var/spool/smtpdd

Создаем пользователя, под которым будет работать скрипт:

# useradd smtpdd
# chown -R smtpdd:smtpdd /opt/smtpdd
# chown -R smtpdd:smtpdd /var/spool/smtpdd

И напоследок, добавить задание cron для доставки отложенных писем (с опцией доставки «o»):

# crontab -e -u smtpdd

строку:

0 * * * * /opt/smtpdd/smtpdd.sh  /var/spool/smtpdd/ qrun > /dev/null 2>&1

Добавляем в /etc/postfix/master.cf строки:

dualdelivery    unix    - n n - 5 pipe
        user=smtpdd argv=/opt/smtpdd/smtpdd.sh /var/spool/smtpdd/ ${sender} ${recipient}
        mainserver:25:q backupserver:25:q testserver:25:d

Сервер записывается в формате: имя_сервера:порт:опция_доставки

Опции доставки:

  • q - deliver and queue if fail
  • d - deliver and delete if fail
  • o - deliver and only queue the mail - this means that mail is just thrown straight into the smtpdd queue and wont be delivered until the qrun cronjob is executed

Включаем dualdelivery для smtp - в файле /etc/postfix/master.cf изменяем строку smtp (обычно она первая) и приводим ее к следующему виду:

smtp      inet  n       -       -       -       -       smtpd
       -o content_filter=dualdelivery

Не забываем прописать одну из этих настроек: relay_domains или virtual_mailbox_domains чтобы mailrelay пересылал почту.

Если доставка почты нужна на сам mailrelay, нужно добавить /etc/postfix/master.cf строки:

localhost:10026 inet n - n - - smtpd
   -o content_filter=
   -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters

и изменить dualdelivery - добавить localhost:10026:q

dualdelivery    unix    - n n - 5 pipe
        user=smtpdd argv=/opt/smtpdd/smtpdd.sh /var/spool/smtpdd/ ${sender} ${recipient}
        localhost:10026:q mainserver:25:q backupserver:25:q testserver:25:d

Скрипт smtpdd.sh имеет одну неприятную особенность: он не умеет правильно работать с несколькими получателями - письмо доходит только первому пользователю из списка. Это исправляется просто: в файл /etc/postfix/main.cf необходимо добавить строки:

# Для dualdelivery - двойной доставки на несколько почтовых серверов
# dualdelivery в имени переменной - это название транспорта из master.cf
# без данной настройки почта не будет доставляться если письмо отправлялось сразу
# нескольким пользователям
dualdelivery_destination_recipient_limit = 1

  • software/postfix/postfix-dualdelivery.txt
  • Последнее изменение: 2017/05/09 15:34
  • (внешнее изменение)