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.

Автор статьи: EagleN[1]

Личные инструменты