すべての受信メールを 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で、どちらか 1 つを新規インストールして開始する準備が整いました (この特定のタスクに対して最も短いソリューションを可能にするのはどれでしょうか?)

すべての受信メール *@example.comを Python スクリプトに転送するための主な手順は何ですか?(サーバーの外部やインターネット全体などから送信される電子メールを受け入れるように MTA に指示することを含む)

答え1

procmail問題があると考えられるPhilip Guenther による (そして、この場合、おそらく役に立たない。.forwardファイルまたは同等のものが、の不必要な複雑さをスキップして、メールをプログラムに直接送信できるからであるprocmail)。

要約: procmail ポートを削除します。コードは安全ではないため、今後の作業の基礎として使用しないでください。

ご存知の方もいるかもしれませんが、私は 1990 年代後半から 2001 年まで procmail のアップストリーム メンテナーを務めていました。

したがって、他の解決策が推奨される可能性があります。これは、メール転送エージェント (MTA) に依存します。別のオプションとしては、MTA を使用してローカル ファイルまたは IMAP に配信し、プログラムでそのファイルまたは IMAP を解析する方法があります。この方法には、電子メールの受信を継続してどこかに保存するという利点があります。プログラムにバグがあったり、実行に失敗したりした場合はどうなるでしょうか。ライブ メール配信中よりも問題は少ないです...

輸出入

おそらくSendmailの.forwardメソッドをコピーするか、Eximeseでこれを適切に行う方法を見つけ出すかのどちらかです。(Eximのドキュメントを調べるのに時間がかかりすぎたため中止しました。)elspyMILTER 方式で SMTP 時間スキャンを実行したい場合...

ポストフィックス

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を使うことです。MIME の牙そこで必要なビジネス ロジックを実行します (他のさまざまな 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

私は Postfix と Dovecot を使用する mail-in-a-box スタックが好きです。これらをインストールしたら、次の操作を実行して、特定のアドレスへのメール受信時にスクリプトを実行できます。

  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
      
    • dovecot をリロードします:

      $ 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これで、このふるいフィルターを使用してメールボックスに配信されたすべてのメールが、アクションのためにパイプされるようになります。

ピジョンホールふるい: Extprograms プラグイン参考のため

関連情報