Руководство по DbMail. Архитектура решения. Сценарии применения

Материал из support.qbpro.ru

Введение

На текущий момент существует относительно большое количество агентов доставки почтовых сообщений конечному пользователю. Среди наиболее известных imap- и pop3-серверов для unix-подобных систем можно назвать: dovecot, courier-imap и Cyrus. DbMail – это такой же сервер, как и вышеназванные, но имеющий одно важное отличие...
Вот об этом отличии и особенностях настройки и пойдет речь далее.

Начало

  • DbMail разработан компанией NFG. Задача была создать imap- и pop3-сервер, хранящий всю информацию о почте, равно как и содержание писем, в реляционной базе данных. На момент написания статьи текущая версия продукта 2.2.12. Заявлена поддержка MySql, PostgeSQL, SQLite, а также таких MTA, как Postfix, Exim, Sendmail (как всегда, настройка Sendmail не отличается легкостью и наглядностью, но полагаю, что опытным администраторам этого агента пересылки почтовых сообщений к подобным трудностям не привыкать.)

Архитектура системы

DBMail состоит из комплекта программ, отвечающих за перехват smpt-трафика от агентов пересылки почтовых сообщений, хранение сообщений, передачу сообщений пользователю по требованию и программ управления почтой. В таблице 1 перечислены программы, входящие в пакет, и приведено их краткое описание

Таблица 1. Программы, входящие в пакет DbMail Наименование Описание

dbmail-imapd	Полнофункциональный imap- (imap4r1) сервер, обеспечивающий доступ к почтовым ящикам пользователей.
dbmail-pop3	Полнофункциональный pop3-сервер, обеспечивающий доступ к почтовым ящикам пользователей.
dbmail-adduser	Программа управления пользователями Dbmail. Позволяет добавлять, удалять, изменять и показывать информацию о пользователе или наборе пользователей. С помощью программы можно также управлять алиасами пользователей.
dbmail-smtp	Программа, с помощью которой осуществляется добавление почтовых сообщений в почтовый ящик, причем адрес ящика пользователя может быть установлен из MIME-заголовка сообщения или задан в явном виде.
dbmail-maintenance	Программа, которая проверяет целостность базы данных и производит очистку сообщений в базе, помеченных для удаления. Разработчики рекомендуют запускать ее раз в сутки, используя крон.

Основное отличие пакета DbMail от ближайших конкурентов – это 100%-ная интеграция с реляционными базами данных (MySql, PostgreSQL и т.д.) Под 100% понимается авторизация, хранение заголовков и тела письма, хранение вложений письма в базе данных. Такой подход дает некоторые преимущества над стандартными схемами хранения maildir и mailbox, а именно – следующие.

  • Масштабируемость. За счет разнесения pop3-серверов на физически разные машины и совместное использование сетевой базы данных.
  • Управляемость. Большинство настроек можно изменить без перезапуска демона путем внесения изменений в базу данных.
  • Скорость. DbMail использует SQL-запросы для получения информации из базы данных вместо сканирования и индексации файловой системы. Это дает преимущества в скорости обработки и фильтрации почтовых сообщений.
  • Безопасность. Для работы и администрирования сервера в большинстве случаев достаточно иметь только доступ к базе данных. В случае же конечного пользователя вообще отсутствует необходимость авторизации пользователей для доступа к Unix-системе.
  • Расширяемость. Добавление пользователей, изменение их настроек и паролей вступают в силу мгновенно, сразу после внесения в базу данных или в систему управления пользователями (OpenLdap, ActiveDirectory).

Система в целом работает аналогично всем подобным серверам. Выглядит процесс следующим образом. Агент пересылки почтовых сообщений (МТА) передает почту по одному из поддерживаемых протоколов на хранение DbMail. Далее DbMail складирует и индексирует почту в ожидании запроса от пользователя. Пользователь по протоколу imap или pop3 запрашивает почту и благополучно ее получает. При этом вся исходящая почта работает через MTA по протоколу smtp (рисунок 1).

Dbmailplace.jpg

