2013-02-19 51 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的标准错误结尾,而不会截断。