Автоматизация удаления неиспользуемых почтовых ящиков совместно с Dovecot
Одной из важных задач администрирования корпоративных и публичных почтовых систем всегда являлось, во-первых, поддержание базы данных пользователей в надлежащем состоянии, а, во-вторых, связанная с этим задача оптимизации нагрузки на файловые хранилища, предназначеные для размещения пользовательской информации. Проблемой это может становиться уже при количествах почтовых ящиков, исчисляемых сотнями, не говоря уже про серверы, поддерживающие многие тысячи учётных записей пользователей электронной почты, когда ручное управление ими может быть крайне затруднительным.
В этой связи, встаёт вопрос автоматизации контроля за актуальностью пользовательских аккаунтов и освобождения используемых ими учётных данных и ресурсов для хранения корреспонденции.
Рассмотрим реализацию системы автоматического удаления неиспользуемых почтовых ящиков совместно с популярным сервером IMAP4/POP3 Dovecot. В данном случае используется его последняя актуальная версия в среде FreeBSD.
1. База данных
Хранение учётных записей пользователей осуществляется в базе данных формата Postfixadmin в MySQL. В данном случае она носит имя exim.
Основные учётные данные хранятся в таблице mailbox которая имеет следующую структуру.
Как видно, в ней присутствуют все основные данные, за исключением нужной нам для контроля даты последнего использования поля, информацию в которое будет помещаться через специальное расширение Dovecot под названием lastlogin в формате UNIX time.
Не откладывая дело на потом, добавим новое поле lastlogin в таблицу mailbox. Для хранения времени в таком формате нам будет достаточно поля типа INT(11). Для уже дейcтвующих почтовых систем также разумно будет заполнить его по умолчанию текущим временем в том же UNIX time.
Как видно, колонка была добавлена и заполнена в качестве значения по умолчанию текущим значением UNIX time.
2. Конфигурация Dovecot
Теперь перейдём к настройке самого раcширения lastlogin для Dovecot.
Во-первых, в блок dict была добавлена ссылка на файл-описание словаря с именем dovecot-dict-sql-lastlogin.conf для работы с таблицей, хранимой в MySQL. Во-вторых, в протоколах доступа к почтовым ящикам imap и pop3 был активирован сам плагин lastlogin. Также можно описать его единожды в глобальной секции и тогда значения времени доступа будут обновляться также и при доставке почты по протоколу LMTP или через LDA. Однако, для нашей задачи такой подход будет неприменимым. И, наконец, в собственно настройке расширения был указан способ доступа к словарю через прокси.
Содержимое файла-описания словаря.
Обновление поля lastlogin будет производиться по ключевому полю username.
Перезапустив Dovecot можно пронаблюдать работу плагина по обновлению значений поля lastlogin при каждом доступе пользователя к своему почтовому ящику посредством протоколов IMAP4 или POP3.
3. Скрипт удаления неиспользуемых ящиков
Небольшой shell-скрипт под названием mboxcleanup.sh для автоматизации контроля использования почтовых ящиков на основании собираемой информации от расширения lastlogin и запускаемый по cron позволит решить поставленную задачу.
Вкратце, данный скрипт для списка доменов DOM проверяет дату последнего посещения пользователем своего ящика и если она была более чем 180 дней назад (см. переменную exp) то производится:
- удаление ссылающихся на такой почтовый ящик псевдонимов;
- удаляется запись о самом почтовом ящике получив предварительно путь к месту хранения почты;
- содержимое ящика архивируется в файл с именем адреcа электронной почты пользователя и расширением tar.gz после чего содержимое также удаляется.
Данная версия скрипта имеет ограничения в части корректировки базы данных ссылающихся на удаляемый почтовый ящик псевдонимов. Не удаляются псевдонимы, относящиеся к этому ящику, но содержащие другие адресаты. Кроме того, не отслеживаются цепочки псевдонимов ссылающиеся на другие псевдонимы.
При этом, во-первых, ведётся лог-файл по указанному в переменной LOG пути, а, во-вторых, о проделанных действиях делаются запись в SQL-лог Postfixadmin с текстом user (mboxcleanup.sh) в поле пользователя, выполнившего данные операции. Если скрипт будет запускаться от имени mailnull, под которым работают все почтовые сервисы, что автор и рекомендовал бы, то предварительно следует создать пустой файл для записи протокола с соответствующими правами.
Также начиная с версии 3.0 Postfixadmin можно заменить прямое обращение к таблицам базы данных из скрипта на использование специального PHP-модуля Postfixadmin-CLI, который позволяет выполнить базовые операции с базой данных пользователей через модули самой системы управления. Однако, на момент написания статьи он не обладает в полной мере требуемым функционалом, поэтому автор предпочёл использовать непосредственный доступ через интерфейс командной строки MySQL.
В случае, если вы используете на данной почтовой системе Spamassassin, то, вероятно, хорошей идеей при удалении почтового ящика будет и очистка базы данных bayes-сигнатур для данного пользователя по аналогичной методике.
Теперь осталось добавить скрипт в cron.
4. PROFIT!
Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.