2013-02-19 3 views
0

У меня есть настройка procmail, работающая очень хорошо, похоже, что я не выполняю свой PHP-скрипт, когда он получает электронное письмо.Procmail setup, чтобы выполнить PHP-скрипт

Ниже приведен пример файла .procmailrc:

#BEGIN PROCMAIL SCRIPT FOR MAIL PARSING 
DEFAULT=$HOME/Maildir/ 
MAILDIR=$HOME/Maildir 
PMDIR=$HOME/.procmail 
LOGFILE=$PMDIR/log.`date +%y-%m-%d` 
SHELL=/bin/sh 

:0 
|`/usr/local/php53/bin/php /home/usrmail/email/script.php` 

Выход журнала ниже:

From [email protected] Mon Feb 18 20:49:35 2013 
Subject: TEST 
    Folder: HELLO               2559 
/bin/sh: HELLO: No such file or directory 

Есть только в сценарии PHP простой echo "HELLO";, кажется, работает хорошо!

Однако, когда я пытаюсь на самом деле разобрать электронную почту, используя следующий код, я получаю ошибку ниже в журнале:

$rawEmail = ''; 
if (($fp = fopen('php://stdin', 'r')) !== false) { 
    while (!feof($fp)) { 
     $rawEmail .= fread($fp, 1024); 
    } 
    fclose($fp); 
} 

$email = new Zend_Mail_Message(array(
    'raw' => $rawEmail 
)); 

From [email protected] Mon Feb 18 20:44:36 2013 
Subject: Re: Test 
    Folder: Fatal error: Class 'Zend_Mail_Message' not found in /home/sy  2747 
/bin/sh: Fatal: No such file or directory 

Это не работает правильно, очевидно, я не знаю, почему. Во-первых, заголовок From прошел через этот, но не другой, что кажется прерывистым.

Также каталог (/ home/sy) либо усечен, либо что-то отключает его, чтобы вызвать ошибку.

Я вообще не знаком с Zend или procmail. Я был достаточно доволен, чтобы зайти так далеко, просто хочу немного разобрать электронную почту, чтобы я мог получить тело письма и поместить его где-нибудь. Кто-то убедил меня, что это будет лучше, чем просто использовать IMAP или что-то еще, и я слушал. Если у кого-то есть какие-то замечательные решения или альтернативы, я все уши. Спасибо, парни!

ответ

0

Вы смешиваете две связанные, но разные части синтаксиса.

Если вы хотите, чтобы трубы к вашему сценарию, он должен быть просто

:0 
* conditions, maybe 
| /path/to/script 

или если вы хотите использовать вывод скрипта, что-то вроде

:0 
* conditions, maybe 
`echo HELLO` 

бы файл в папку с именем HELLO, т. е. использовать результат скрипта как литерал.

Что касается сообщения об ошибке с PHP, я полагаю, вам нужно добавить что-то в путь к библиотеке PHP (быстрый поиск в Google предполагает, что вы должны исправить include_path в своем php.ini).

Что вы пытаетесь выполнить, правда? Если вы просто хотите, чтобы отправить сообщение, где заголовки говорят, что нужно идти, что-то вроде

:0 
* conditions, maybe 
! -t 

вы должны получить это. Я не могу представить ситуацию, в которой вы хотели бы это сделать (кроме того, если вы вообще пытаетесь решить неправильную проблему). Если вы хотите отправить усеченную копию сообщения, что-то вроде

:0c 
* conditions, maybe 
{ 
    :0fw 
    | head -n 10 
    :0 
    ! -t 
} 

бы усечь сообщение для первых десяти строк. Если вы хотите точно обрезать до 1024 байтов, это не намного сложнее.

С другой стороны, если вы просто хотите сохранить тело сообщения (полный корпус RFC822, т. Е.любые MIME вложения и т.д. будут просто быть включены дословно, недекодированная), вы можете сделать это с

:0b 
saved/ 

или, может быть, если вы хотите PHP там

:0b 
| /path/to/script.php 

Для чего это стоит, сообщение об ошибке усекается, но в основном потому, что вы пытаетесь использовать его в качестве имени сценария для доставки электронной почты. Если вы выберете обратные кавычки, сообщение об ошибке должно закончиться стандартной ошибкой Procmail без усечения.