2010-09-09 5 views
1

Короткий рассказPHP фильтрации почты Сценарий: коды выхода не распознаются в .qmail файле

У меня есть PHP скрипт фильтрации входящей почты с использованием .qmail файла. Скрипт отлично работает и регистрирует всю активность, но, насколько мне известно, последняя строка .qmail не должна выполняться, когда мой скрипт возвращает код выхода dot-qmail 99, который должен прекратить обработку дальнейших строк .qmail.

Длинная история:

Я использую версию Parallels Plesk Panel 9.3.0 под Linux 2.6.18-4-686.

Моя версия PHP CLI - это 5.2.0-8 + etch16 (cli) (построено: 24 ноября 2009 11:14:47).

Не удовлетворен Spamassassin, Dr. Web и zen.spamhaus.org и их результатами, я решил создать свой собственный PHP-скрипт для фильтрации всей входящей почты.

(В стороне от некоторых из вас, кто может подумать, что «этот парень изобретает колесо»: я лично знаю своих клиентов и их конкретные потребности, поэтому после тысяч тестов это оказалось лучшим вариантом, поскольку он избегает моделей черного ящика и позволяет мне контролировать процесс в полной мере, также освобождая ресурсы сервера и открывая двери для других интересных функций).

Однако мне сложно установить скрипт на сервере.

qmailfilter мой сценарий, и вы можете увидеть его на http://titanpad.com/1IFDj1jvB0

Я редактировал существующий .qmail файл в /var/qmail/mailnames/customerdomain.com/username/.qmail быть:

|/var/my/qmailfilter/qmailfilter 
|/usr/bin/deliverquota ./Maildir 

qmailfilter PHP скрипт выполняет и журналы прекрасно, когда я отправить сообщение к этой учетной записи пользователя, возвращает код выхода (99 для отбрасывания сообщения и 0 для перехода к следующей строке .qmail, доставляющей сообщение).

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

Сценарий (см. Строку 174) выводит код выхода текста без пробелов до или после. Я пробовал exit($code), print $code, echo($code) и даже file_put_contents("php://stdout", $code), а также exit(chr($code)).

dot-qmail кода:

0 - Успех (перейти к следующему .qmail линии)

99 - Успех и прервать (не выполнять следующие строки)

100 - постоянная ошибка (уступы)

111 - мягкая ошибка (повторить попытку позже)

Источник: The Big Picture Qmail.

Другие попытки/эксперименты:

  1. Убрана хижину линии (#!/usr/bin/php) и изменил первую .qmail строку |php -q /var/my/qmailfilter/qmailfilter

  2. Проверил последнюю строку сценария для whitespacing

  3. Прочтите файл man-файла dot-qmail, но ничего не найдено.

  4. Регистрация .qmail линии:

    |/вар/мой/qmailfilter/qmailfilter |/USR/бен/deliverquota ./Maildir

В этом случае я получил сообщение, содержащее только собственно код возврата без заголовка, объекта или тела сообщения.

  1. Прокомментировал (#) вторую строку .qmail, но прекратил получать какие-либо сообщения.

  2. Отредактировано /var/qmail/control/defaultdelivery добавить первую строку:

    | PHP/вар/мой/qmailfilter/qmailfilter |/USR/бен/deliverquota ./Maildir

и переименован пользователю .qmail файл до _qmail. Те же результаты.

Должен ли я доставлять сообщение через скрипт PHP и забывать коды выхода?

Если да, достаточно ли сохранить сообщение пользователю Maildir/new?

Если да, важно ли имя файла сообщения?

Любая идея будет оценена по достоинству. Огромное спасибо!

UPDATE: Для тех из вас, кто в ней нуждается, я опубликовал окончательный сценарий на icebex.com слэш qmailfilter

ответ

1

Я только бросил быстрый взгляд на код, но он выглядел, как вы использовали строковые значения. exit('99') и exit(99) - это не то же самое. Убедитесь, что вы используете целые числа, а не строки.

  • выход ('99') напечатает 99 и возвращать 0.

  • выход (99) вернет 99.

+0

Он работает. Спасибо, kforforce, отличная помощь. У меня никогда не было понятия о том, что PHP «возвращает» невидимый материал снаружи, когда скрипт завершается. Теперь я вижу это в руководстве PHP, функция exit(): «Если статус - это строка, эта функция печатает статус перед выходом." " Если статус является целым числом, это значение будет использоваться в качестве статуса выхода и не будет напечатано. Статусы выхода должны находиться в диапазоне от 0 до 254, статус выхода 255 зарезервирован PHP и не должен использоваться. Статус 0 используется для успешного завершения программы ». – HelpfulPanda

+0

Хотя двойное поведение' exit' является неопределенностью PHP, каждая завершаемая программа имеет невидимый код возврата (например, во многих Linux-оболочках 'echo $?' Немедленно после выхода программы будет отображаться код.) Очень часто используется этот код для определения успешной работы программы. – Matthew