Procmail

將正文傳遞到 php 腳本時出現 Procmail 錯誤

  • November 26, 2016

我有一個 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:me@gmail.com:mypass1??"
/bin/sh: 0: Can't open ??myusername:me@gmail.com: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 程式碼。

任何指針?

正確的語法是刪除 PHP 腳本周圍的反引號,除非它的特定目的是在其標準輸出上列印您想要通過管道傳遞消息的命令的名稱。

換句話說,

echo "moo" | `echo wc`

相當於

echo "moo" | wc

您還可以進行許多其他簡化和更正。Procmail 條件預設不區分大小寫(我認為您不打算匹配|egister目前程式碼),並且無需使用大括號來添加一些標誌。

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

引用自:https://unix.stackexchange.com/questions/326055