我有一个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
在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 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
这显然不能正常工作,我不知道为什么。其中一个,From标题在这一个上完成但不是另一个,这似乎是间歇性的。
目录(/ home / sy)也会被截断,或者正在切断它以导致错误。
我根本不熟悉Zend,或者说procmail。我很高兴能够做到这一点,只是想解析一下电子邮件,以便我可以获取电子邮件的正文并将其放在某处。有人说服我,这比使用IMAP或其他东西更好,我听了。如果有人有任何奇妙的解决方案或替代方案,我会全神贯注。谢谢你们!
答案 0 :(得分:0)
您正在混合两种相关但不同的语法。
如果你想管道你的脚本,它应该只是
:0
* conditions, maybe
| /path/to/script
或者如果你想使用脚本的输出,比如
:0
* conditions, maybe
`echo HELLO`
将文件存入名为HELLO
的文件夹,即使用脚本中的输出作为文字。
至于来自PHP的错误消息,我想你需要在PHP的库路径中添加一些东西(快速谷歌搜索建议你应该修复include_path
中的php.ini
)。
但是你想要完成什么?如果你只想发送标题说应该去的消息,比如
: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的标准错误中结束,而不会截断。