Перенаправить всю входящую электронную почту на скрипт Python

Перенаправить всю входящую электронную почту на скрипт Python

Я хотел бы управлять всей входящей электронной почтой *@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...

Постфикс

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

Боже, это кажется длинным и сложным.

Отправить письмо

Установите 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 в продакшне, я получил надежный инструмент, очень гибкий для индивидуальной обработки почты.

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

решение3

Мне нравится стек mail-in-a-box, который использует Postfix и Dovecot. После их установки вы можете сделать следующее, чтобы выполнить скрипт при получении почты на определенные адреса:

  1. создайте свой скрипт (т.е. 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
      
  2. включить 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
      
  3. создать фильтр-решетку (т.е. в 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для справки

Связанный контент