====== Postfix - доставка входящих писем сразу на несколько серверов (dual delivery) ======
Сама статья и описание: http://pjrlost.blogspot.ru/2012/11/smtp-delivery-to-two-mail-servers-via.html
Внимание, оригинальный скрипт не умеет доставлять почту если в списке получателей больше одного адреса! См. прикрепленные файлы и описание!
===== Скрипты =====
* Оригинальный скрипт: {{:software:postfix:smtpdd.tar.gz|}}
* Модифицированный скрипт, для доставки писем с несколькими получателями: {{:software:postfix:smtpdd.many-users.zip|}}
===== Задача =====
Необходимо доставлять приходящие на почтовый шлюз письма сразу на несколько почтовых серверов без использования пересылок, сборщиков писем и т.д. Это может быть необходимо для:
* резервирование почтовых серверов
* тестирование настроек почтовых серверов
* тестирование антиспамовых и антивирусных продуктов
* сбор всей проходящий почты (мало ли зачем это может быть вам необходимо)
{{ :software:postfix:smtp_dual.png?800 |}}
===== Решение =====
Будем использовать Postfix (в роли MTA), msmtp (для пересылки почты) и скрипт smtpdd.sh который и реализует логику пересылки писем.
Сервера:
* mailrelay - сервер, принимающий почту из Интернета
* mainserver - основной почтовый сервер организации
* backupserver - дополнительный (резервный) сервер организации
* testserver - тестовый сервер, доставка на который неважна (дошло письмо - хорошо, не дошло - не страшно)
Таким образом, путь почты выглядит следующим образом:
* письмо приходит из Интернета на сервер mailrelay
* сервер mailrelay пересылает его на следующие сервера:
* mainserver - доставка обязательна
* backupserver - доставка обязательна
* testserver - доставка желательна
==== Шаг 1 ====
Устанавливаем msmtp:
$ apt-get install msmtp
Важное примечание: в Ubuntu 14.04.4 версия msmtp довольно старая - 1.4.31-1, возможно стоит собрать более новую версию самостоятельно, как описано вот тут: [[devops:make-deb|Компиляция пакетов для Ubuntu]]
==== Шаг 2 ====
Скачать прилагаемый к данной заметке скрипт 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
==== Шаг 3 ====
Добавляем в /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
==== Шаг 4 ====
Скрипт smtpdd.sh имеет одну неприятную особенность: он не умеет правильно работать с несколькими получателями - письмо доходит только первому пользователю из списка. Это исправляется просто: в файл /etc/postfix/main.cf необходимо добавить строки:
# Для dualdelivery - двойной доставки на несколько почтовых серверов
# dualdelivery в имени переменной - это название транспорта из master.cf
# без данной настройки почта не будет доставляться если письмо отправлялось сразу
# нескольким пользователям
dualdelivery_destination_recipient_limit = 1
{{tag>postfix dualdelivery dual delivery msmtp smtpdd}}