메시지 본문을 가져와 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