procmailrcとPHP

procmailrcとPHP

これはうまくいきません。私にメールを送る必要があります。 (テストとして、私たちが実際にphpファイルを望むのはmySQLデータベーステーブルに挿入することです。)

入力はPayPalの支払い通知メッセージです。

(同様のレシピする内容欄を探して両方の人にメールで送ってください。)

procmailrc:

VERBOSE=off
MAILDIR=/usr/home/our/mail
LOGFILE=/usr/home/our/paypal.log
EXITCODE = 99

:0b
|base64 -d|grep -i Description|php tp129.php

PHPファイル:

$rawmessage = "";
$fd = fopen("php://stdin", "r");
while(!feof($fd)) {
$rawmessage .= fread($fd, 1024);
}
fclose($fd);

$msg129 = 'raw is ' .$rawmessage;

mail('[email protected]','msg129',$msg129 );

答え1

修正したい部分があります。

  1. ファイルを確認してください$HOME/.forward。私の考えには644の権限が必要で、次の行が含まれている必要があります。電子メール"| /usr/bin/procmail"に対処してください。procmail実際のパスを確認してください。システムのパスでも別のパスでもかまいませんprocmail。への完全修飾パス/bin/procmailが必要です。procmail.forward
  2. <?phpさらに、パイプラインにはインタプリタへのフルパスまたは別のパスが必要になるtp129.php場合があります。php/usr/bin/php
  3. のパラメータをもう一度確認してください.procmailrcMAILDIR=/usr/home/our/mailファイル名がLOGFILE=/usr/home/our/paypal.log疑わしいようです。つまり、/usr/home/奇妙なディレクトリです。ユーザーIDの「ホーム」ディレクトリは通常、次のディレクトリにあるか/homeほとんどありません/u/usr
  4. PHPコードのみを実行し、php tp129.phpテキストにテキストを入力してCtrl-Dを押します。では、必要なアドレスにメールが送信されますか?そうでない場合は、問題の原因が何であれ解決してください。

答え2

PHPmail()関数には、ヘッダー全体を含む有効な電子メールメッセージが必要です。あなたのコードはメッセージ本文のみを生成するようです(デコードされたbase64コンテンツにヘッダーが含まれていない限り、ヘッダーの前にランダムな文字列を追加するとメッセージが破損します)。

EXITCODE構文エラーが含まれていない場合、明示的な割り当てはエラーメッセージでProcmailを終了します。 Procmailだけでなくシェルスクリプトでも、割り当て時に等号の周囲にスペースを入れることはできません。とにかく、あなたが達成したいことが何であるかはわかりませんEXITCODE。私の提案は単に置くことです。

最終目標がメッセージをMySQLにインポートすることであれば、より簡単なテストを提案します。追加する2番目のファイルを開き、そのファイルに出力を作成します。これにより、PHPコードが期待どおりに機能しているかどうかがわかります。 (結果がいつ記録されたかを確認できるように、タイムスタンプを追加して以前の結果を確認しないことがあります。テスト中に実際に追加するのではなく上書きしたい場合がありますが、日付スタンプはまだ意味があります。) 。しかし、.procmailrc同様の。

:0b
| base64 -d | \
  sed -n '/Description/s/.*/insert into table (field1,field2,field3) values (&);/p' \
  | mysql -uyou -pxyzzy -s db

その間、あなたの即時の問題を解決する方法は次のとおりです。

完全なPHPプログラムは単一のsedスクリプトに置き換えることができますsed '1s/^/raw is /'役に立たない使用grep私も検索を検討しますDescription

:0bfw   # Can be simplified if your sed supports a case-insensitive flag
| base64 -d | \
  sed -n '/[Dd][Ee][Ss][Cc][Rr][Ii][Pp][Tt][Ii][Oo][Nn]/s/^/raw is /p'
:0
! [email protected]

転送操作では、元のヘッダーが保持されます。これが望ましくない場合は、例えばformail;を使用して保持したい項目を抽出したり、を使用してまったく新しいヘッダーを生成したりできますprintf。簡単な2番目のレシピを、次のように複雑な操作に置き換えることができます。! [email protected]

:0fhw
| ( formail -XSubject:; \
    printf "From: %s\nTo: %s\n" "[email protected]" "[email protected]" )
:0
! -t

sendmail -tメッセージヘッダーの内容を取得し、そこにメッセージを送信することを意味します。)

デバッグのためのレシピファイルには明示的なVERBOSE=offVERBOSE=yes

関連情報