Этот мануал описывает установку почтового сервера Postfix в связке с dovecot и базой данных mysql для хранения данных, fetchmail для получения почты с других почтовых аккаунтов (gmail, yandex и тд), ну и отправку почты во внешний мир через эти аккаунты (smart host называется или relay smtp), до кучи прикрутим dovecot public folder (У всех пользователей одна общая папка, куда могут сбрасывать письма). По окончанию настройки мы получим почтовый сервер с поддержкой SMTP, POP3, IMAP, поддержку SSL, TLS, работу с виртуальными доменами. Ман не для слабонервных, т.к. не описано как это всё работает, но идеально для копипаста. Все пакеты взяды из стандартных репозиториев.

При настройке нашего нового сервиса я буду использовать примеры команд, оратите внимание на интерпритатор, их будет использоваться два, обычная командная строка (bash) и mysql, выглядит это так:

bash: $>

mysql: mysql>

Так же все действия производятся от имени пользователя root. На этом вступительную часть можно закончить и давайте приступим к установке и настройке нашего почтовика.

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

[cc escaped=»true» lang=»bash»] apt-get install postfix-mysql mysql-server dovecot-pop3d dovecot-imapd openssl
[/cc]

Так же в дальнейшем вам может понадобится phpmyadmin и простой веб интерфейс для работы с почтовым ящиком, установить все это можно командой

[cc escaped=»true» lang=»bash»] apt-get install phpmyadmin squirrelmail
[/cc]

Приконнектимся к базе данных с консольки:

[cc escaped=»true» IE lang=»bash»]

bash: $> mysql -u root -p

[/cc]

Создадим базу данных для почтового сервера

[cc escaped=»true» escaped=»true» lang=»mysql»] mysql>
create database mailserver;
mysql>
grant all on mailserver.* to mailuser@localhost identified by ‘mailuser2007’;
[/cc] Затем создайте таблицы в базе данных
[cc escaped=»true» lang=»mysql»] mysql> use mailserver
mysql>
CREATE TABLE `virtual_domains` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
) ENGINE = InnoDB;
mysql>
CREATE TABLE `virtual_users` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
user VARCHAR(40) NOT NULL,
password VARCHAR(32) NOT NULL,
CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE = InnoDB;
mysql>
CREATE TABLE `virtual_aliases` (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
domain_id INT(11) NOT NULL,
source VARCHAR(40) NOT NULL,
destination VARCHAR(80) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE = InnoDB;
[/cc]

Дальше необходимо создать файлы конфигурации для Postfix’a с информацией о базе данных.
Создадим файл /etc/postfix/mysql-virtual-mailbox-domains.cf и впишем в него следующее содержание

[cc escaped=»true» lang=»bash»] user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name=’%s’
[/cc]

Этот файл содержит запрос к базе данных из которого сервер извлекает виртуальный домен.
Теперь внесем изменения в конфигурацию самого сервера Postfix

[cc escaped=»true» lang=»bash»] $>postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
[/cc]

Внесем в нашу базу данных запись о виртуальном домене, в примере указан домен example.com

[cc escaped=»true» lang=»mysql»] $>mysql -u root -p mailserver
mysql>INSERT INTO virtual_domains (id, name) VALUES (1, ‘example.com’);
[/cc]

Венитесь в обратно в шелл bash и проверьте правильность настроек виртуального домена командой, не забудьте сменить домен с example.com на свой.

[cc escaped=»true» lang=»bash»] $>postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
[/cc]

Вы должны увидеть цифру 1 если все правильно настроено.
Перейдем к настройке почтовых ящиков, за них у нас будет отвечать отдельный пользователь и группа, давайте создадим их

[cc escaped=»true» lang=»bash»] $>groupadd -g 5000 vmail
$>useradd -g vmail -u 5000 vmail -d /home/vmail -m
[/cc]

Внесем изменения в конфигурацию Postfix’a

[cc escaped=»true» lang=»bash»] $>postconf -e virtual_uid_maps=static:5000
$>postconf -e virtual_gid_maps=static:5000
[/cc]

Создадим первый тестовый почтовый ящик, например john@example.com с паролем summersun

[cc escaped=»true» lang=»mysql»] mysql>INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, ‘john’, MD5(‘summersun’));
[/cc]

