
*@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のドキュメントを調べるのに時間がかかりすぎたため中止しました。)elspy
MILTER 方式で SMTP 時間スキャンを実行したい場合...
ポストフィックス
ああ、それは長くて複雑そうですね。
送信メール
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 を実行したところ、これは堅牢なツールであり、カスタム メール処理に非常に柔軟であることがわかりました。
答え3
私は Postfix と Dovecot を使用する mail-in-a-box スタックが好きです。これらをインストールしたら、次の操作を実行して、特定のアドレスへのメール受信時にスクリプトを実行できます。
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
dovecot をリロードします:
$ 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
これで、このふるいフィルターを使用してメールボックスに配信されたすべてのメールが、アクションのためにパイプされるようになります。