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 - доставка желательна
Шаг 1
Устанавливаем msmtp:
$ apt-get install msmtp
Важное примечание: в Ubuntu 14.04.4 версия msmtp довольно старая - 1.4.31-1, возможно стоит собрать более новую версию самостоятельно, как описано вот тут: Компиляция пакетов для 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