Отправить VERP-совместимое письмо, используя python и postfix
Я хочу иметь возможность отправлять электронные письма в Python, чтобы я мог анализировать отказов. VERP, кажется, решение этой проблемы. Однако я не получаю уведомления о сбое, когда я устанавливаю свой адрес отправителя (не значение "От" объекта MIMEMultipart), чтобы включить разделитель VERP.
Могу ли я просто сформировать своего собственного отправителя VERP (т.е. отправить по адресу user@domain.com, могу ли я просто задать адрес From: для этого получателя "mysender+user-domain-com.mydomain.com") и ожидать, что он будет работать, или мне нужно настроить postfix для правильного разбора сбойного DSN? Моя проблема заключается в получении уведомления об ошибке, а не в получении сообщения для доставки действительным получателям, когда я делаю это.
Может быть, пример поможет.
Когда я отправляю электронное письмо с myuser@domain.com, я получаю уведомления об отказах.
Когда я отправляю электронное письмо от myuser+verp_identifier@domain.com, я не получаю никаких уведомлений об отказе. (Хотя адреса электронной почты с правильной адресацией, например: valid_user@gmail.com, проходят очень хорошо.) В почтовом модуле Perl есть подмодуль Verp, есть ли в python что-то подобное?
2 ответа
Вы должны использовать "Return-Path", а не FROM в качестве адреса, на который отправляется отклоненное сообщение. Указание пути возврата в исходящем сообщении с использованием Postfix не требует специальной настройки.
Требование к конфигурации для Postfix для обработки переменных входящих сообщений может быть обработано с помощью + в адресе, потому что + и все последующее, как правило, игнорируются. Поэтому установка Return-Path на joe+bounce@here.com должна быть доставлена на joe@here.com с адресом To joe+bounce@here.com. Программная обработка сообщения может быть выполнена с добавлением фильтра в файл master.cf.
Поместите это в список услуг:
smtp inet n - - - - smtpd
-o content_filter=filter:dummy
и определите фильтр здесь:
filter unix - n n - 10 pipe
flags=Rq user=filter null_sender=
argv=/home/filter/InboundProcessor.py -f ${sender} -- ${recipient}
Это заставит скрипт InboundProcessor.py получать все входящие сообщения через канал. Если адрес "Кому" содержит + после некоторого значения ключа возврата, который можно связать с недействительным адресом, вы можете пометить этот адрес как неактивный в вашей базе данных.
Чтобы правильно работать с VERP, Postfix должен быть специально настроен. smtpd_authorized_verp_clients
в котором перечислены клиенты, которым разрешено использовать VERP, настроить только отправляющую часть. Фактически в нем перечислены клиенты, которым разрешено использовать команду XVERP, которая автоматически добавляет +dest
конвертировать адрес отправителя.
Но в конфигурации по умолчанию Postfix не доставляет автоматически sender
сообщения, отправленные sender+ext
, Чтобы это работало, вы должны добавить (или раскомментировать) recipient_delimiter = +
в main.cf
, В конфигурации по умолчанию строка присутствует, но закомментирована.
Так что, если вы можете сформировать свой собственный адрес отправителя VERP, т.е. иметь адрес отправителя enveloppe myuser+verpid@domain.com
, вам больше нечего делать, если у вас есть recipient_delimiter = +
: целевой SMTP-сервер отправит отказы на этот адрес, и ваш Postfix правильно доставит его на myuser@domain.com.
Я не знаю ни одного пакета python, который бы автоматически добавлял команду XVERB. Поэтому, IMHO, если вы хотите, чтобы он использовался автоматически, вы должны следовать следующему рецепту, описанному в Postfix VERP Howto:
Вы можете использовать функцию smtpd_command_filter для добавления XVERP к командам SMTP из устаревшего программного обеспечения. Для этого требуется Postfix 2.7 или более поздняя версия.
/etc/postfix/main.cf:
smtpd_command_filter = pcre:/etc/postfix/append_verp.pcre
smtpd_authorized_verp_clients = $mynetworks
/etc/postfix/append_verp.pcre:
/^(MAIL FROM:<listname@example\.com>.*)/ $1 XVERP