web-dev-qa-db-ja.com

メールの受信時にスクリプトを実行する

私はPostfix/Dovecotメールサーバーを個人用に実行しています。実際のメールボックスはほんの一握りで、基本的には[email protected][email protected]のみです。

私は頻繁にvirtualファイルを使用して、[email protected]に転送される仮想メールボックスを作成しています。オンラインストアからの1回限りの購入や、進行中のスパムを心配せずに試してみたいオンラインゲームなど、使い捨てのアカウントにこれらをいくつか用意しています。そうするために、SSHで次のコマンドを実行します。

Sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
Sudo postmap virtual
Sudo service postfix restart

これは、プロセスをある程度自動化するのに十分な頻度で行います。私は、仮想メールボックスと実際のメールボックスを引数として取り、それ自体を変更するシェルスクリプトを単に作成することを検討しましたが、さらに多くの手を引きたいと思っています。

メッセージの本文として仮想メールボックス名を使用して、[email protected]からサーバー上の他のメールボックスにメールを送信したいのですが。問題はSudoの呼び出しですが、これを処理することを唯一の責任とする新しいユーザーを作成できます。

ほとんどの質問はこれです:電子メールによってトリガーされるイベントをどのように作成しますか?これを行うサービスはどこにありますか? PostfixまたはDovecotを設定して、そのメールをリッスンし、そのイベントでコマンドを実行できますか?

8
Adam Smith

メールメッセージの受信時にスクリプト(シェルスクリプトを使用)を実行する正しい手順は次のとおりです。 postfixの構成ファイルmaster.cf(私のDebianでは/ etc/postfixにあります)を追加して変更します。次の行:

 my_Shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/Shell/script ${sender} ${size} ${recipient}

これは、何らかのイベントが発生したときにスクリプトを実行するようにpostfixに指示します(実行可能にする必要があります)。

スクリプトをいつ実行するかを指定するには、次のようにします。[email protected]がメッセージを受け取ったときにスクリプトを実行するとします。次の行を配置します

 [email protected] FILTER my_Shell_script:dummy

ファイル内/ etc/postfix/address.txt;このファイルを使用するには、postfixの適切なデータベースを作成する必要があります。これは、

  postmap /etc/postfix/address.txt

/ etc/postfix/address.dbというファイルを出力として生成します。 / etc/postfix/main.cfファイルに戻り、次の行を追加します。

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

再起動postfix

  postfix reload

そして、あなたは行ってもいいはずです。

8
MariusMatutiae

2つの明白な解決策を見ることができます。

サーバーでprocmail as the MDAを使用している場合、またはそれを使用するように変換する場合は、procmailの|(パイプ)レシピを使用して任意のメールで任意のスクリプトを実行できます。アクション。うまくいけばrootとして起動されないでしょうが、必要な魔法を実行し、関連するユーザーがrootとしてパスワードなしで呼び出すことができるスクリプトを簡単に作成できるはずです。スクリプトの出力は、同じメールにフィードバックされ、レシピをフィルターアクションにすることで、後で配信されるメールにもなります。

別の方法(実際のメンテナンスが少なくて済みます)は単一のメールボックスを作成し、Postfixの $recipient_delimiterを通常は使用しないものに設定します目的;たとえば、.または-。 recipient_delimeterはサーバー全体の設定であることに注意してください。メールボックス[email protected]を設定し、$recipient_delimeter = .を設定したとします。これによりdummy.<anything>@example.comが許可され、[email protected]に対応するローカルメールボックスに配信されます。これらのいずれかを無効にするには、拒否アクションを使用してdummy.<whatever>@example.comを適切な受信者テーブルに追加します。欠点は、それがプレフィックスのキャッチオールメールボックスになることです。そのため、偶発的な攻撃や辞書攻撃によってプレフィックスを見つけにくくする必要があります。良い点は、通常の場合(送信者があなたの希望を尊重し、あなたの電子メールアドレスを転売しない)です。このアプローチはメンテナンスが不要であり、いつでもプレフィックスを変更して、メールの受信を継続するこれらの組み合わせを明示的にリストできます。 。

4
a CVn

link がダウンした場合の要約を以下に示します。

まず、master.cfおよび次の行を追加して、スクリプト「myhook」を登録します。

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

また、smtp行を編集して、PostfixにSMTP配信を介して到着するメールのフィルタを実行するように指示します。

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

「sendmail」コマンドを使用してメールを送信している場合、フィルターはトリガーされないことに注意してください。この場合、「集荷」配送方法の後にオプションを追加します。

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Postfixを再起動します:postfix reload

スクリプトをだれでも読み取り可能および実行可能にします:chmod +rx script.sh

スクリプトは常に、到着するメールに対してトリガーされることに注意してください。正確な住所を指定するには、@ MariusMatutiaeの回答を参照してください。

2
kirill-a