Скрипт фильтрации почты PHP: коды выхода не распознаются в файле .qmail - PullRequest
1 голос
/ 09 сентября 2010

Короткая история

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

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

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

Моя версия PHP CLI5.2.0-8 + etch16 (cli) (построено: 24.11.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 Qmail Picture.

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

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

  2. Проверено последнюю строку скрипта на наличие пробелов

  3. Чтение dot-qmail manфайл, но ничего не было найдено

  4. Присоединенные строки .qmail:

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

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

Закомментировал (#) вторую .qmail строку, но прекратил получать любые виды сообщений.

Отредактировал /var/qmail/control/defaultdelivery для добавления первой строки:

| php / var / my / qmailfilter / qmailfilter | / usr / bin / deliveryquota ./Maildir

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

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

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

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

Любая идея будет оценена.Спасибо большое!

ОБНОВЛЕНИЕ: Для тех из вас, кому это нужно, я опубликовал финальный скрипт на icebex.com slash qmailfilter

1 Ответ

1 голос
/ 09 сентября 2010

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

  • exit ('99 ') выведет 99 и вернет 0.

  • exit (99) вернет 99.

...