Потом нам необходимо создать view в базе данных для нормальной работы сервера Postfix

[cc escaped=»true» lang=»mysql»] mysql>CREATE VIEW view_users AS
SELECT CONCAT(virtual_users.user, ‘@’, virtual_domains.name) AS email,
virtual_users.password
FROM virtual_users
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
[/cc] Проверим результат командой

[cc escaped=»true» lang=»mysql»] mysql>
SELECT * FROM view_users;
[/cc] Вы должны увидеть это:
+——————+———————————-+
| email | password |
+——————+———————————-+
| john@example.com | 14cbfb845af1f030e372b1cb9275e6dd |
+——————+———————————-+

Создадим еще один файл конфигурации для Postfix’a в котором укажем даные для работы с почтовыми ящиками нащих юзеров, создайте файл /etc/postfix/mysql-virtual-mailbox-maps.cf и впишите в него это

[cc escaped=»true» lang=»bash»] user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM view_users WHERE email=’%s’
[/cc]

Внесем измения в главный файл конфига Postfix

[cc escaped=»true» lang=»bash»] $>postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
[/cc]

Проверьте результат командой

[cc escaped=»true» lang=»bash»] $>postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
[/cc]

Вы должны увидеть цифру 1 если все правильно настроено.
Настроим альясы (для пересылки почты с одного ящика на другой, или с нескольких на один)
Добавим в базу данных тестовый альяс для нашего польователя john@example.com, вся почта пришедшая на его ящик будет дополнительно пересылаться на ящик jmiller@gmail.com

[cc escaped=»true» lang=»mysql»] mysql>INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, ‘john’, ‘john@example.com’),
(2, 1, ‘john’, ‘jmiller@gmail.com’);
[/cc]

Создадим view для альясов по аналогии с view для пользователей

[cc escaped=»true» lang=»mysql»]

mysql>
CREATE VIEW view_aliases AS
SELECT CONCAT(virtual_aliases.source, ‘@’, virtual_domains.name) AS email,
destination
FROM virtual_aliases
LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;

[/cc]

Проверим результат

[cc escaped=»true» lang=»mysql»]

mysql>
SELECT * FROM view_aliases;

[/cc]

Вы должны увидеть это

+——————+——————-+
| email | destination |
+——————+——————-+
| john@example.com | john@example.com |
| john@example.com | jmiller@gmail.com |
+——————+——————-+

Дополним конфигурацию Postfix, создайте файл /etc/postfix/mysql-virtual-alias-maps.cf и впишите в него:

[cc escaped=»true» lang=»bash»]

user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM view_aliases WHERE email=’%s’

[/cc]

Проверим правильность настроек

[cc escaped=»true» lang=»bash»]

$>
postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

[/cc]

Вы увидите это
john@example.com,jmiller@gmail.com

Создадим следующий файл, /etc/postfix/mysql-email2email.cf впишем в него

[cc escaped=»true» lang»bash»]

user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM view_users WHERE email=’%s’

[/cc]

Запишем настройки в главный файл конфига Postfix

[cc escaped=»true» lang=»bash»] $>postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
[/cc]

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

[cc escaped=»true» lang=»bash»] $>chgrp postfix /etc/postfix/mysql-*.cf
$>chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
[/cc]

Далее настроим dovecot в качестве локального агента доставки писем, для этого отредактируйте файл /etc/postfix/master.cf добавив в конец это

[cc escaped=»true» lang=»bash»] dovecot unix — n n — — pipe
flags=DRhu user=vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
[/cc]

Внимание! Перед flags должно быть ДВА пробела, перед dovecot ни одного!
Перезагрузите Postfix командой postfix reload, и добавьте информацию о виртуальном транспорте в главный конфиг Postfix

[cc escaped=»true» lang=»bash»] $>postconf -e virtual_transport=dovecot
$>postconf -e dovecot_destination_recipient_limit=1
[/cc]

Перейдем к настройкам dovecot, все файлы его конфигурации хранятся в папке /etc/dovecot, начнем настройку с файла
Найдите строку protocols и смените на

[cc escaped=»true» lang=»bash»] protocols = imap imaps pop3 pop3s
[/cc]

