Postfix + MySQL + Courier-IMAP для ASPLinux

Автор: Константин Климчев

 

Предисловие

Продолжение postfix-цикла. Если Вам нужно что-то посерьезнее qpoppep'а или Вам просто необходима возможность работы по imap (хранить почтовые ящики пользователей на сервере - кстати, очень удобно). Сразу скажу - большенство материала перекочевало из предыдущих статей цикла.

Повторяюсь: если Вы заметите какую-либо неточность или более красивое решение - пишите, я это отражу (разумеется герои не будут забыты в руководстве).

В конце есть ссылки на собранные (пересобранные) файлы, которые я использовал при написании этой статьи

Инсталляция

MySQL:

тут ничего не обычного нет - просто ставите и все. Единственное, что отмечу - нужны пакеты mysql, mysql-server, mysql-devel, zlib-devel

Postfix:

Вот тут необходимо пересобрать пакет (Это касается только ASP7.3. Для ASP9 postfix из updates уже собран с поддержкой mysql). Необходимо "включить" поддержку MySQL. Но тут все очень просто - необходимо взять srpm'ку из дистрибутива, развернуть ее в то место, где у Вас осуществляется сборка пакетов и в spec'е изменить одно значение:

с  %define MYSQL 0
на %define MYSQL 1
а также добавить один патчик с http://www.oav.net/vda/. Он нужен для квотирования почтовых ящиков пользователей (одному дадите 1 Мб, другому 10). Вся проблема в том, что postfix может квотировать только mailbox-ящики, а courier'у требуется maildir-ящик. Указанный патч как раз и устраняет проблему. Фактически, при пересборке postfix'а необходимо положить указанный патч в то место, где у Вас расположены исходники, патчи и т.п. которые участвуют при сборке rpm-пакета (каталог SOURCE), а в спеке добавить инструкцию о применении этого патча. Здесь я приведу diff измененного spec'а:

@@ -66,0 +67,3 @@
+# custom patch
+Patch1000: postfix-1.1.11_quota_maildirsize.patch.gz
+
@@ -125,0 +129,3 @@
+
+# Apply custom patch
+%patch1000 -p1

После этих подготовительных операций осуществите пересборку (rpm -ba postfix.spec), а после инсталлируйте (если переинсталлировать, то rpm -Uvh --force имя_пакета.rpm) пакет.

Courier-imap:

Идем на сайт: http://www.inter7.com/courierimap.html программы и берем исходники courier-imap. На момент написания была версия 1.7.3. (Для ASP9 внизу ссылка на файлы версии 2.2.1) По умолчанию собирается несколько пакетов: сам courier-imap и модули авторизации через mysql (то что нам и нужно), postgresql (для поклонников - есть патчи для postfix'а) и ldap (в postfix'е нативная поддержка). Так как я все нужные пакеты собираю под vmware (чего основную систему захламлять), поэтому я ничего в спеке не изменял, а инсталлировал недостающие для сборки пакеты (лдапные и постгресные) и на выходе получил то, что нужно. После инсталлировал courier-imap и courier-imap-mysql.

Следует отметить, что если Вы ничего не меняли, пакет ставится в /usr/lib/courier-imap

Следующий шаг - конфигурирование.

Конфигурирование

MySQL:

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


mysql>create database mail;
mysql>GRANT select ON `mail`.* TO 'postfix'@'127.0.0.1' IDENTIFIED BY 'postfix';
mysql>use mail;

mysql>create table alias (address varchar(128) not null default '', \
goto varchar(128) not null default '', primary key (address));
mysql>create table transport (domain varchar(128) not null default '', \
transport varchar(128) not null default '', primary key (domain));
mysql>create table users (email varchar(128) not null default '', \
passwd varchar(128) not null default '', uid int(11) unsigned not null default '1000', \
gid int(11) unsigned not null default '12', \
maildir varchar(255) not null default '/var/spool/mail/', \
enabled tinyint(4) not null default '1', 
quota int(11) unsigned not null default '2048000', primary key (email) );

mysql>insert into transport VALUES ('virtual1.domain', 'virtual');
mysql>insert into users VALUES ('test@virtual1.domain', 'password', '1000', '12', \
'/var/spool/mail/virtual1.domain/test/', '1', '2048000');

Обратите внимание на значение поля maildir. Оно заканчивается на "/". Это необходимо для того, чтобы postfix "работал" с почтовыми ящиками в формате maildir

Postfix:

