2013-02-19 73 views
0

我有一個procmail設置工作得很好,似乎執行我的PHP腳本沒有問題,當它收到一封電子郵件。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 [email protected] Mon Feb 18 20:49:35 2013 
Subject: TEST 
    Folder: HELLO               2559 
/bin/sh: HELLO: No such file or directory 

只是在PHP腳本簡單echo "HELLO";,似乎好工作!

然而,當我嘗試使用下面的代碼實際上解析電子郵件,我得到下面的錯誤日誌中:

$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 [email protected] 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 

這工作不正常很明顯,我不知道爲什麼。首先,From頭部經歷了這一個,但不是另一個,似乎是間歇性的。

此外,目錄(/ home/sy)被截斷或者某個東西正在切斷以導致錯誤。

我完全不熟悉Zend或procmail。我很高興能夠得到這麼多,只是想分析一下電子郵件,以便我可以獲取電子郵件的正文並將其放在某處。有人說服我這將是一個更好的方式,而不僅僅是使用IMAP或什麼,我聽了。如果任何人有任何美妙的解決方案或替代方案,我全都耳聞。多謝你們!

回答

0

您正在混合兩種相關但不同的語法。

如果你想管你的腳本,它應該只是

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

,或者如果你想使用的腳本的輸出,就像

:0 
* conditions, maybe 
`echo HELLO` 

東西將文件放到一個文件夾命名爲HELLO,即使用腳本的輸出作爲文字。

至於從PHP的錯誤消息,我想你需要添加一些東西到PHP​​的庫路徑(快速谷歌搜索建議你應該修復你的php.iniinclude_path)。

儘管你想完成什麼?如果你只是想發送標題說它應該去的消息,像

:0 
* conditions, maybe 
! -t 

應該讓你。我無法想象你想要這樣做的情況(除非你試圖完全解決錯誤的問題)。如果要發送郵件的截斷副本,如

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

會將郵件截斷爲前十行。如果你想精確截取到1024字節,這並不困難。另一方面,如果你只是想存儲消息的正文(完整的RFC822正文,即任何MIME附件等將只是逐字包括,未解碼的),你可以做到這一點與

:0b 
saved/ 

或者也許如果你想PHP有

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

對於它的價值,錯誤消息被截斷,但主要是因爲您正嘗試將其用作傳遞電子郵件的腳本名稱。如果您取出反引號,則錯誤消息應以Procmail的標準錯誤結尾,而不會截斷。