Более подробно архитектуру сервера можно посмотреть на официальном сайте DbMail

Теперь, когда имеется общее представление о работе системы, перейдем к подробному рассмотрению системы хранения сообщений и взаимодействия с агентом передачи почты. Начнем с принципов настройки и подключения базы данных.

Базы данных. Принципы настройки и подключения

Как уже говорилось выше, DbMail имеет встроенную поддержку трех популярных реляционных баз данных.
Это, конечно же, MySQL, это, естественно, PostgreSQL и SQLite.

Сам принцип подключения этих баз данных одинаков для всех и состоит из четырех шагов.

* Шаг 1. Создание базы данных. Реализация данного шага различна для каждой из баз данных и зависит от внутреннего командного интерфейса самой БД.

* Шаг 2. Создание пользователя dbmail для управления базой данных.

* Шаг 3. Создание инфраструктуры БД. Также зависит от БД, но, по сути, одинакова для всех. (Необходимо запустить сценарий создания инфраструктуры.)

* Шаг 4. Настройка конфигурационного файла DbMail на использование выбранной базы.

Эти четыре шага необходимо проделать в обязательном порядке для каждой из подключаемых баз данных.

Важное замечание! Прежде чем настраивать подключение к той или иной базе, следует убедиться, что сборка DbMail для вашего дистрибутива включает поддержку выбранного продукта.

Рассмотрим подключение к БД на примере MySQL.

Пример создания и подключения базы данных:

Последовательно пройдем все четыре шага

* Шаг 1. Создание БД

mysqladmin create dbmail –u root –p

* Шаг 2.

mysql -u root –p GRANT ALL ON dbmail.* to dbmail@localhost identified by '<pass>';

<pass> – необходимо заменить на пароль, который будет использоваться для пользователя dbmail

* Шаг 3. Создание структуры БД

Как уже говорилось выше, структура базы данных создается с помощью готового сценария. Местоположение этого сценария варьируется от дистрибутива к дистрибутиву, но чаще всего лежит в /usr/share/doc/dbmail-mysql/examples/.

mysql -u dbmail dbmail -p < create_tables_innoDB.mysql

* Шаг 4. Настройка конфигурационного файла DBMail

Измените следующие строки в конфигурационном файле dbmail.conf в соответствии с вашими настройками


host=localhost          # Хост с MySQL
sqlport=3306            # Порт, на котором работает MySQL. Необходимо
                        # указать, если порт нестандартный.
sqlsocket=/tmp/mysql.sock       # Путь к локальному сокету. Используется в 
                                # случае, если база данных запущена на том же
                                # сервере, что и DBMail. 
                                # Самый быстрый способ работы с сервером.
user=dbmail             # Пользователь для работы с БД
pass=dbmail             # Пароль пользователя для работы с БД
db=dbmail               # Имя базы данных, в которой будет храниться почта

Подключение агента пересылки почты

После того как база данных настроена и подключена, необходимо определиться с агентом пересылки почты и настроить его на передачу почты DbMail.

Необходимо отметить, что в отличие от предопределенных на уровне исходного кода протоколов общения с базой данных, агент пересылки может быть любым. Единственное требование – это способность МТА передавать полученную почту на обработку по протоколам pipe и lmtp. Процесс пересылки почты по системным каналам методом вызова демона dbmail-smtp и передачи сообщения и отправка сообщение через протокол локальной передачи почтовых сообщений соответственно.

Следует обратить внимание на предпочтительность использования протокола lmtp как более легковесного, простого и быстрого решения. Использование системы передачи сообщений через системные каналы на нагруженных машинах чревато созданием огромного количества потоков (по одному на каждое сообщение) и более сложным процессом обнаружения сбоя в системе.

Прежде чем переходить к практике, рассмотрим еще один нюанс использования. Для оптимизации работы системы в целом желательно настроить MTA на получение списка обслуживаемых доменов напрямую из базы данных. Это уменьшит нагрузку на процессор и избавит от промежуточной пересылки данных. На примере Exim

