web-dev-qa-db-ja.com

メールがメールサーバーに到着したときにスクリプトを実行する方法(Debian)

ミッションクリティカルなアプリケーションのメールサーバーに到着したばかりのメールの情報を解析して挿入したいと思います。

メールが到着したときにスクリプトを実行するようにメールサーバーを構成する方法はありますか。

私はdebianシステムを持っていますが、一般的なソリューション(Linux)で十分です。

5
Rahul Prasad

他の誰か はすでにこれに答えているようですが、私はあなたのために特定の答えを書き留めると思いました。

私はprocmailを使用し、次のような.procmailrcのレシピを使用します。

#turn this off when you're finished testing :)
VERBOSE=on
LOGFILE=/home/user/procmail.log

:0 c #the c means continue on after this recipe is parsed
| /path/to/your/script

メールをmaildirに送信するには、下部にデフォルトのレシピも必要です。

7
vsltd

/ etc/aliasesを使用して、処理するプログラムに電子メールを直接パイプすることができるため、test @ domain.comへのすべての電子メールを処理するスクリプトを実行する場合は、この行を/ etc/aliasesに配置します(postfixで機能し、 sendmailなど):

test:              "|/usr/local/bin/processtestemail.php"

次に、「newaliases」を実行してデータベースを更新します。

次に、/ usr/local/binにprocesstestemail.phpという名前の作業プログラムがあることを確認します。

これは、php、bash、Perl、pythonなど、インターピーターに必要なもの、および何でも持つことができます。 c/c ++などで書かれたコンパイル済みバイナリを起動することもできます。

上記のprocmailの使用に関する提案がありましたが、これは優れた製品ですが、正直に言って、これが最速で最も単純なソリューションであり、他のどのバージョンよりも多くのメーラーを持つ* NIXのより多くのバージョンで機能します。

また、他のどの回答も実際には受信メッセージの処理方法を教えてくれないので、スクリプトで標準の「in」(stdin)から入力を読み取り、適切に処理する必要があるアルゴリズムを使用してそのデータを解析します。続く:

<?php

$fd = fopen('php://stdin','r');
if ($fd) then
    {
    $email = '';                         // initialize buffer
    while (!feof ($fd))                  // read as long as message
        {
        $rawemail .= fread($fd,1024);    // read up to 1K at a time
        ProcessTheMessageChunk($rawEmail);
        }
    fclose($fd);                         // done so close file handle
    $fd=NULL;                            // clear file handle
    }
else
    {
    print("ERROR:  Could could open stdin...");
    };

/* 
** Now write your code to fill in the function ProcessMessageChunk()
** and then process the data you have collected altogether using
** that function/subroutine.
*/

?>

おかげでSA採用の専門家:私たちはそれをすべて大小に関わらず行いますtekops.com

2
David Beecher

これが良い 受信メール処理の方法 です。最も簡単なことは、.forwardメカニズムを記述し、スクリプトを通じてメッセージをパイプ処理します。ユーザーのホームディレクトリにモード600の.forwardファイルを作成し、スクリプトにパイプを入れます。

"|$HOME/bin/your.program -and some arguments" 

ただし、ハウツーの詳細については、代わりにprocmailの使用を検討する必要があります。 Procmailには、より高度なロギングやメール処理など、多くの利点があります。簡単な.procmailrcの例を次に示します(これも同じhowtoです)。

:0
* !^FROM_DAEMON
* !^FROM_MAILER
* !^X-Loop: [email protected]
| $HOME/bin/my.script 

これには、メールのループを検出して停止する機能など、いくつかの素晴らしい機能があります。

2
Phil Hollenback

Postfixでは、すべての着信メッセージ(何らかのパターン、または単にすべてに一致する)を保持し、アプリケーションでそれらをhold /ディレクトリにピックアップして、完了したらそれらをincoming /ディレクトリに戻すことができます。これは、postfixと一緒に使用した場合に、スパム対策フィルタMailScannerが機能する方法です。


Postfix設定ファイル/etc/postfix/main.cfに次の行を追加します:
header_checks = regexp:/ etc/postfix/header_checks
/etc/postfix/header_checksファイルに次の行を追加します。
/^受領済み:/保留

これの効果は、アプリケーションが完了したら、PostfixにすべてのメッセージをHOLDキューに移動するように指示することです。メールを着信/ディレクトリに配置する必要があると思います。

0
3molo