
Я хотел бы управлять всей входящей электронной почтой *@example.com
с помощью скрипта Python, запущенного на моем сервере, который будет выполнять различные задачи.
Я уже создал запись DNS MX для
example.com
, направив ее на мой сервер:mx.example.com MX mailforwarder.example.com mailforwarder.example.com A 1.2.3.4
Я провел множество проб и ошибок с postfix и exim, но ничего не работало, поэтому я удалил их все:
apt-get remove postfix
иapt-get remove exim4
, так что я готов начать с новой установки одного из них (какой из них обеспечит кратчайшее решение для этой конкретной задачи?)
Каковы основные шаги для направления всей входящей электронной почты *@example.com
в скрипт Python?(включая: указание MTA принимать электронные письма, приходящие извне сервера, со всего Интернета и т. д.)
решение1
procmail
считается проблемнымФилиппа Гюнтера (и вполне возможно, что в данном случае он бесполезен, поскольку .forward
файлы или эквиваленты могут отправлять письма непосредственно в вашу программу, минуя ненужную сложность procmail
).
Краткое содержание: удалите порт procmail; код небезопасен и не должен использоваться в качестве основы для дальнейшей работы.
Как многие знают, я был ответственным за поддержку procmail с конца 1990-х по 2001 год.
Поэтому может быть целесообразно другое решение; это зависит от почтового транспортного агента (MTA). Другой вариант — использовать MTA для доставки в локальный файл или IMAP, а затем заставить вашу программу анализировать этот файл или IMAP. Это имеет бонус в виде продолжения приема электронной почты и ее сохранения где-то; что произойдет, если ваша программа глючит или иным образом не запустится? Меньше проблем, чем при доставке почты в реальном времени...
Эксим
Вероятно, либо скопировать метод Sendmail .forward
, либо разобраться, как это правильно сделать в Eximese. (Я прервал эту затею, так как копание в документации Exim заняло слишком много времени.)elspy
если вы хотите выполнить сканирование во время SMTP в режиме MILTER...
Постфикс
Боже, это кажется длинным и сложным.
Отправить письмо
Установите mailertable
запись для пересылки всех писем для домена (и .domain
для поддоменов, если необходимо) локальному пользователю, здесьjdoe
example.com local:jdoe
.example.com local:jdoe
а затем настроить .forward
файл для этого пользователя, чтобы запустить необходимый код
$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$
что может быть таким же простым, как
$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$
поскольку электронные письма подаются на стандартный ввод (это может быть плохо, если process
одновременно запускаются несколько экземпляров этого; предположительно, ваш фактический код обрабатывает такие состояния гонки или является идемпотентным... верно?). Этот метод может также работать для любого другого MTA, который копирует прямой синтаксис Sendmail, предполагая, что вы можете заставить MTA перенаправлять все письма определенному пользователю.
Это предполагает, что mailertable
поддержка включена, confFORWARD_PATH
настроена, что Sendmail разрешено запускать код ( smrsh(8)
хотя обратите внимание, что некоторые поставщики могут изменить каталог, не обновляя документацию (запуск strings /the/path/to/smrsh | fgrep /
может помочь)) и что что-то вроде selinux также не нарушает работу.
Другой вариант для Sendmail — использовать MILTER, напримерMIMEDefangи выполнять любую необходимую бизнес-логику там. (Различные другие MTA поддерживают MILTER или имеют что-то похожее.)
Демон простого протокола передачи почты (OpenBSD)
Из взгляда наsmtpd.conf(5)
(обновлено с учетом изменений OpenBSD 6.4)
action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"
решение2
Это казалось достаточно распространенным вопросом... Я нашел на него уже ответ, и это то, что я бы предложил. Procmail — это местный агент доставки.. которыйЯ думаюозначает, что что-то уже получило почту из сети и передало ее procmail для локальной доставки или другой фильтрации. В этом случае postfix был бы тем самым. Запустив postfix в продакшне, я получил надежный инструмент, очень гибкий для индивидуальной обработки почты.
решение3
Мне нравится стек mail-in-a-box, который использует Postfix и Dovecot. После их установки вы можете сделать следующее, чтобы выполнить скрипт при получении почты на определенные адреса:
создайте свой скрипт (т.е.
mail_processor.py
) в/usr/lib/dovecot/sieve-execute/
каталоге:#!/usr/bin/python3 from sys import stdin with open('/var/log/mail_processor.log', 'a') as logfile: for line in stdin: print(line.rstrip(), file=logfile)
убедитесь, что у вашего скрипта и целевых файлов правильные разрешения:
$ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py $ chmod 0777 /var/log/mail_processor.log
включить
sieve_extprograms
плагин:измените
\etc\dovecot\conf.d\90-sieve.conf
раздел плагина следующим образом:sieve_extensions = +vnd.dovecot.execute sieve_plugins = sieve_extprograms sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
перезагрузить голубятню:
$ service dovecot restart
создать фильтр-решетку (т.е. в Roundcube перейти
settings
->filters
->actions
->edit filter set
):require ["vnd.dovecot.execute"]; # rule:[mail processing] if true { execute :pipe "mail_processor.py"; }
Теперь вся почта, доставленная в любой почтовый ящик с этим фильтром-сеткой, будет направляться mail_processor.py
на обработку.
Pigeonhole Sieve: плагин Extprogramsдля справки