Здесь Exim приводится в качестве примера исключительно по причине простоты настройки данного MTA.

Приступим.

Для начала укажем транспорт

LOCAL_DELIVERY=transport_dbmail

Теперь собственно описание транспорта для smtp

dbmail-smtp
  transport_dbmail:
    driver = pipe
    command = "/usr/local/sbin/dbmail-smtp -d $local_part@$domain"
    return_fail_output
    user = dbmail

и для lmtp

dbmail-lmtp
  transport_dbmail:
    driver = smtp
    protocol = lmtp
    hosts = localhost
    allow_localhost
    return_path_add

Это все.

Управление пользователями

Как и любой другой агент хранения почты, dbmail имеет интерфейс управления пользователями. Теоретически пользователей в базу данных можно добавить напрямую, в обход инструментов, предоставляемых разработчиками, но есть одно но… Разработчики гарантируют, что при любых изменениях в базе данных их утилита будет реализовывать правильный способ управления пользователями.

Управление пользователями осуществляется с помощью утилиты dbmail-users. Рассмотрим несколько типичных операций. Добавление пользователя и привязка почтового ящика

В общем случае операция выглядит следующим образом.

Вначале мы создаем запись для регистрации пользователя в базе данных:

dbmail-users –a Имя_Пользователя –w Пароль

Теперь, когда пользователь создан, можно привязать к его имени один или несколько почтовых ящиков.

Примечание. Строго говоря, уже сразу после выполнения команды создания пользователя он (пользователь) в состоянии пройти авторизацию на pop3- или imap-сервер. Конечно, он не сможет получать почту (ведь мы еще не привязали к нему ни одного ящика), но подключиться сможет вполне. Помните об этом, когда будете настраивать ящики.

dbmail-users –c Имя_Пользователя –s Имя_пользователя@домен

После ключа «-s» можно указать один или несколько почтовых ящиков, отделив их через запятую. Либо можно просто повторить действие столько раз, сколько потребуется, каждый раз указывая новый почтовый ящик.

Удаление почтового ящика производится командой

dbmail-users –c Имя_Пользователя –S Имя_пользователя@домен

Ограничение размеров почтовых ящиков

Ограничить размер используемого места под хранение почты можно следующей командой:

dbmail-users –c Имя_Пользователя –m Квота

Здесь квота – максимальный размер почтового ящика.

Размер можно указывать как в байтах (Б), так и в килобайтах (KБ) и мегабайтах (MБ).

Примечание. Если не указан ключ: Б, или , то подразумевается, что размер указан в байтах. Удаление пользователя

Удалить пользователя можно командой dbmail-users –d Имя_Пользователя

Оптимизация базы DBMAIL

База Dbmail 2.1.1 стала занимать много места, решено было ее почистить. Сначала делаем

dbmail-util -dy - помечает сообщения в корзине статусом DELETE.
Затем dbmail-util -py - удаляет все сообщения со статусом DELETE.

Если будит что-то говорить про сухой режим (dry-run) то можно попробовать сделать так

 dbmail-util -ubdsy

Также полезно будит произвести оптимизацию таблиц dbmail_messages, dbmail_messageblks

optimize table "название таблицы"

После всех этих манипуляций размер базы уменьшился с 14Гбайт до 300 Мбайт

Ну и за компанию очистить все почтовые ящики пользователя можно так dbmail-users -e "имя пользователя" Просмотр количества писем в очереди mailq Удаление всех писем из очереди postsuper -d ALL

Заключение

DbMail – легкий и быстрый агент хранения почты, который легко настраивать и поддерживать. Это большой плюс. В то же время явных минусов в его работе не наблюдалось. Однако, хотя в списке рассылки и упоминается об огромном количестве пользователей, которое способен обработать данный агент, все же, по мнению автора статьи, основное его применение – это почтовые серверы небольших и средних компаний.

Почтовый сервер на Debian 9 полная установка: dbmail & postgresql & postfix & stunnel & postgrey& spamassassin

ИСТОЧНИКИ: