本文をPHPスクリプトにパイピングすると、Procmailエラーが発生します。

本文をPHPスクリプトにパイピングすると、Procmailエラーが発生します。

メッセージ本文を取得してPHPスクリプトに送信するprocmailレシピがあります。しかし、procmailはエラーについて文句を言います。

操作方法は次のとおりです。ハードウェアパラメータにアクセスする必要があるユーザーは、次のように電子メールで登録する必要があります。
件名:登録
テキスト:?ユーザー名:Eメールアドレス:パスワード??

その後、Procmailは処理のために本文をPHPスクリプトに送信します。私が「??」を使用する理由は、体内のゴミをより簡単に除去できるようにするためです。

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

関連情報