将正文管道传输到 php 脚本时出现 Procmail 错误

将正文管道传输到 php 脚本时出现 Procmail 错误

我有一个 procmail 配方,它获取邮件正文并将其发送到 php 脚本。然而,procmail 抱怨错误。

它的工作原理如下:需要访问硬件参数的用户必须通过电子邮件注册,如下所示:
主题:注册
正文:??用户名:电子邮件地址:密码??

然后 Procmail 将正文发送到 php 脚本进行处理。我使用“??”的原因是为了让我更容易通过grep过滤掉body中的垃圾。

这是 procmail.log 中的错误:

From fetchmail  Fri Nov 25 15:41:36 2016
Subject: Register
Folder: /root/mail/inbox/inbox                     3673
procmail: [20601] Fri Nov 25 15:43:44 2016
procmail: Assigning "DEFAULT=/root/mail/inbox/inbox"
procmail: Assigning "PMDIR=/root/.procmail"
procmail: Match on "^Subject.*[R|r]egister$"
procmail: Executing "/usr/bin/php,-f,/root/data/scripts/register.php"
procmail: Executing "??myusername:[email protected]:mypass1??"
/bin/sh: 0: Can't open ??myusername:[email protected]:mypass1??

这是我的 procmail 食谱:

SHELL=/bin/sh
HOME=$HOME
PATH=$HOME/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin
SENDMAIL=/usr/sbin/sendmail
MAILDIR=$HOME/mail
LOGFILE=/var/log/procmail.log
LOGABSTRACT="all"
VERBOSE="on"
DEFAULT=$HOME/mail/inbox/inbox
PMDIR=$HOME/.procmail
:0
* ^Subject.*[R|r]egister$
{
  :0 bf
  | `/usr/bin/php -f /root/data/scripts/register.php`
}

以下是 register.php 脚本的缩写片段:

#!/usr/bin/php
<?php
while ( false !== ( $user_register = fgets ( STDIN ) ) )
{
  $user_info = preg_match ( "/\?\?.*\?\?/", @$user_register, $new_registration ) ;
  foreach ( $new_registration as $input )
  {
    print ( $input."\n" ) ;
  }
}

我不认为它与 php 代码有任何关系,因为我有类似结构的食谱和 php 代码。

有什么指点吗?

答案1

正确的语法是删除 PHP 脚本周围的反引号,除非其特定目的是在其标准输出上打印要将消息通过管道传输到的命令的名称。

换句话说,

echo "moo" | `echo wc`

相当于

echo "moo" | wc

您还可以进行许多其他简化和更正。默认情况下,Procmail 条件不区分大小写(我认为您不打算匹配|egister当前的代码),并且不需要使用大括号来添加一些标志。

:0bf
* ^Subject.*register$
| /usr/bin/php -f /root/data/scripts/register.php

相关内容