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


8

私はPostfix / Dovecotメールサーバーを個人で使用するために実行しています。実際のメールボックスはほんの一握りで、基本的にはpostmaster@domain.comとだけusername@domain.comです。

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

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # username_servicename@domain.com      username@domain.com
sudo postmap virtual
sudo service postfix restart

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

username@domain.comメッセージの本文として仮想メールボックス名を使用して、サーバー上の他のメールボックスに電子メールを送信できるようにしたいと考えています。問題はsudo呼び出しですが、私はそれを処理する必要があるこれを処理することを唯一の責任とする新しいユーザーを作成できます。

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


このリンクをチェックしましたか?
kirill-a 2015

@ kirill-aいいえ、ありませんでした。それはこの問題を解決することを目的とする可能性があるように見えますが、今や私はようやくPHPを学ぶ良い理由があります
Adam Smith

PHPを習得する必要はありません。PHPスクリプトを独自のシェルスクリプトに置き換えるだけで完了です。
MariusMatutiae

@MariusMatutiaeあなたまたはキリルアがそのトピックについての回答を書きたい場合は(それが機能すると仮定して)、賞金を喜んで授与します
Adam Smith

@kirill-上記の私のコメントに対する礼儀のping。
アダム・スミス

回答:


8

メールメッセージの受信時にスクリプト(シェルスクリプトを使用)を実行する正しい手順は次のとおりです。それは修正が含まの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に指示します(実行可能にする必要があります)。

スクリプトを実行する際に指定するには、次のように行います:あなたはときに実行される必要があるとしusername@domain.comがメッセージを受け取ります。次の行を配置します

 username@domain.com 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

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


2
ここで「check_recipient_access hash:/ etc / postfix / address」という意味ですか?あなたは、あなたの指示に基づいて、私があなたが「アドレス」を意味すると思ったところで「アクセス」を使用しました。
Lee Fuller

3
さまざまな仮想ドメインに対してvirtual_mailboxesを実行している場合、これは同じですか?私はこれらの指示を逐語的に実行しました。virtual_aliasを宣言しないと、バウンスが発生します。実行すると、メッセージはメールボックスに配信されますが、スクリプトはトリガーされません。
Lee Fuller

これが機能しませんでした。この答えは働いた:serverfault.com/questions/322657/...
ジーザスライフハウスを

私が理解していることから、このソリューションには、SMTP経由で受信されたメッセージに対してのみトリガーされるという問題もあります。 sendmailサーバー上の直接はこれをトリガーしません。
Philip Couling

@PhilipCoulingこの回答を参照してください:unix.stackexchange.com/a/179407pickupオプションを使用できます。
ステファン

4

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

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

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


私が現在持っている以外の理由で、私はPostfixに縛られていません。ただし、現在のMDA / MTAで機能する解決策を見つけたいと思います。区切りのためとして:私はほとんど送信者が私の願いを尊重することを信頼しないではなく、私のメールアドレスを転売、または私は:)彼らに永久的なアドレスを与えることだろう
アダム・スミス

違いは、私の第二の代替のようなもので、ある@AdamSmith、あなたはどこか他の問題を引き起こすことなく、特定のエンティティを与えたアドレスを無効にすることができ、かつアドレスが見えるにもダム自動化された検証に賢明。MDA / MTAの維持に関しては、procmailをPostfix MDAのドロップイン代替として使用できます。MTAとしてPostfixを置き換える必要はありません。
CVn 2015年

procmailはもうメンテナンスされていません:lwn.net/Articles/416901のタイトルの記事を参照してください:procmailの死の報告はそれほど誇張されていません。安全にプレイし、@ kirill-aの提案に従ってください。
MariusMatutiae

procmailはまだ十分に使用されており、(IMHO)はアドホックフィルタリングの最良のソリューションであり続けます。@MariusMatutiaeの事実上死んだというメモは、その開発にのみ適用されます。今まで経験したことのないprocmailのバグは思いつきません。それに本格的なメーリングリストを実装するなど、とんでもないことをしました。たぶんそれをとる唯一の方向はその範囲を超えているため(たとえば、スパム対策、SpamAssassinまたはmilter-greylistのほうが適しているなど)、開発が進んでいない可能性があります。
Adam Katz 2015年

そして、あなたは私にこれを言っています...
MariusMatutiae

2

リンクがダウンした場合の概要は次のとおりです。

まず、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の回答を参照してください。


「不明なメール転送エラー」が発生しました...
user1133275
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.