1

ショートストーリー

.qmailファイルを使用して受信メールをフィルタリングするPHPスクリプトがあります。スクリプトは完全に機能し、すべてのアクティビティをログに記録しますが、私の知る限り、スクリプトがdot-qmail終了コード99を返し、それ以降の.qmail行の処理を停止する場合、最後の.qmail行は実行されません。

長い話:

Linux2.6.18-4-686でParallelsPleskPanelバージョン9.3.0を使用しています。

私のPHPCLIバージョンは5.2.0-8+etch16(cli)です(ビルド日:2009年11月24日11:14:47)。

Spamassassin、Dr。Web、zen.spamhaus.orgとその結果に満足できなかったため、すべての受信メールをフィルタリングするための独自のPHPスクリプトを作成することにしました。

(「この男は車輪の再発明をしている」と思う人もいますが、私は顧客とその特定のニーズを個人的に知っているので、何千ものテストを行った後、ブラックボックスモデルを回避し、プロセスを包括的に制御し、サーバーリソースを解放し、他の優れた機能への扉を開くことができます)。

ただし、サーバーにスクリプトをインストールするのに苦労しています。

qmailfilterは私のスクリプトであり、 http: //titanpad.com/1IFDj1jvB0で見ることができます。

既存の.qmailファイルを次の/var/qmail/mailnames/customerdomain.com/username/.qmailように編集しました。

|/var/my/qmailfilter/qmailfilter
|/usr/bin/deliverquota ./Maildir

このユーザーアカウントにメッセージを送信すると、qmailfilter PHPスクリプトが実行され、完全にログに記録され、終了コードが返されます(メッセージを破棄する場合は99、メッセージを配信する次の.qmail行に進む場合は0)。

私がすでに試した多くの終了コードに関係なく、メッセージを配信することがわかりました。

スクリプト(174行目を参照)は、前後に空白なしのテキスト終了コードを出力します。、、、さらにはexit($code)、を試しました。print $codeecho($code)file_put_contents("php://stdout", $code)exit(chr($code))

dot-qmailコードは次のとおりです。

0-成功(次の.qmail行に移動)

99-成功して中止します(次の行を実行しないでください)

100-永続的なエラー(バウンス)

111-ソフトエラー(後で再試行)

出典:Qmailの全体像。

その他の試み/実験:

  1. シバンライン( )を削除し#!/usr/bin/php、最初の.qmailラインをに変更しました|php -q /var/my/qmailfilter/qmailfilter

  2. スクリプトの最後の行でホワイトスペースを確認しました

  3. dot-qmail manファイルを読みましたが、決定的なものは見つかりませんでした

  4. .qmail行に参加しました:

    | / var / my / qmailfilter / qmailfilter | / usr / bin / Deliverquota ./Maildir

この場合、ヘッダー、件名、またはメッセージ本文のない適切なリターンコードのみを含むメッセージを受け取りました。

  1. 2行目をコメントアウト(#)しました.qmailが、メッセージの受信を停止しました。

  2. /var/qmail/control/defaultdelivery最初の行を追加するために編集:

    | php / var / my / qmailfilter / qmailfilter | / usr / bin / Deliverquota ./Maildir

ユーザー.qmailファイルの名前をに変更しました_qmail。同じ結果。

PHPスクリプトを介してメッセージを配信し、終了コードを忘れる必要がありますか?

もしそうなら、メッセージをユーザーMaildir / newに保存するだけで十分ですか?

もしそうなら、メッセージのファイル名は重要ですか?

任意のアイデアをいただければ幸いです。どうもありがとう!

更新:それを必要とする人のために、私はicebex.comで最終的なスクリプトを公開しましたslash qmailfilter

4

1 に答える 1

1

コードをざっと見ただけですが、文字列値を使用しているように見えました。exit('99')exit(99)同じではありません。文字列ではなく整数を使用してください。

  • exit( '99')は99を出力し、0を返します。

  • exit(99)は99を返します。

于 2010-09-09T04:51:50.737 に答える