Конфигурирование postfix'а заключается в редактировании конфигурационных файлов. Сразу скажу - здесь я не буду описывать весь процесс конфигурирования postfix'а (смотрите документацию к postfix'у - там есть много чего интересного), а только тем моменты, которые затрагивают рассматриваемый вопрос.

файл /etc/postfix/master.cf

строку:
virtual unix    -       n       y       -       -       virtual
меняем на:
virtual unix    -       n       n       -       -       virtual

файл /etc/postfix/main.cf


mydestination = localhost, $myhostname, localhost.$mydomain, 
                mysql:/etc/postfix/mysql-mydestination.cf
		                
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
		                
#======== MySQL ===================
virtual_mailbox_base = /
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_maps =  mysql:/etc/postfix/mysql-virtual.cf
virtual_minimum_uid = 500
virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/etc/postfix/mysql-virtual-gid.cf
transport_maps = mysql:/etc/postfix/mysql-transport.cf

#======== Quota ===================
#message_size_limit = 10240000
virtual_mailbox_limit = 10240000
virtual_mailbox_limit_inbox = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-mailboxsize.cf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
строка local_recipient_maps = ... необходима для того, чтобы почту могли получать и локальные пользователи (не нужно было бы их прописывать в базе), которым направляются результаты работы сервисов системы (запускаемые по cron, ошибки и т.п.), а эту почту локального пользователя (например, root) можно потом перенаправить на виртуального в файле /etc/postfix/aliases.

файл /etc/postfix/mysql-mydestination.cf


user = postfix
password = postfix
dbname = mail
table = transport
select_field = domain
where_field = domain
hosts = 127.0.0.1

файл /etc/postfix/mysql-virtual-maps.cf


user = postfix
password = postfix
dbname = mail
table = users
select_field = maildir
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1

файл /etc/postfix/mysql-virtual.cf


user = postfix
password = postfix
dbname = mail
table = alias
select_field = goto
where_field = address
hosts = 127.0.0.1

файл /etc/postfix/mysql-virtual-uid.cf


user = postfix
password = postfix
dbname = mail
table = users
select_field = uid
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1

файл /etc/postfix/mysql-virtual-gid.cf


user = postfix
password = postfix
dbname = mail
table = users
select_field = gid
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1

файл /etc/postfix/mysql-transport.cf


user = postfix
password = postfix
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = 127.0.0.1

файл /etc/postfix/mysql-mailboxsize.cf


user = postfix
password = postfix
dbname = mail
table = users
select_field = quota
where_field = email
additional_conditions = and enabled = 1
hosts = 127.0.0.1

Не забываем создать каталог /var/spool/mail/virtual1.domain с правами:
drwxrwxr-x   root:mail

Courier-imap:

тут все просто. нужно подправить конфиг, да настроить каким службам автоматически запускаться (pop3,pop3-ssl, imap, imap-ssl) - см. соответствующие конфиги в /usr/lib/courier-imap/etc/

Содержимое файла файла /usr/lib/courier-imap/etc/authmysqlrc:


MYSQL_SERVER            127.0.0.1
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          postfix
MYSQL_SOCKET            /var/lib/mysql/mysql.sock
#MYSQL_PORT             3306
MYSQL_DATABASE          mail
MYSQL_USER_TABLE        users
MYSQL_CLEAR_PWFIELD     passwd
DEFAULT_DOMAIN          virtual1.domain
MYSQL_LOGIN_FIELD       email
MYSQL_HOME_FIELD        maildir
MYSQL_MAILDIR_FIELD     maildir
MYSQL_WHERE_CLAUSE      enabled=1

На этом этап конфигурирования закончен. Следующее - тестирование.

Тестирование

Перво-наперво нужно проверить возможность получения почты виртуальными пользователями. Пользователь test@virtual1.domain у нас создан. Нужно попытаться послать ему какое либо письмо. Самый простой способ (это нужно делать с машины, на которой и происходит процесс установки):


$cat какой_либо_текстовый_файл |mail test@virtual1.domain
далее смотрим, что появилось в файле /var/log/maillog. Если возникли какие-либо ошибки - описывается довольно подробно где смотреть. Обычно это опечатки в конфигурационных файлах. Если не совсем понятно - попробуйте включить режим логирования в mysql (в этом логе будут писаться обращения к серверу и его ответы).

Если все работает, то в maillog'е будет запись типа:

May 20 10:05:41 localhost postfix/virtual[9779] DF0B1C79D: to=<test@virtual1.domain>, \
relay=virtual, delay=1, status=sent(maildir)

После этого посмотрите содержитое каталога /var/spool/mail/virtual1.domain/ Там должен будет появиться каталог test.

После того, как все получилось, попробуйте аналогичное для локальных пользователей (например, postmaster - смотрите куда он алиасится в файле /etc/postfix/aliases).

С получением почты разобрались. Займемся доступом по pop3 (imap оставим на самостоятельное задание). Во-первых, запустите courier-imap:


#/etc/init.d/courier-imap start

Starting Courier-IMAP server: imap pop3
у меня запускаются только imap и pop3. Если Вы ничего не изменяли в конфигах, то еще должно будет запуститься imap-ssl и pop3-ssl.

Во-вторых: Самый простой способ это с машины, на которой происходит процесс установки выполняем:


telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
user test@virtual1.domain (или test - дефолтный домен мы прописали)
+OK Password required.
pass test
+OK logged in.
quit
+OK Bye-bye.
Connection closed by foreign host.

если что-то не то - смотрите /var/log/maillog и лог запросов к mysql.

Если попали в засаду - пишите на форум. Попробуем разобраться (но перед этим еще раз внимательно проверьте - ничего-ли Вы не забыли сделать и нет ли ошибок в конфигурационных файлах).

В завершение напоминаю: Создаете виртуальный почтовый домен - не забудьте создать пользователей этого домена: "root@", "postmaster@" и "abuse@"

Упоминаемые в статье файлы:

 

PS. Спасибо Sergey V. Beduev за ряд замечаний и предложений по статье

 


Вернуться в начало:

Rambler's Top100