0

私は procmail のセットアップがうまく機能していて、メールを受信したときに PHP スクリプトを問題なく実行しているようです。

.procmailrc ファイルの例を次に示します。

#BEGIN PROCMAIL SCRIPT FOR MAIL PARSING
DEFAULT=$HOME/Maildir/
MAILDIR=$HOME/Maildir
PMDIR=$HOME/.procmail
LOGFILE=$PMDIR/log.`date +%y-%m-%d`
SHELL=/bin/sh

:0
|`/usr/local/php53/bin/php /home/usrmail/email/script.php`

以下のログ出力:

 From x13542053@homiemail-mx22.g.dreamhost.com  Mon Feb 18 20:49:35 2013
 Subject: TEST
  Folder: HELLO                                                            2559
/bin/sh: HELLO: No such file or directory

単純なecho "HELLO";php スクリプトだけで、正常に動作するようです。

ただし、次のコードを使用して実際に電子メールを解析しようとすると、ログに以下のエラーが表示されます。

$rawEmail = '';
if (($fp = fopen('php://stdin', 'r')) !== false) {
    while (!feof($fp)) {
        $rawEmail .= fread($fp, 1024);
    }
    fclose($fp);
}

 $email = new Zend_Mail_Message(array(
   'raw' => $rawEmail
));

From actualaddress@gmail.com  Mon Feb 18 20:44:36 2013
 Subject: Re: Test
  Folder: Fatal error: Class 'Zend_Mail_Message' not found in /home/sy     2747
/bin/sh: Fatal: No such file or directory

これは明らかに正しく機能していません。理由はわかりません。1 つは、From ヘッダーがこの 1 つで通過しましたが、もう 1 つは通過しませんでした。これは断続的なようです。

また、ディレクトリ (/home/sy) が切り詰められているか、何かが切り捨てられてエラーが発生しています。

Zend や procmail にはまったく詳しくありません。ここまでたどり着けてよかったです。メールを少し解析して、メールの本文を取得してどこかに配置できるようにしたいだけです。これは IMAP などを使用するよりも優れた方法であると誰かが確信し、私は耳を傾けました。誰かが素晴らしい解決策や代替手段を持っているなら、私はすべて耳にします. みんなありがとう!

4

1 に答える 1

1

関連しているが異なる 2 つの構文を混在させています。

スクリプトにパイプする場合は、次のようにする必要があります

:0
* conditions, maybe
| /path/to/script

または、スクリプトの出力を使用する場合は、次のようなものです

:0
* conditions, maybe
`echo HELLO`

HELLOつまり、スクリプトからの出力をリテラルとして使用します。

PHP からのエラー メッセージについては、PHP のライブラリ パスに何かを追加する必要があると思います (すばやくグーグル検索するとinclude_pathphp.ini.

しかし、あなたは何を達成しようとしていますか?ヘッダーが送信すべきと言っている場所にメッセージを送信したいだけの場合は、次のようになります

:0
* conditions, maybe
! -t

それを取得する必要があります。あなたがこれをしたい状況を想像することはできません (間違った問題を完全に解決しようとしている場合を除きます)。メッセージの切り詰められたコピーを送信したい場合は、

:0c
* conditions, maybe
{
    :0fw
    | head -n 10
    :0
    ! -t
}

メッセージを最初の 10 行に切り捨てます。正確に 1024 バイトに切り詰めたい場合は、それほど難しくありません。

一方、メッセージの本文 (完全な RFC822 本文、つまり、MIME 添付ファイルなどはデコードされずにそのまま含まれます) を保存するだけの場合は、次のようにします。

:0b
saved/

または、そこにPHPが必要な場合

:0b
| /path/to/script.php

エラー メッセージは省略されていますが、これは主に、電子メールを配信するスクリプトの名前として使用しようとしていることが原因です。逆引用符を取り除くと、エラー メッセージは切り捨てられずに Procmail の標準エラーに出力されるはずです。

于 2013-02-19T12:38:26.780 に答える