Короткий рассказ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.
Другие попытки/эксперименты:
Убрана хижину линии (
#!/usr/bin/php
) и изменил первую.qmail
строку|php -q /var/my/qmailfilter/qmailfilter
Проверил последнюю строку сценария для whitespacing
Прочтите файл man-файла dot-qmail, но ничего не найдено.
Регистрация .qmail линии:
|/вар/мой/qmailfilter/qmailfilter |/USR/бен/deliverquota ./Maildir
В этом случае я получил сообщение, содержащее только собственно код возврата без заголовка, объекта или тела сообщения.
Прокомментировал (#) вторую строку
.qmail
, но прекратил получать какие-либо сообщения.Отредактировано
/var/qmail/control/defaultdelivery
добавить первую строку:| PHP/вар/мой/qmailfilter/qmailfilter |/USR/бен/deliverquota ./Maildir
и переименован пользователю .qmail
файл до _qmail
. Те же результаты.
Должен ли я доставлять сообщение через скрипт PHP и забывать коды выхода?
Если да, достаточно ли сохранить сообщение пользователю Maildir/new?
Если да, важно ли имя файла сообщения?
Любая идея будет оценена по достоинству. Огромное спасибо!
UPDATE: Для тех из вас, кто в ней нуждается, я опубликовал окончательный сценарий на icebex.com слэш qmailfilter
Он работает. Спасибо, kforforce, отличная помощь. У меня никогда не было понятия о том, что PHP «возвращает» невидимый материал снаружи, когда скрипт завершается. Теперь я вижу это в руководстве PHP, функция exit(): «Если статус - это строка, эта функция печатает статус перед выходом." " Если статус является целым числом, это значение будет использоваться в качестве статуса выхода и не будет напечатано. Статусы выхода должны находиться в диапазоне от 0 до 254, статус выхода 255 зарезервирован PHP и не должен использоваться. Статус 0 используется для успешного завершения программы ». – HelpfulPanda
Хотя двойное поведение' exit' является неопределенностью PHP, каждая завершаемая программа имеет невидимый код возврата (например, во многих Linux-оболочках 'echo $?' Немедленно после выхода программы будет отображаться код.) Очень часто используется этот код для определения успешной работы программы. – Matthew