Так же найдите и измените строку disable_plaintext_auth до состояния disable_plaintext_auth = no
Далее измените параметр mail_location

[cc escaped=»true» lang=»bash»] mail_location = maildir:/home/vmail/%d/%n
[/cc]

Найдите строку namespace private и измените до

[cc escaped=»true» lang=»bash»] namespace private {
separator = .
prefix =
inbox = yes
}

namespace private {
prefix = INBOX.
inbox = no
hidden = yes
list = no
}
# Public namespace
namespace public {
separator = .
prefix = Public.
location = maildir:/home/vmail/%d/Public/
subscriptions = yes
list = children
hidden= yes
}
[/cc]

Перейдите к секции «auth default» и отредактируйте разрешенные механизмы аутентификаци
mechanisms = plain login

В этой же секции измените\\

[cc escaped=»true» lang=»bash»] passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
[/cc]

Измените так же параметр userdb static

[cc escaped=»true» lang=»bash»] userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
[/cc]

Перейдите к секции socket listen сдесь мы укажем файлы сокета для аутентификации dovecot

[cc escaped=»true» lang=»bash»] socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
[/cc]

Перейдите к секции protocol lda, не забудьте сменить адрес постмастера на реальный

[cc escaped=»true» lang=»bash»] protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
mail_plugins = sieve
global_script_path = /home/vmail/globalsieverc
}
[/cc] Кстати если в логе mail.log ошибка насчёт доставки, мол fail то заменить на cmusieve но если постфикс последний, должно быть всё ок.
На этом файл можно сохранить.
Отредактируйте файл /etc/dovecot/dovecot-sql.conf, измените настройки на приведенные ниже

[cc escaped=»true» lang=»bash»] driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuser2007
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM view_users WHERE email=’%u’;
[/cc]

Перезапустите dovecot командой /etc/init.d/dovecot restart и загляните в лог файл /var/log/mail.log, там вы должны увидеть

[cc escaped=»true» lang=»bash»] dovecot: Dovecot v1.2 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)
[/cc]

Теперь выставим права доступа к файлам конфигурации dovecot

[cc escaped=»true» lang=»bash»] $>chgrp vmail /etc/dovecot/dovecot.conf
$>chmod g+r /etc/dovecot/dovecot.conf
[/cc]

Настроим TLS/SSL

[cc escaped=»true» lang=»bash»] $>openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem
[/cc]

Ответьте на несколько вопросов и сертификат будет создан, не забудьте указать правльно все параметры вместо примеров привеленных ниже

[cc escaped=»true» lang=»bash»] Generating a 1024 bit RSA private key
………++++++
……………………….++++++
writing new private key to ‘/etc/ssl/certs/dovecot.pem’
——
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
——
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russia
Locality Name (eg, city) []:Russia
Organization Name (eg, company) [Internet Widgits Pty Ltd]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:mail.example.com
Email Address []:postmaster@example.com
[/cc]

Выставим права доступа на файл

[cc escaped=»true» lang=»bash»] $>chmod o= /etc/ssl/private/dovecot.pem
[/cc]

Создадим еще один сертификат по аналогии с предыдущим

[cc escaped=»true» lang=»bash»] $>openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem
[/cc]

Сменим права доступа:

[cc escaped=»true» lang=»bash»] chmod o= /etc/ssl/private/postfix.pem
[/cc]

Внесите изменения в конфиг Postfix’a

[cc escaped=»true» lang=»bash»] $>postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
$>postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
$>postconf -e smtpd_use_tls=yes
[/cc]

Теперь настроим аутентификацию SMTP, внесите следующие изменения в конфиг Postfix’a, не забудьте сменить примеры на реальные адреса сетей! В примере используется сеть 192.168.50.0/24 ей разрешено отправлятиь почту без SMTP авторизации.

[cc escaped=»true» lang=»bash»] $>postconf -e mynetworks=192.168.50.0/24
$>postconf -e smtpd_sasl_type=dovecot
$>postconf -e smtpd_sasl_path=private/auth
$>postconf -e smtpd_sasl_auth_enable=yes
$>postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
[/cc] Далее правим размер почтового ящика, ставим для начала 10 метров:
[cc escaped=»true» lang=»bash»] $>postconf -e mailbox_size_limit = 102400
[/cc]

