본문을 PHP 스크립트로 파이핑할 때 Procmail 오류가 발생합니다.

본문을 PHP 스크립트로 파이핑할 때 Procmail 오류가 발생합니다.

메시지 본문을 가져와 PHP 스크립트로 보내는 procmail 레시피가 있습니다. 그러나 procmail은 오류에 대해 불평합니다.

작동 방법은 다음과 같습니다. 하드웨어 매개변수에 액세스해야 하는 사용자는 다음과 같이 이메일을 통해 등록해야 합니다.
제목: 등록
텍스트: ??사용자 이름: 이메일 주소: 비밀번호??

그런 다음 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

관련 정보