Postfix/MySQL/BGBilling
Материал из BiTel WiKi
Имея рабочий почтовый сервер и BGBilling(модуль Mail) задумался скрестить все воедино для удобства пользования. Так как модуль mail в BG работает с LDAP пришлось поднимать соответствующий сервис. Потратив пару дней и все таки соединив Postfix, OpenLDAP и BGBilling, задумался, а зачем вообще OpenLDAP как посредник. Вроде BG все хранит на MySQL, а Postfix успешно работает c SQL, следовательно решил соединить напрямую. Но OpenLDAP пришлось оставить, так как модуль Mail в BG, отказывался без него работать. Еще одним условием было использование IMAP-службы для отдельных пользователей, остальным POP3.
Итак я использовал следующее:
ALT Linux Server 4.0 Postfix-2.3.12 Courier-authlib-0.59.1 Courier-imap-4.1.2 Courier-maildrop-2.0.3
Из MySQL базы BG-шки, а именно база bgbilling( у меня называется internet) я использовал две таблицы email_account_8 и email_attribute_8. Из первой таблицы id — идентификационный номер для связки двух таблиц, account — имя пользователя, password — открытый пароль пользователя, quota — размер ящика, status — включен или выключен почтовый ящик; из второй таблицы: aid - идентификационный номер для связки двух таблиц, attr_id — номер атрибута, value — значение атрибута.
Устанавливаем Postfix:
apt-get install postfix postfix-mysql
Создаем файл mysqlvirtual.cf.
mysqlvirtual.cf
hosts = ip-адрес MySQL сервера dbname = internet user = логин password = пароль query = SELECT account FROM email_account_8 WHERE account='%u' AND status='0'
В качестве локального доставщика почты используем maildrop.
main.cf
myhostname = mail.domain.ru mydestination = $myhostname, localhost.$mydomain, localhost relay_domains = relayhost = local_recipient_maps = virtual_alias_maps = cdb:/etc/postfix/virtual virtual_transport = maildrop virtual_mailbox_domains = domain.ru virtual_mailbox_maps = mysql:/etc/postfix/mysqlvirtual.cf virtual_uid_maps = static:101 virtual_gid_maps = static:104 virtual_minimum_uid = 101 maildrop_destination_recipient_limit = 1
master.cf
#Если посылать почту сразу на maildrop то при создании нового пользователя там будет пусто и #вылетит ошибка, следовательно отправляем на следующий скрипт maildrop unix - n n - - pipe flags=DRhu user=courier argv=/etc/postfix/maildropplus ${user}
maildropplus
#!/bin/bash #если почтовая директория пользователя не открывается значит ее нет, создаем ее и выставляем #права и посылаем почту в maildrop с предупреждением при 90% заполнении ящика if ! cd /opt/mail/$1; then /usr/bin/maildirmake /opt/mail/$1; chown -R courier:courier /opt/mail/$1; chmod -R 700 /opt/mail/$1; /usr/bin/maildrop -w 90 -d $1; else /usr/bin/maildrop -w 90 -d $1; fi exit $?
Для alias`ов заводим файл virtual и незабываем туда занести служебные postmaster,MAIL-DAEMON и прочее с пересылкой на рута, либо на любого другого пользователя.
virtual
#База должна выглядеть следующим образом #alias@domain.ru e-mail получателя support@domain.ru spam@domain.ru
Теперь установим Courier:
apt-get install courier-authlib courier-imap courier-maildrop
authdaemon.conf
authmodulelist="authmysql" authmodulelistorig="authmysql" DEFAULTOPTIONS="disableimap=1,disablepop3=0" #по умолчанию imap - выключен, pop3 - включен COURIER_UID="courier" COURIER_GID="courier"
authdaemon-mysql.conf
MYSQL_SERVER ip-адрес сервера MySQL MYSQL_USERNAME логин MYSQL_PASSWORD пароль #Если MySQL находится на этом же сервере то можно воспользоваться сокетами # MYSQL_SOCKET /var/mysql/mysql.sock MYSQL_PORT 3306 MYSQL_DATABASE internet MYSQL_USER_TABLE email_account_8,email_attribute_8 MYSQL_CLEAR_PWFIELD email_account_8.password #Это UID и GID пользователя courier из группы courier MYSQL_UID_FIELD '101' MYSQL_GID_FIELD '104' MYSQL_LOGIN_FIELD email_account_8.account #Дериктория где лежат Maildir`ы пользователей почты MYSQL_HOME_FIELD '/opt/mail/' #Составляется путь до Maildir пользователя MYSQL_MAILDIR_FIELD CONCAT("/opt/mail/",email_account_8.account,"/") MYSQL_QUOTA_FIELD CONCAT(email_account_8.quota,"S") # Если значение атрибута IMAP=0, то IMAP выключен, а POP3 включен, если IMAP=1, то # наоборот — POP3 — включен, а IMAP — выключен MYSQL_AUXOPTIONS_FIELD IF(value='0',CONCAT("disableimap=1",",disablepop3=0"),\ CONCAT("disableimap=0",",disablepop3=1")) # Проверяем статус ящика(включен или выключен), находим соответствие двух таблиц и присутствие атрибута MYSQL_WHERE_CLAUSE email_account_8.status='0' \ AND email_account_8.id=email_attribute_8.aid AND attr_id='1'
imapd&pop3d
В imapd и pop3d прописать следующую строку:
MAILDIRPATH=/opt/mail/
Тонкости
Итак, для создания почтового ящика в модуле почта, помимо действий описанных в инструкции BGBilling, нужно добавлять атрибут IMAP и для создания почтовой директории нужно отправить на вновь созданный ящик письмо, либо дождаться когда кто-нибудь письмо пришлет. До первого письма при проверке будет выскакивать ошибка.
При написании статьи использовалась документация прилагаемая к программному обеспечению, а также комментарии разработчиков дистрибутива AltLinux.