【问题标题】:Procmail setup, to execute PHP scriptProcmail 设置,执行 PHP 脚本
【发布时间】:2013-02-19 21:01:22
【问题描述】:

我的 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 或其他东西更好的方法,我听了。如果有人有任何出色的解决方案或替代方案,我会全力以赴。谢谢大家!

【问题讨论】:

    标签: php email zend-framework procmail


    【解决方案1】:

    您正在混合两种相关但不同的语法。

    如果你想管道到你的脚本,它应该只是

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

    或者如果你想使用脚本的输出,比如

    :0
    * conditions, maybe
    `echo HELLO`
    

    会归档到名为 HELLO 的文件夹中,即将脚本的输出用作文字。

    至于来自 PHP 的错误消息,我想您需要在 PHP 的库路径中添加一些内容(快速谷歌搜索建议您应该修复 php.ini 中的 include_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 的标准错误结尾,而不被截断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 2021-10-15
      • 1970-01-01
      • 2013-09-13
      • 2018-01-02
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多