Далее делаем отправку почты в мир через аккаунт на gmail (relay)
[cc escaped=»true» lang=»bash»] $>postconf -e relayhost = smtp.gmail.com:587
$>postconf -e smtp_use_tls=yes
$>postconf -e smtp_sasl_auth_enable = yes
$>postconf -e smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
$>postconf -e smtp_sasl_security_options = noanonymous
$>postconf -e smtp_sasl_tls_security_options = noanonymous
[/cc] Создаём файл sasl_passwd
[cc escaped=»true» lang=»bash»] $>touch /etc/postfix/sasl_passwd
[/cc] В нём пишем:
[cc escaped=»true» lang=»bash»] smtp.gmail.com:587 user@gmail.com:PASSWORD
[/cc] Соответственно заменив имя пользователя и пароль на свои.
Дал заносим файл в базу постфикса и выставляем нужные права:
[cc escaped=»true» lang=»bash»] postmap /etc/postfix/sasl_passwd
chmod 640 /etc/postfix/sasl_passwd*
chown postfix.postfix /etc/postfix/sasl_passwd*
[/cc] Перезапускаем постфикс:
[cc escaped=»true» lang=»bash»] /etc/init.d/postfix restart
[/cc]

Настроим fetchmail
Создадим в домашней папке юзверя настройки для получения почты:
[cc escaped=»true» lang=»bash»] touch ~/.fetchmailrc
[/cc] Его и правим:
[cc escaped=»true» lang=»bash»] poll pop.gmail.com
proto pop3
port 995
user «user@gmail.com»
pass «PASSWORD»
is john@example.com
ssl
[/cc] Думаю и так всё понятно что значат строчки =)
is john@example.c — это значит, что вся почта с ящика будет приходит к этому виртуальному юзеру.
А, выставляем права на файл:
[cc escaped=»true» lang=»bash»] chown 700 ~/.fetchmailrc
[/cc]

Можно заценить сколько у нас писем новых:
[cc escaped=»true» lang=»bash»] fetchmail -c
[/cc]

И команда на приём:
[cc escaped=»true» lang=»bash»] fetchmail -k
[/cc]

Осталось включить автопроверку по расписанию, к примеру раз в 5 минут, через cron:
[cc escaped=»true» lang=»bash»] crontab -e
[/cc] Выбираем редактор цифрамы, напирмер nano
и в низу пишем:
[cc escaped=»true» lang=»bash»] */5 * * * * fetchmail -k
[/cc] жмём cntrl+x потом Y потом enter.

А, параметры для пожключения почтовых прог:

приём:
john@example.com (с доменом!)
Тип соединения: SSL на стандартный порт

отправка:
требуется авторизация,
опять же имя пользоавтеля с доменом,
соединение обычное, т.е. НЕ SSL

После того, как подключили первого клиента, нужно создать общую папку для всех пользователей, ели она автоматом не создалась:
[cc escaped=»true» lang=»bash»] $>mkdir /home/vmail/example.com/Public
$>mkdir /home/vmail/example.com/Public/.test
[/cc]

После этого перезапустить постфик и почтовый клиент клиент, появится папка Public а в ней test туда перетаскиваем письма — они будут одинаковы для всех пользователей.

Осталось сделать подмену адреса отправителя, правим main.cf
[cc lang=»bash»] smtp_generic_maps = hash:/etc/postfix/generic
[/cc]

Создаём файл generic
и пишем:
[cc lang=»bash»] @example.com user@gmail.com
john@example.com user2@gmail.com
[/cc] Потом внесём изменения в базу постфикса
[cc lang=»bash»] $>postmap /etc/postfix/generic
[/cc]

Тем самым у всех из домена example.com будет в письме будет стоять user@gmail.com
А у пользователя john — user2@gmail.com

На этом всё… Кстати, непомешает выполнить postfix check для проверки правильности настроек и прав доступа на файлы, команда должна отдать пустой результат.

Все ошибки и прочие события из жизни почтовика можно найти в логах
/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info

Основная часть статьи взята c sudouser.com c с моими дополниниями и исправлениями.