PHPメールフィルタリングスクリプト:qmailファイルで認識されていない終了コード
-
01-10-2019 - |
質問
ショートストーリー
.Qmailファイルを使用して、受信メールをフィルタリングするPHPスクリプトがあります。スクリプトは完全にうまく機能し、すべてのアクティビティを記録しますが、私の知る限り、スクリプトがさらに.Qmail行の処理を停止するDot-Qmail Exitコード99を返す場合、最後の.Qmail行は実行されません。
長い話:
Linux 2.6.18-4-686の下で、Parallels Pleskパネルバージョン9.3.0を使用しています。
私のPHP CLIバージョンは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がメッセージを配信する場合は0)。
私が既に試した多くの出口コードのメッセージを逆に伝えていることがわかりました。
スクリプト(行174を参照)は、前後に空白なしでテキスト終了コードを出力します。私は試した exit($code)
, print $code
, echo($code)
そしてさえ file_put_contents("php://stdout", $code)
, 、そしてまた exit(chr($code))
.
dot-qmail
コードは次のとおりです。
0-成功(次の.Qmail Lineに行く)
99-成功と中止(次の行を実行しないでください)
100-永続的なエラー(バウンス)
111-ソフトエラー(後で再試行)
出典:大きなQmail画像。
その他の試み/実験:
削除しました シバン ライン (
#!/usr/bin/php
)最初のものを変更しました.qmail
行|php -q /var/my/qmailfilter/qmailfilter
スクリプトの最後の行をホワイトスパースのためにチェックしました
dot-qmail manファイルを読むが、決定的なものは見つかりませんでした
.Qmail Linesに参加:
|/var/my/qmailfilter/qmailfilter |/usr/bin/deliverquota ./maildir
この場合、ヘッダー、件名、またはメッセージ本文のない適切な返品コードのみを持つメッセージを受け取りました。
コメントした(#)2番目
.qmail
ラインですが、あらゆる種類のメッセージの受信を停止しました。編集
/var/qmail/control/defaultdelivery
最初の行を追加するには:| php/var/my/qmailfilter/qmailfilter |/usr/bin/dervirquota ./maildir
ユーザーの名前が変更されました .qmail
にファイル _qmail
. 。同じ結果。
PHPスクリプトを介してメッセージを配信し、終了コードを忘れる必要がありますか?
もしそうなら、ユーザーMailDir/Newにメッセージを保存するのに十分ですか?
もしそうなら、メッセージファイル名は重要ですか?
どんなアイデアも感謝します。どうもありがとう!
更新:それを必要としている人のために、私はicebex.comスラッシュqmailfilterで最終スクリプトを公開しました
解決
私はコードを簡単に見るだけでしたが、文字列値を使用しているように見えました。 exit('99')
と exit(99)
同じではありません。文字列ではなく整数を使用してください。
Exit('99 ')は99を印刷し、0を返します。
終了(99)は99を返します。