База знаний по Open Source
Авторизация
Поиск по базе знаний

Почтовый сервер на Postfix и Courier с MySQL

Статей на эту тематику написано много, но в основном они содержат ошибки или неточности. В этой статье мы постарались исправить все ошибки и она является работоспособной. Почему courier, а не dovecot? Так исторически сложилось. Courier намного проще и для внутренней корпоративной почты вполне подходит – по крайней мере до сих пор нареканий не было. Ну и всегда можно прикрутить fetchmail, procmail и т.п.

Устанавливаем необходимые пакеты:

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon \
courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl \
libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl mailx

В ходе установки отвечаем на следующие вопросы:

Create directories for web-based administration? – No
General type of mail configuration – Internet Site
System mail name - fqdn

Создадим базу данных в MySQL

mysqladmin create mail

В MySQL создадим пользователя mail_admin и предоставим ему права на базу данных mail.

mysql mail
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'пароль_пользователя';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'пароль_пользователя';
FLUSH PRIVILEGES;

В базе данных создадим таблицы domains, forwardings, users и transport.

CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
CREATE TABLE transport (domain varchar(128) NOT NULL default '',transport varchar(128) NOT NULL default '',UNIQUE KEY domain (domain));
quit

Таблица domains будет хранить наименования виртуальных доменов, для которых Postfix будет получать письма. Таблица forwardings будет содержать псевдонимы почтовых ящиков. Таблица users будет содержать всю информацию о виртуальных пользователях. Таблица transport необязательного характера, она для продвинутых пользователей. Позволяет перенаправлять почту отдельных пользователей, доменов либо всю почту на другой почтовый сервер.

Проверим, на каком адресе слушает MySQL. Для этого выполним:

cat /etc/mysql/my.cnf | grep bind-address

Ответ должен быть следующим:

bind-address = 127.0.0.1

Создадим 4 файла конфигурации для postfix. В каждом из них убеждаемся, что параметр password задан верно.

Файл /etc/postfix/mysql-virtual_domains.cf
-----------------
user = mail_admin
password = пароль_пользователя
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
Файл /etc/postfix/mysql-virtual_forwardings.cf
-----------------
user = mail_admin
password = пароль_пользователя
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
Файл /etc/postfix/mysql-virtual_mailboxes.cf
-----------------
user = mail_admin
password = пароль_пользователя
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
Файл /etc/postfix/mysql-virtual_email2email.cf
-----------------
user = mail_admin
password = пароль_пользователя
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

Выставим права и владельца на созданные файлы:

chmod 660 /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Создадим пользователя, от имени которого будет работать наш почтовый сервер. Все виртуальные домены и ящики будут храниться в домашнем каталоге этого пользователя:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Внесем изменения в конфигурацию postfix. Проверьте параметры, относящиеся к вашему почтовому серверу

postconf -e 'myhostname = fqdn_of_your_mail_server'
postconf -e 'mydestination = fqdn_of_your_mail_server, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'message_size_limit = 30720000'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf,mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Создадим сертификат:

cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509

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

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:NN
Locality Name (eg, city) []:NN
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany, LLC
Organizational Unit Name (eg, section) []:IT
Common Name (eg, YOUR name) []:server.yourdomain.local
Email Address []:support@yourdomain.local

Дадим на него права:

chmod o= /etc/postfix/smtpd.key

Создадим каталог для saslauthd

mkdir -p /var/spool/postfix/var/run/saslauthd

Отредактируем файл /etc/default/saslauthd. Изменим параметры START и OPTIONS на следующие:

START=yes
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Создадим файл /etc/pam.d/smtp и вставим в него две строки (измените пароль на свой):

auth required pam_mysql.so user=mail_admin passwd= пароль_пользователя host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd= пароль_пользователя host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

Создаем файл /etc/postfix/sasl/smtpd.conf и добавляем в него следующие сотроки:

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: <user>
sql_passwd: <pass>
sql_database: <db>
sql_select: select password from users where email = '%u@%r'

Добавляем пользователя postfix в группу sasl и перезапускаем postfix и saslauthd:

adduser postfix sasl
/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

Редактируем /etc/courier/authdaemonrc

sed --in-place -e 's/authmodulelist="authpam"/authmodulelist="authmysql"/g' /etc/courier/authdaemonrc

Сохраняем файл /etc/courier/authmysqlrc. Вместо него создаем вместо него пустой файл:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc

Добавляем в созданный файл следующее:

MYSQL_SERVER localhost
MYSQL_USERNAME mail_admin
MYSQL_PASSWORD пароль_пользователя
MYSQL_PORT 0
MYSQL_DATABASE mail
MYSQL_USER_TABLE users
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD “/home/vmail”
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')

Удаляем оригинальные сертификаты, созданные Courier

rm -f /etc/courier/imapd.pem && rm -f /etc/courier/pop3d.pem

В файлах /etc/courier/imapd.cnf и /etc/courier/pop3d.cnf заменяем CN=localhost на CN=полное_доменное_имя_почтового_сервера.
Регенерируем сертификаты и перезапускаем сервисы:

cd /etc/courier
mkimapdcert
mkpop3dcert
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Редактируем псевдонимы в файле /etc/aliases:

postmaster: root
root: postmaster@yourdomain.com

Обновляем алиасы и перезапускаем postfix:

newaliases
/etc/init.d/postfix restart

Проверяем наш smtp сервер:

telnet localhost 25

Когда подключимся, выполняем

ehlo localhost

Если все правильно настроили, вывод будет примерно таким:

250-ubuntusrv.zz.local
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Теперь можно создавать виртуальные домены и пользователей. Для этого заходим в MySQL:

mysql mail
INSERT INTO domains (domain) VALUES ('yourdomain.local');
INSERT INTO users (email, password) VALUES ('ozzy@ yourdomain.local ', ENCRYPT('ozzy'));
quit;

Для создания почтового ящика отправляем письмо на адрес ozzy@yourdomain.local

mailx ozzy@yourdomain.local

Сначала вводите тему сообщения, потом тело. Для выхода из редактирования нажимаем Ctrl+D.
Все. Можно настраивать почтовых клиентов.

Добавить комментарий