Почта в офисе разрослась и наличие более 1 рабочего места более чем на 1 сотрудника стало требовать большего, чем простейшая реализация многодоменного почтового сервера на базе Exim+teapop без использования mysql на обычных файлах.
Основная причина изменений — постоянная чистка от спама и просто ненужных писем на каждом из рабочих мест меня неоднократно начинала беспокоить, и было решено внедрить почту по известной статье Лиссионария» Пакет exim и courier-imap Самое главное, чего не хватало из того, что требовалось, это сортировщика писем по папкам.
Для того, кто подписан на рассылки, очень полезно сортировать письма по нужным каталогам, чтобы: а) не писать сортировщики в б) каждый клиент имеет ту же структуру папок при доступе к почте через Интернет, что и в почтовом клиенте.
Быстрое (и потом довольно настойчивое) исследование Интернета показало, что сортировать письма предлагается только с помощью различных сито-скриптов.
Но, на мой взгляд, это метод не для пользователей (как в почтовых клиентах), а для администраторов, которые на самом деле будут писать не правила для сортировщика, а программно фильтровать, используя соответствующий скриптовый язык:
require ["fileinto", "reject", "regex", "subaddress", "envelope"];
#spam
if header :contains "Subject" "[SPAM]" {
reject "thank you";
stop;
}
if header :regex "Received" "from ([[:alnum:]\\-]{1,}\\.
){3,}[[:alnum:]]{1,}.
*" {
reject "thank you";
stop;
}
Я могу это понять, но на кой черт это нужно? А что делать «простым смертным», которым нужен тот же функционал, но для которых вышесказанное сродни китайской грамотности.
В наше время, когда системы подогнаны под палец домохозяйки, отсутствие тех же дурацких методов сортировки почты, которые используются десятилетиями, по меньшей мере удивляет.
На создание собственной реализации сортировки меня вдохновил фрагмент упомянутой выше статьи, в которой путь для размещения письма Exim в разделе транспортов генерируется запросом из базы данных:
mysql_delivery:
driver = appendfile
check_string = ""
create_directory
delivery_date_add
directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`) \
FROM `mailbox` WHERE `username`='${local_part}@${domain}'}}
directory_mode = 770
envelope_to_add
group = mail
maildir_format
maildir_tag = ,S=$message_size
message_prefix = ""
message_suffix = ""
mode = 0600
Ничего не мешает немного дополнить запрос и добавить название папки imap, чтобы дурацкие фильтры работали на основе определения содержимого подстроки в отправителе/теме письма:
mysql_delivery:
driver = appendfile
check_string = ""
create_directory
delivery_date_add
directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`, \
(select dir from sorter where ( \
( \
(locate(text,'${sender_address}')!=0 and target='sender') \
or \
(locate(text,'${sg{${extract{Subject}{${sg{${sg{$message_headers}{ }{_spAce_}}}{:_spAce_}{=}}}}}{_spAce_}{ }}')!=0 and target='subject') \
) \
and email='${local_part}@${domain}') or priority=0 order by priority desc limit 1 \
)) \
FROM `mailbox` WHERE `username`='${local_part}@${domain}'}}
directory_mode = 770
envelope_to_add
group = mail
maildir_format
maildir_tag = ,S=$message_size
message_prefix = ""
message_suffix = ""
mode = 0600
Потом пишем 7 кило примитивного кода на PHP ( скачать ) создать правила сортировки для конкретного пользователя и да - летальный исход, потребности в сортировке писем реализованы на 80%.
И лично у меня 100%.
Правда, неожиданно выяснилось (а может я просто не нашел?), что на этом этапе в эксиме нет отдельных переменных для каждого заголовка, поэтому изрядная борода строковых расширений эксима предназначена только для выбора заголовка "Тема" из списка.
многострочное поле, содержащее сразу все заголовки письма.
Создаем таблицу для хранения правил сортировки с обязательной нулевой записью, которая будет определять размещение письма во «Входящих», если правил не обнаружено:
CREATE TABLE `sorter` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`priority` int(11) NOT NULL DEFAULT '0',
`target` varchar(255) NOT NULL DEFAULT '',
`text` varchar(255) NOT NULL DEFAULT '',
`dir` varchar(255) NOT NULL DEFAULT '',
`email` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);
INSERT INTO `sorter` SET `priority`=0;
Скриншот администратора:
Скрипты берут список папок, которые у пользователя уже есть на сервере.
Система не идеальна и имеет как минимум три ограничения: 1. работает с русскими кодировками только в том случае, если кодировка буквы совпадает с кодировкой записей в таблице правил; 2. работает только одно правило в порядке приоритета (чем выше, тем больше приоритет), поэтому правила с логикой И делать нельзя, только ИЛИ; 3. Количество полей для обработки ограничено отправителем и темой.
В принципе, позже можно будет добавить его для использования для выделений и других заголовков, не только темы, возможно, сделаю это при необходимости.
Была еще идея написать плагин для RoundCube, но посмотрев, как они написаны, от нее было решено отказаться, хотя и с большой жалостью (может, кто-то, интересующийся реализацией, это сделает: все равно, улыбнитесь :) .
Также хочу отметить, что sql-запрос тестировался на последней версии порта MySQL 5.5 для FreeBSD, поэтому неизвестно, будет ли этот запрос работать на более старых версиях.
Теги: #exim4 #mysql5 #sieve #MySQL #Системное программирование
-
Adsl-Маршрутизаторы
19 Oct, 24 -
Хакерские Гаджеты На Конференции Shmoocon
19 Oct, 24 -
Переход С Odac 10 На Odac 12
19 Oct, 24