Почтовый сервер для малого офиса dovecot + postfix +mysql + fetchmail + public folder

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

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

bash: $>
mysql: mysql>

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

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

apt-get install postfix-mysql mysql-server dovecot-pop3d dovecot-imapd openssl

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

apt-get install phpmyadmin squirrelmail

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

bash: $> mysql -u root -p

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

mysql>
create database mailserver;
mysql>
grant all on mailserver.* to mailuser@localhost identified by 'mailuser2007';

Затем создайте таблицы в базе данных

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;

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

user = mailuser
password = mailuser2007
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

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

$>postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

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

$>mysql -u root -p mailserver
mysql>INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com');

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

$>postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

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

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

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

$>postconf -e virtual_uid_maps=static:5000
$>postconf -e virtual_gid_maps=static:5000

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

mysql>INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'john', MD5('summersun'));

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

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;

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

mysql>
SELECT * FROM view_users;

Вы должны увидеть это:
+——————+———————————-+
| email | password |
+——————+———————————-+
| john@example.com | 14cbfb845af1f030e372b1cb9275e6dd |
+——————+———————————-+

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

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

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

$>postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

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

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

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

mysql>INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, 'john', 'john@example.com'),
(2, 1, 'john', 'jmiller@gmail.com');

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

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;

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

mysql>
SELECT * FROM view_aliases;

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

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

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

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

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

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

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

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

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

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

$>postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf

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

$>chgrp postfix /etc/postfix/mysql-*.cf
$>chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

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

dovecot unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

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

$>postconf -e virtual_transport=dovecot
$>postconf -e dovecot_destination_recipient_limit=1

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

protocols = imap imaps pop3 pop3s

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

mail_location = maildir:/home/vmail/%d/%n

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

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
}

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

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

passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}

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

userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}

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

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
}
}

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

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
}

Кстати если в логе mail.log ошибка насчёт доставки, мол fail то заменить на cmusieve но если постфикс последний, должно быть всё ок.
На этом файл можно сохранить.
Отредактируйте файл /etc/dovecot/dovecot-sql.conf, измените настройки на приведенные ниже

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';

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

dovecot: Dovecot v1.2 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)

/var/log/mail.log

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

$>chgrp vmail /etc/dovecot/dovecot.conf
$>chmod g+r /etc/dovecot/dovecot.conf

Настроим TLS/SSL

$>openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem

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

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

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

$>chmod o= /etc/ssl/private/dovecot.pem

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

$>openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem

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

$>chmod o= /etc/ssl/private/postfix.pem

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

$>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

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

$>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

Далее правим размер почтового ящика, ставим для начала 10 метров:

$>postconf -e mailbox_size_limit = 102400

Далее делаем отправку почты в мир через аккаунт на gmail (relay)

$>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

Создаём файл sasl_passwd

$>touch /etc/postfix/sasl_passwd

В нём пишем:

smtp.gmail.com:587 user@gmail.com:PASSWORD

Соответственно заменив имя пользователя и пароль на свои.
Дал заносим файл в базу постфикса и выставляем нужные права:

postmap /etc/postfix/sasl_passwd
chmod 640 /etc/postfix/sasl_passwd*
chown postfix.postfix /etc/postfix/sasl_passwd*

Перезапускаем постфикс:

/etc/init.d/postfix restart

Настроим fetchmail
Создадим в домашней папке юзверя настройки для получения почты:

touch ~/.fetchmailrc

Его и правим:

poll pop.gmail.com
proto pop3
port 995
user "user@gmail.com"
pass "PASSWORD"
is john@example.com
ssl

Думаю и так всё понятно что значат строчки =)
is john@example.c — это значит, что вся почта с ящика будет приходит к этому виртуальному юзеру.
А, выставляем права на файл:

chown 700 ~/.fetchmailrc

Можно заценить сколько у нас писем новых:

fetchmail -c

И команда на приём:

fetchmail -k

Осталось включить автопроверку по расписанию, к примеру раз в 5 минут, через cron:

crontab -e

Выбираем редактор цифрамы, напирмер nano
и в низу пишем:

*/5 * * * * fetchmail -k

жмём cntrl+x потом Y потом enter.

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

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

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

После того, как подключили первого клиента, нужно создать общую папку для всех пользователей, ели она автоматом не создалась:

$>mkdir /home/vmail/example.com/Public
$>mkdir /home/vmail/example.com/Public/.test

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

Осталось сделать подмену адреса отправителя, правим main.cf

smtp_generic_maps = hash:/etc/postfix/generic

Создаём файл generic
и пишем:

@example.com user@gmail.com
john@example.com user2@gmail.com

Потом внесём изменения в базу постфикса

$>postmap /etc/postfix/generic

Тем самым у всех из домена 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 с моими дополниниями и исправлениями.

Related posts

Создание WiFi точки доступа ap 5GHz

Wordpress + nginx + php-fpm проблемы с wp-json или did not process the ‘context’

Linux, USB модем ZTE MF667 от Beeline, разблокировка и подключение через wvdial

3 комментария

gr 10 сентября 2012 - 5:43
Пробовал настроить по вашему мануалу, споткнулся на настройке dovecot, я так понял когда вы делали мануал вы настраивали его в одном конфиг файле, но у меня так не получилось, в моем dovecot конфиг разбит на файлы и некотороые пункты я там не смог просто найти. Просто первый раз настраиваю почтовик и для меня такая проблема оказаласдовольно большой.
emu10k1 3 июля 2012 - 17:30
Спасибо! Отличная статья, есть пара вопросов: - хочу сделать тоже самое но без  mysql, будет проще или сложнее? - С подменой адреса понятно, а возможно ли настроить map и sasl таким образом чтобы почта уходила с разных gmail аккаунтов примапленых к локальным аккаунтам?  
Pavelk 3 июля 2012 - 18:56
Насчёт проще или сложнее не могу однозначно ответить, всё зависит от вас и чем вы хотите заменить мускул. Настроить для разных возможно, В main.cf sender_dependent_relayhost_maps = hash:/etc/postfix/relayhost_map в relayhost_map пишем user1@example.com [smtp.gmail.com] в файл sasl_passwd по аналогии добавте другой аккаунт ну и перезагрузить настройки постфикса. По идее должно помочь.
Add Comment