====== 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}}