Статей на эту тематику написано много, но в основном они содержат ошибки или неточности. В этой статье мы постарались исправить все ошибки и она является работоспособной. Почему 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.
Все. Можно настраивать почтовых клиентов.