Ключевые слова:postfix, mail, mysql, auth, imap, (найти похожие документы)
From: Константин Климчев <koka at atknet.ru>
Date: Mon, 28 Aug 2004 14:31:37 +0000 (UTC)
Subject: Postfix + MySQL + Courier-IMAP для ASPLinux
Оригинал: http://www.phantom.atknet.ru/articles/5.html
Предисловие
-----------
Продолжение postfix-цикла. Если Вам нужно что-то посерьезнее qpoppep'а
или Вам просто необходима возможность работы по imap (хранить почтовые
ящики пользователей на сервере - кстати, очень удобно). Сразу скажу -
большенство материала перекочевало из предыдущих статей цикла.
Повторяюсь: если Вы заметите какую-либо неточность или более красивое
решение - пишите, я это отражу (разумеется герои не будут забыты в
руководстве).
В конце есть ссылки на собранные (пересобранные) файлы, которые я
использовал при написании этой статьи
Инсталляция
-----------
MySQL:
тут ничего не обычного нет - просто ставите и все. Единственное, что
отмечу - нужны пакеты mysql, mysql-server, mysql-devel, zlib-devel
Postfix:
Вот тут необходимо пересобрать пакет. Необходимо "включить" поддержку
MySQL. Но тут все очень просто - необходимо взять srpm'ку из
дистрибутива, развернуть ее в то место, где у Вас осуществляется
сборка пакетов и в spec'е изменить одно значение:
с %define MYSQL 0
на %define MYSQL 1
а также добавить один патчик с http://www.oav.net/vda/.ftp://ftp.oav.net/others/postfix/VDA/postfix-1.1.11_quota_maildirsize.patch.gz
Он нужен для квотирования почтовых ящиков пользователей (одному дадите 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.
Вся прелесть в том, что с пакетом уже идет spec для сборки rpm-пакета,
его просто нужно "вытянуть" из архива. По умолчанию собирается
несколько пакетов: сам 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 = no
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-mailboxsize.cf
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_mailbox_limit = 11000000
строка 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.
Если попали в засаду - пишите на форум.
http://www.phantom.atknet.ru/cgi-bin/cgiforum.pl Попробуем разобраться
(но перед этим еще раз внимательно проверьте - ничего-ли Вы не забыли
сделать и нет ли ошибок в конфигурационных файлах).
В завершение напоминаю: Создаете виртуальный почтовый домен - не
забудьте создать пользователей этого домена: "root@", "postmaster@" и "abuse@"
Упоминаемые в статье файлы:
* postfix-1.1.10-1.asp.i386.rpm модифицированный
http://www.phantom.atknet.ru/articles/files/postfix/postfix-1.1.10-1.asp.i386.rpm
* postfix-1.1.10-1.asp.src.rpm модифицированный
http://www.phantom.atknet.ru/articles/files/postfix/postfix-1.1.10-1.asp.src.rpm
* courier-imap-1.7.3-1.i386.rpm
http://www.phantom.atknet.ru/articles/files/courier-imap/courier-imap-1.7.3-1.i386.rpm
* courier-imap-mysql-1.7.3-1.i386.rpm
http://www.phantom.atknet.ru/articles/files/courier-imap/courier-imap-mysql-1.7.3-1.i386.rpm
* courier-imap-pgsql-1.7.3-1.i386.rpm
http://www.phantom.atknet.ru/articles/files/courier-imap/courier-imap-pgsql-1.7.3-1.i386.rpm
* courier-imap-ldap-1.7.3-1.i386.rpm
http://www.phantom.atknet.ru/articles/files/courier-imap/courier-imap-ldap-1.7.3-1.i386.rpm
* courier-imap-1.7.3-1.src.rpm
http://www.phantom.atknet.ru/articles/files/courier-imap/courier-imap-1.7.3-1.src.rpm
PS. Спасибо Sergey V. Beduev за ряд замечаний и предложений по статье
Это что такая счас фишка стала писать про postfix + MySql. На эту тему уже столько в инете лежит инфы? что получаеться проосто пересказ старых.
Одно отрадно, что в данной статье расмотрен вопрос про квотирование виртуальных ящиков.