Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
sys.stdout.flush()
Milter.runmilter("mainfilter", socketname, timeout)
print """Example Milter shutdown"""
В этой небольшой программе описывается класс ExampleMilter, основанный на классе Milter из модуля Milter. Для каждого SMTP-соединения создается новый объект класса ExampleMilter. Отдельные методы этого объекта отвечают за обработку определенных событий (см. комментарии в тексте программы). Вся информация, касающаяся определенного соединения, должна храниться в атрибутах объекта. В нашем примере так накапливается и хранится bodysize (размер тела сообщения) и некоторые вспомогательные объекты. (В Python сам объект передается в метод в качестве первого аргумента и традиционно называется self, поэтому для работы с атрибутами внутри метода нужно использовать self.имя_атрибута. Кстати, в Python новые атрибуты могут появляться в объекте в любой удобный момент.) Здесь следует заметить, что методы вызываются в определенной последовательности, и нет гарантии, что для данного соединения будет вызван тот или иной метод. Например, следом за hello() может сразу последовать abort(). Это обстоятельство необходимо учитывать при написании своего фильтра, как и то, что в рамках одного соединения может быть обработано несколько сообщений. В силу чего требуется правильно инициализировать имена: те, что относятся ко всему соединению, нужно инициализировать в connect(), а относящиеся к конкретному сообщению – в envfrom(). Соответственно, конечной точкой использования таких имен должны быть методы close() и eom().
На любом этапе работы фильтра можно решить судьбу сообщения, возвратив Milter.REJECT (отклонить), Milter.ACCEPT (принять), Milter.DROP (выбросить) или продолжить обработку – Milter.CONTINUE. В методе eom() можно менять некоторые свойства обрабатываемого сообщения (см. комментарии в листинге 1). Напомним, что состав получателей не обязательно соответствует содержимому полей To, Cc, Bcc, так как эти данные передаются отдельными командами протокола SMTP.
Для включения фильтра необходимо добавить примерно следующие две строки к файлу sendmail.mc:
MAIL_FILTER(`mainfilter', `S=inet:2525@milter.host.ru, T=C:10m;S:30s;R:30s;E:10m')
define(`confINPUT_MAIL_FILTERS', `mainfilter')
Здесь milter.host.ru и 2525 – хост, на котором запущен Milter, и порт (номер выбран произвольно).
Если вы привыкли напрямую править sendmail.cf (что очень не рекомендуется), то в него нужно добавить следующее:
O InputMailFilters=mainfilter
#O Milter.LogLevel O Milter.macros.connect=j, _, {daemon_name},
{if_name}, {if_addr}
O Milter.macros.helo={tls_version}, {cipher}, {cipher_bits},
{cert_subject}, {cert_issuer}
O Milter.macros.envfrom=i, {auth_type}, {auth_authen},
{auth_ssf}, {auth_author}, {mail_mailer}, {mail_host},
{mail_addr}
O Milter.macros.envrcpt={rcpt_mailer}, {rcpt_host}, {rcpt_addr}
Xfilteronegoru, S=inet:2525@milter.host.ru,
T=C:10m;S:30s;R:30s;E:10m
Описание каждого фильтра в файле конфигурации Sendmail может сопровождаться тремя опциями: F, S и T. Если опция F не задана, то проблемы с фильтром безболезненны для доставляемого Sendmail сообщения. Если F=T, неработоспособность фильтра приводит к временной неудаче (temporary fail) доставки сообщения. Если F=R и фильтр недоступен, сообщение отвергается (reject). В опции S указывается адрес фильтра, имеющий один из приведенных ниже форматов:
S=local:путь