почтовый сервер на основе Postfix

с пользователями в MySQL и Dovecot как MDA

Постановка задачи: Необходимо установить почтовый сервер Postfix в качестве MTA для произвольного числа доменов; установить и настроить Dovecot 2.x в качестве MDA; в качестве хранилища пользователей — использовать базу данных MySQL; в качестве бэкэнда для управления доменами и пользователями установить и настроить PostfixAdmin; в качестве web-интерфеса установить и настроить RoundCube; обеспечить защиту от спама и вирусов используя цифровую подпись DKIM, dspam и ClavaAV соответственно.

Таки да, существует масса статей по настройке почтового сервера Postfix в связке с Dovecot и хранением виртуальных пользователей в базе MySQL. В первую очередь, статью писал для себя лично. На best practice не претендую, но данная конфигурация замечательно работает нескольких серверах и обслуживает десяток доменов. Кстати, настройка почтового сервера — эта та часть работы, когда создать тестовый вариант и протестировать всё «в живую» довольно сложно, и часто приходится настраивать сразу Production сервер со всеми вытекающими… Кстати, Dovecot значительно меньше представлен в русскоязычном Интернете, и если представлен — то в виде массы разрозненных частей с абсолютно разной реализацией для версии 1.х. Да и многим статьям уже по нескольку лет)).

Что имеем в исходных данных:

  • Плaтформа Debian Wheezy
  • PostfixAdmin 2.3.x
  • Postfix 2.9.x
  • Dovecot 2.x;
  • MySQL 5.x;
  • Roundcube, OpenDKIM — дополнительные пакеты.

Итак, приступаем к настройке почтового сервера:

  1. Предварительные настройки
  2. Установка и настройка PostfixAdmin
  3. Настройка Postfix для работы с MySQL
  4. Детальная настройка Postfix
  5. Настройка Dovecot

1. Предварительные настройки

Уверен, что LAMP уже успешно настроен на Вашем сервере… Если нет, до-установите его и вот эту небольшую «вязанку» пакетов:

dmitry@mail:~$ sudo apt-get install apache2 libapache2-mod-php5 php5 php5-common php5-curl php5-gd php5-mysql php5-imap mysql-server mysql-client

Убедитесь, что Ваш сервер имеет верные значения в /etc/hostname, /etc/mailname и /etc/hosts. Приведите их к следующему виду:

dmitry@mail:~$ cat /etc/hostname
mail

dmitry@mail:~$ cat /etc/mailname
example.com

dmitry@mail:~$ cat /etc/hosts
127.0.0.1 localhost 
32.64.22.54 mail.example.com mail 

Здесь 32.64.22.54 — IP-адрес Вашего почтового сервера; mail.example.com — каноническое имя Вашего почтового сервера, в mailname можете оставить FQDN-имя. Не забудьте добавить PTR-запись в карточку DNS Вашего домена — многие почтовые сервера проверяю наличие этой записи, и отклоняют почту в случае, если IP-адрес не соответствует каноническому имени сервера.

Примечание: На самом деле, не сильно принципиально, что Вы пропишите в файле mailname, согласно документации рекомендуется использовать FQDN-имя и эти данные используются различными службами самой системы (non-MTA программами) и к настраиваемому MTA отоношение имеют крайне посредственное. Однако, позаботьтесь о том, чтобы корректно работал резолвинг имени Вашего почтового сервера (mail.example.com) в обе стороны (прямое преобразование: имя -> IP и обратное: IP -> имя). Ведь по факту, мы настраиваем мультидоменный почтовый сервер, который будет обслуживать дестяки доменов и самое важное, как именно Вы настроите сам MTA и MDA.

Финальным аккордом поставим пакеты Postfix и Dovecot с конфигурацией по умолчанию — это нужно, чтобы остальные пакеты устанавливались впоследствии правильно.

dmitry@mail:~$ sudo apt-get install postfix postfix-mysql dovecot-core dovecot-mysql dovecot-imapd dovecot-pop3d dovecot-sieve 

Примечание: Dovecot уже не ставится одним пакетом — необходимо выбирать и устанавливать именно те пакеты, которые Вам нужны. В нашем случае это dovecot-core, dovecot-mysql, dovecot-imapd, dovecot-pop3d и dovecot-sieve.

2. Установка и настройка PostfixAdmin

Всю настройку начинаем именно с PostfixAdmin — это удобный и бесплатный интерфейс для управления почтовым сервером, созданием доменов, ящиков, альясов и проч. Противникам и идейным «линуксоидам» могу ответить, что когда у Вас с десяток доменов и пара сотен ящиков — Вы непременно оцените преимущество данного бэк-энда. С точки зрения разграничения прав, возможности пустить рядовых пользователей в свои настройки и с точки зрения безопасности — у меня никаких нареканий к PostfixAdmin нет. Остальное — вопрос прямоты рук. Решать естественно вам. Можете погуглить дамп базы PostfixAdmin и «залить» его в базу вручную.

Кстати, пакет PostfixAdmin имеется в репозиториях Debian «Wheezy» — установим его оттуда:

dmitry@mail:~$ sudo apt-get install postfixadmin

Выбираем apache2, соглашаемся на настройку пакета через dbconfig-common, указываем тип БД как mysql, делимся паролем root-а от БД, указываем новый пароль для пользователя postfixadmin, потдверждаем его и всё! Конфигуратор создаст базу, проведёт все необходимые настройки за Вас — этот процесс характерен для PostfixAdmin 2.3+. В предыдущих версиях чуток разнятся общие «телодвижения».

Теперь открываем в браузере http://your.name.or.ip/postfixadmin/setup.php, указываем пароль супер-администратора и забираем хэш… Теперь редактируем /etc/postfixadmin/config.inc.php, обращая внимание на следующие параметры:

$CONF['configured'] = true;
$CONF['setup_password'] = '63b314e5c67718e98b4ec820527d3ed4:a3484f30c65e69472312c57728e77b4776478084';
$CONF['default_language'] = 'ru';

// указываем шифрование паролей, соответствующее тому, которое используется у Dovecot
$CONF['encrypt'] = 'dovecot:CRAM-MD5';

// Отключаем проверку сущестоввания домена. Бывают ситуации, когда домен еще не виден в Интернете,
// а почта уже должна работать -- эта опция разрешит Вам создать аккаунт для домена, 
// который еще «не вывешен» в Интернет
$CONF['emailcheck_resolve_domain']='NO';

// Мы будем использовать dovecot, поэтому убираем префикс
$CONF['create_mailbox_subdirs_prefix']='';

// укажем утилиту doveadm для создания паролей dovecot
$CONF['dovecotpw'] = '/usr/bin/doveadm pw';

Устранение ошибок: Если Вы столкнулись с ошибкой 'can't encrypt password with dovecotpw, see error log for details', проверьте присутствие файла /usr/sbin/dovecotpw в вашей системе, в ином случае используйте /usr/bin/doveadm, для этого подправите $CONF['dovecotpw'] = '/usr/bin/doveadm pw'. Дополнительно, можете проверить работоспособность doveadm:

root@mail:/# doveadm pw -s CRAM-MD5 -p 'password'
{CRAM-MD5}9186d855e11eba527a7a52ca82b313e180d62234f0acc9051b527243d41e2740

Также, как видите, с версии PostfixAdmin 2.3+ внесли ясность с форматом шифрования паролей для Dovecot. Ранее это был особый вариант извращения, решить проблему использования md5crypt и CRAM-MD5. Задавайте метод шифрования изначально, так как выбрав один раз MD5 Вы не сможете в дальнейшем безболезненно перейти, например, на CRAM-MD5.

Установленный PostfixAdmin добавит таблицы в БД. Их дамп Вы можете посмотреть/скачать здесь. Основываясь именно на этом дампе, мы и будем строить наш бесплатный, отказо- и спамо- устойчивый почтовый сервер на базе Postfix.

Изначально добавим один наш домен example.com в обслуживание почтового сервера, настроим парочку альясов и еще чего зацепим по дороге… Где-то так —

базовая настройка домена в postfixadmin
рисунок 1 — базовая настройка домена в postfixadmin

3. Настройка Postfix для работы с MySQL

Оглядываясь на структуру mysql-таблиц PostfixAdmin, создадим необходимые файлы конфигурации и свяжем Postfix, PostfixAdmin и MySQL…

3.1 Виртуальные домены Postfix

dmitry@mail:/etc/postfix$ sudo vim /etc/postfix/mysql-virtual-mailbox-domains.cf

user = postfixadmin 
password = myVerySecurePasswordFromUserPostfixadmin
hosts = localhost
dbname = postfixadmin
query = SELECT 1 FROM `domain` WHERE `domain` = '%s' AND backupmx = '0' AND active = '1'

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

dmitry@mail:/etc/postfix$ sudo postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Проверим, что наш вирутальный домен находится в БД и postfix его видит:

dmitry@mail:/etc/postfix$ sudo postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
1

Вы должны увидеть цифру 1 если все правильно настроено.

3.2 Альясы

Настроим альясы (для пересылки почты с одного ящика или домена на другой, или с нескольких на один). Ранее мы добавили несколько стандартных альясов (abuse@example.com, hostmaster@example.com, postmaster@example.com webmaster@example.com) для нашего реального пользователя admin@example.com и один домен-альяс. Другими словами, вся почта, пришедшая на адреса этих альясов будет пересылаться на ящик admin@example.com.

dmitry@mail:/etc/postfix$ sudo vim /etc/postfix/mysql-virtual-alias-maps.cf

user = postfixadmin 
password = myVerySecurePasswordFromUserPostfixadmin
hosts = localhost
dbname = postfixadmin
query = select `goto` from `alias` where `address` = '%s'

Здесь же настроим пересылку почты между доменами. Мы создали в PostfixAdmin основной домен example.com и добавили домен-альяс mail.example.com. Научим наш почтовый сервер принимать почту для этого домена-альяса и пересылать её на основной домен…

dmitry@mail:/etc/postfix$ sudo vim /etc/postfix/mysql-virtual-alias-domain-maps.cf

user = postfixadmin 
password = myVerySecurePasswordFromUserPostfixadmin
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1

Научим Postfix работать с альясами почтовых ящиков и доменами-альясами:

dmitry@mail:/etc/postfix$ sudo postconf -e 'virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf, mysql:/etc/postfix/mysql-virtual-alias-domain-maps.cf'

Проверим работоспособность наших альясов. Вы должны увидеть ящик на который будет пересылаться почта если все правильно настроено.

dmitry@mail:/etc/postfix$ sudo postmap -q postmaster@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
admin@example.com

dmitry@mail:/etc/postfix$ sudo postmap -q webmaster@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
admin@example.com

dmitry@mail:/etc/postfix$ sudo postmap -q admin@mail.example.com mysql:/etc/postfix/mysql-virtual-alias-domain-maps.cf
admin@example.com

3.3 Ретрансляция (пересылка) почты

Укажем перечень (список) доменов для которых будет приниматься почта для дальнейшей пересылки. Этот механизм также необходим для организации ретрансляции почты. Например, у Вас существует несколько MX записей с разными приоритетами, и если почта пришла на сервер с более низким приоритетом мы примем её и перешлём на основной(главный)почтовый сервер.

Как пример, добавим в наш почтовый сервер домен mail.customer.com для обслуживания, отметив его как «Резервный MX». Этого достаточно, чтобы заработала ретрансляция почты для данного отдельно выбранного домена через наш почтовый сервер.

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

ретрансляция почты для резервных MX доменов, настройка postfixadmin
рисунок 2 — ретрансляция почты для резервных MX доменов, настройка postfixadmin
dmitry@mail:/etc/postfix$ sudo vim /etc/postfix/mysql-relay-domains.cf

hosts = localhost
user = postfixadmin
password = myVerySecurePasswordFromUserPostfixadmin
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '1' AND active = '1'

Добавим настройку в Postfix:

dmitry@mail:/etc/postfix$ sudo postconf -e 'relay_domains = mysql:/etc/postfix/mysql-relay-domains.cf'

Проверим, что ретрансляция почты работает правильно.

dmitry@mail:/etc/postfix$ sudo postmap -q mail.customer.com mysql:/etc/postfix/mysql-relay-domains.cf
mail.customer.com

3.4 Виртуальные пользователи или почтовые ящики Postfix

dmitry@mail:/etc/postfix$ sudo vim /etc/postfix/mysql-virtual-mailbox-maps.cf

hosts = localhost
user = postfixadmin
password = myVerySecurePasswordFromUserPostfixadmin
dbname = postfixadmin
query = SELECT username FROM mailbox WHERE username='%s' AND active = '1'

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

dmitry@mail:/etc/postfix$ sudo postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Проверим, что наш вирутальный пользователь находится в БД и postfix его видит:

dmitry@mail:/etc/postfix$ sudo postmap -q admin@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
admin@example.com

Настройка связывания Postfix с MySQL завершена.

4. Детальная настройка Postfix

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

dmitry@mail:/$ sudo groupadd vmail -g 5000
dmitry@mail:/$ sudo useradd vmail -g vmail -u 5000 -d /home/vmail -m
dmitry@mail:/$ sudo cat /etc/passwd | grep vmail

vmail:x:5000:5000::/home/vmail:/bin/sh

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

dmitry@mail:/$ sudo postconf -e virtual_uid_maps=static:5000
dmitry@mail:/$ sudo postconf -e virtual_gid_maps=static:5000

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

dmitry@mail:/$ sudo chgrp postfix /etc/postfix/mysql-*.cf
dmitry@mail:/$ sudo chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf

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

root@mail:/# mkdir /etc/postfix/certs && mkdir /etc/postfix/certs/private
root@mail:/# openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/postfix.pem -keyout /etc/postfix/certs/private/postfix.pem
Generating a 2048 bit RSA private key
...+++
........................................................+++
writing new private key to '/etc/postfix/certs/private/postfix.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]:BY
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Minsk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:demon.of.by
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:demon.of.by
Email Address []:spam2ban@demon.of.by

Теперь подправим «чуток» наш основной конфигурациооный файл /etc/postfix/main.cf. Идея в принципе светлая — получить безопасный и надежный почтовик с поддержкой мультидоменов и спамоустойчивый по максимому. Вначале, как принято «простыня» конфигурационных опций, потом описание что и куда и как.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

##
# General
#

smtpd_banner = $myhostname ESMTP $mail_name
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain

# Следите, чтобы здесь не было $myhostname и $mydomain иначе посыпятся 
# ошибоки вида  "do not list domain in BOTH mydestination and virtual_mailbox_domains"
mydestination = localhost.ec2.internal, localhost, localhost.$mydomain

# Альясы системных пользователей сервера
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

##
# TLS parameters
#
smtpd_tls_cert_file = /etc/postfix/certs/postfix.pem
smtpd_tls_key_file = /etc/postfix/certs/private/postfix.pem
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.


##
# Virtual
#
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf, mysql:/etc/postfix/mysql-virtual-alias-domain-maps.cf
relay_domains = mysql:/etc/postfix/mysql-relay-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

##
# Restcrictions
#

smtpd_recipient_restrictions =  permit_mynetworks,
                                permit_sasl_authenticated,
                                reject_unauth_destination,
                                reject_unauth_pipelining,
                                check_helo_access hash:/etc/postfix/access_helo,
                                reject_invalid_helo_hostname,
                                reject_non_fqdn_recipient

smtpd_sender_restrictions = permit_mynetworks,
                            permit_sasl_authenticated,
                            reject_non_fqdn_sender,
                            reject_unknown_sender_domain

smtpd_helo_restrictions = permit_mynetworks,
                          permit_sasl_authenticated,
                          reject_non_fqdn_helo_hostname,
                          reject_invalid_helo_hostname

smtpd_data_restrictions = permit_mynetworks,
                          permit_sasl_authenticated,
                          reject_unauth_pipelining,
                          reject_multi_recipient_bounce

smtpd_etrn_restrictions = permit_mynetworks,
                          reject

broken_sasl_auth_clients = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
disable_vrfy_command = yes

##
# Limits
#

max_use = 100
mailbox_size_limit = 0
default_process_limit = 100
header_size_limit = 10485760
message_size_limit = 104857600
smtpd_error_sleep_time = 20s
anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 100
smtpd_client_connection_rate_limit = 250
smtpd_client_message_rate_limit = 250

##
# Queue
#
maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d

Создать файл /etc/postfix/access_helo диктует необходимость. К сожалению, существуют почтовые сервера, от которых надо принимать почту, но настроены они не совсем правильно.

root@mail:/# vim /etc/postfix/access_helo

proxmox.packlines.local OK
packline.com    OK
mail.ru OK
127.0.0.1 REJECT Your server configured incorrectly
localhost REJECT Your server configured incorrectly
localhost.localdomain REJECT Your server configured incorrectly
localhost.domain.com REJECT Your server configured incorrectly
10 REJECT Your server configured incorrectly
172.16 REJECT Your server configured incorrectly
192.168 REJECT Your server configured incorrectly
1.2.3.4 REJECT Your server configured incorrectly

root@mail:/etc/postfix# postmap access_helo

Заодно обработаем файл альсов системных пользователей /etc/aliases:

root@mail:/# postalias /etc/aliases

Примечание: используйте именно утилиту postalias, а не postmap. Иначе получите ошибки вида:

postmap: warning: /etc/aliases, line 2: record is in "key: value" format; is this an alias file?

Теперь можно настраивать Dovecot (Mail Delivery Agent, MDA)

5. Настройка Dovecot

Dovecot 2+ удобно разбит на части, что облегчает его настройку на порядок. С другой стороны, куча мануалов резко устарела по этой причине. Наша задача настроить MDA, так чтобы он отгружал почту по ящикам и папкам, авторизовывал почтовые клиенты через SASL и предоставлял пользователям imap и pop3 (imaps, pop3s), умел и работал с квотами.

5.1 Базовая настройка Dovecot

Минимальное изменение файла /etc/dovecot/dovecot.conf:

login_greeting = I'm MDA. Ready.

Остальная часть конфигурационного файла удобно разбита на составляющие и прекрасно документирована:

root@mail:/# vim /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain login cram-md5
# Закомментируйте auth-system.conf.ext вовсе, так как у нас креденшелы будут храниться в другом месте.
#!include auth-system.conf.ext
# Расскомментируйте auth-sql.conf.ext, так как будет использоваться SQL.
!include auth-sql.conf.ext


root@mail:/# vim /etc/dovecot/conf.d/10-logging.conf

info_log_path = /var/log/dovecot.info
debug_log_path = /var/log/dovecot.debug
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes


root@mail:/# vim /etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/home/vmail/%d/%n
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = vmail

root@mail:/# vim /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
    group = vmail
  }
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user=postfix
    group=postfix
  }
}


root@mail:/# vim /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem


root@mail:/# vim /etc/dovecot/conf.d/15-lda.conf

lda_mailbox_autocreate = yes
lda_mailbox_autosubscribe = yes
protocol lda {
  mail_plugins = $mail_plugins autocreate
}


root@mail:/# vim /etc/dovecot/conf.d/90-plugin.conf

plugin {
  autocreate = Trash
  autocreate2 = Sent
  autocreate3 = Drafts
  autocreate4 = Junk
  autosubscribe = Trash
  autosubscribe2 = Sent
  autosubscribe3 = Drafts
  autosubscribe4 = Junk
}


root@mail:/# vim auth-sql.conf.ext

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

Пока не забыли, настроим ротирование лог-файлов Dovecot, иначе они очень быстро начнут занимать сотни мегабайт места. Отключать их полностью смысла нет, они содержат массу полезной информации и пригодятся для анализа как ошибок, так и инцидентов, связанных с безопасностью. Создаём новую задачу для logrotate:

root@mail:/# vim /etc/logrotate.d/dovecot

/var/log/dovecot.debug {
        notifempty
        weekly
        missingok
        rotate 4
        compress
        delaycompress
        create 666 dovecot dovecot
        postrotate
           [ -f /var/run/dovecot/master.pid ] && doveadm log reopen
        endscript
}

/var/log/dovecot.info {
        notifempty
        weekly
        missingok
        rotate 4
        compress
        delaycompress
        create 666 dovecot dovecot
        postrotate
           [ -f /var/run/dovecot/master.pid ] && doveadm log reopen
        endscript
}


root@mail:/# /etc/init.d/rsyslog restart

5.2 Настройка квот в Dovecot

Настройку квот в Dovecot 2+ я специально вынес в отдельный раздел, так как не все настраивают квотирование на своих почтовых серверах. Кстати, обладая замечательной документацией (Dovecot/Quota/Configuration) наш чудный Dovecot мало того, что в этом вопросе не совсем прозрачен и настройка квот частенько затягивается на несколько часов гугления по десяткам форумов и осмысления вечного, так ещё и не поддерживает квоты для доменов, если используется dict и mysql… Итак, вначале задействуем необходимые опции в конфигурационном файле PostfixAdmin


// Задаем "потолок" квот
$CONF['maxquota'] = '1000';

// Quota
// активируем механизм квотирования
$CONF['quota'] = 'YES';
// Установите множитель в '1024000' или '1048576', так как бэкэнд PostfixAdmin-а оперирует мегабайтами
$CONF['quota_multiplier'] = '1048576';

// Optional:
// Show used quotas from Dovecot dictionary backend in virtual mailbox listing.
// See: DOCUMENTATION/DOVECOT.txt  http://wiki.dovecot.org/Quota/Dict
$CONF['used_quotas'] = 'YES';

// if you use dovecot >= 1.2, set this to yes. Note about dovecot config: table "quota" is for 1.0 & 1.1, table "quota2" is for dovecot 1.2 and newer
// Мы планируем хранить квоты в БД в таблице quota2, так как dovecot у нас версии 2.x
$CONF['new_quota_table'] = 'YES';

После активации настроек, PostfixAdmin будет работать со следующими полями и таблицами в БД и будет иметь вид как показано ниже:

  • quota в таблице mailbox представляет собой индивидуальное значение квоты в мегабайтах для конкретного пользователя;
  • maxquota в таблице domain - это предел квоты всего домена. Эти значения для каждого домена может установить только суперадминистратор PostfixAdmin

активные квоты в панели управления почтовым сервером, настройка postfixadmin
рисунок 3 — активированные квоты в панели управления почтовым сервером, настройка postfixadmin

Теперь перейдем непосредственно к настройке Dovecot для работы с квотами. На примере dovecot-dict-sql.conf.ext создадим новый файл dovecot-dict-sql-user.conf, который содержит информацию отображения (маппинга) квот для почтовых ящиков пользователей.

root@mail:/# vim /etc/dovecot/dovecot-dict-sql-user.conf

connect = host=localhost dbname=postfixadmin user=postfixadmin password=myVerySecurePasswordFromUserPostfixadmin
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
}

root@mail:/# chown root:dovecot /etc/dovecot/dovecot-dict-sql-user.conf
root@mail:/# chmod 640 /etc/dovecot/dovecot-dict-sql-user.conf 

Чтобы избежать создания на каждый запрос нового подключения SQL, подскажем держать наготове наш свежесозданный словарь в соответствующем процессе словарей.

root@mail:/# vim /etc/dovecot/dovecot.conf

dict {
  sqluserquota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf
}

Далее правим конфигурацию MDA, чтобы позволить Dovecot вносить изменения в таблицы БД и изменять значение как квоты пользовательских ящиков (таблица quota2). Задействуем необходимые плагины для реализации квот в Dovecot в соответствующих конфигурационных файлах:

  • quota: непосредственно реализует контроль квот и включает в себя управление квотированием.
  • imap_quota: используется для обмена информации о состоянии квот по IMAP.

root@mail:/# vim /etc/dovecot/conf.d/10-mail.conf:

# Space separated list of plugins to load for all services. Plugins specific to
# IMAP, LDA, etc. are added to this list in their own .conf files.
mail_plugins = $mail_plugins quota

root@mail:/# vim /etc/dovecot/conf.d/10-master.conf:

service dict {
  # If dict proxy is used, mail processes should have access to its socket.
  # For example: mode=0660, group=vmail and global mail_access_groups=vmail
  unix_listener dict {
    mode = 0600
    user = vmail
    #group =
  }
}

root@mail:/# vim /etc/dovecot/conf.d/20-imap.conf:

protocol imap {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins imap_quota
}

Теперь — непосредственно сами квоты и настройка отсылки предупреждений о переполнении почтового ящика пользователям. В нашем случае мы заведём корневое правило quota — для квотирования пользователей:

root@mail:/# vim /etc/dovecot/conf.d/90-quota.conf

##
## Quota limits
##

plugin {
  # Using SQL Tables to store current quota size
  quota = dict:User Quota::proxy::sqluserquota

  # это правило "зарезервируем" для ответа о квоте пользователя посредством запроса 
  # к базе данных MySQL (см. ниже раздел 5.3)
  # quota_rule =

  # Allow 10% more for Trash Folder
  quota_rule2 = Trash:storage=+10%%
  quota_rule3 = Spam:storage=+20%%

  # начиная с версии 2.2+ это правило уже включено по умолчанию,
  # однако наша версия 2.1, поэтому разрешим всем пользователям 10% овер-квоты
  quota_grace = 10%%
}

##
## Quota warnings
##

plugin {
  quota_warning = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
  quota_warning3 = -storage=100%% quota-warning below %u # тем кто уже забил ящик, овер-квота уже недоступна
}

service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  # use some unprivileged user for executing the quota warnings
  user = vmail
  unix_listener quota-warning {
    mode = 600
    user = vmail
  }
}

Существует также нюанс насчёт скрипта quota-warning.sh — всё-бы замечательно, но скрипт по адресу /usr/local/bin/quota-warning.sh так и не нашелся. Так что имеет смысл «написать» свой и поставить на него верные права. Кстати пример скрипта из официального руководства, также не совсем жизнеспособный на Debian «Wheezy». Хотябы по той простой причине, что dovecot-lda не находится по адресу /usr/local/libexec/dovecot/dovecot-lda…

root@mail:/# vim /usr/local/bin/quota-warning.sh

#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@demon.of.by
Subject: Quota warning $PERCENT%

Your mailbox is now $PERCENT% full.
Please remove unnecessary emails to avoid new mail loosing.
EOF

root@mail:/# chown vmail:dovecot /usr/local/bin/quota-warning.sh
root@mail:/# chmod +x /usr/local/bin/quota-warning.sh

Обратите внимание на опцию noenforcing — используется, дабы исключить циклическую отправку уведомлений. В былые времена Dovecot v.1 админы были вынуждены делать отдельный конфиг Dovecot с отключенными квотами, чтобы решить эту проблему. Грабли ещё те. Кстати, Вы можете проверить скрипт отправки нотификаций о квоте следующим способом:

root@mail:/# /usr/local/bin/quota-warning.sh 82 user@example.com

Квоты настроены!

Примечание: если после перезапуска в лог вывалилось ошибка вроде:

Error: net_connect_unix(/var/run/dovecot/dict) failed: Permission denied (euid=5000(vmail) egid=5000(vmail) missing +r perm: /var/run/dovecot/dict, we're not in group 108(postfix), dir owned by 0:0 mode=0755)
May 13 11:43:35 mail dovecot: lda(admin{at}ъdemon.of.by): Error: Internal quota calculation error

Проверьте, что у Вас не установлена опция mail_access_groups в файле 10-mail.conf, a также задействована секция service dict в файле 10-master.conf:

service dict {
  unix_listener dict {
    mode = 0600
    user = vmail
    #group =
  }
}

Решение взято отсюда — http://wiki2.dovecot.org/Dict

Facepalm: к сожалению, квоты для домена в dovecot реализованы только частично в случае использования dict+mysql На дворе уже 2014-й год и Dovecot подрос до 2.2+ версии, а поддержка этой опции до сих пор не реализована полностью. Я потратил несколько дней, чтобы решить этот вопрос, но безуспешно. Возможно для кого-то будут полезен мой опыт настройки квот для доменов используя dict+mysql. Буду рад дельному совету.

5.3 Настройка MySQL соединения в Dovecot

Финальным аккордом настройки Dovecot будет его знакомство с нашей БД и таблицами, где хранится вся необходимая для работы MDA информация, с учетом использования квот. Если квоты Вами не задействованы, исключите их из SQL запросов.

root@mail:/# vim /etc/dovecot/dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=myVerySecurePasswordFromUserPostfixadmin
default_pass_scheme = CRAM-MD5

password_query = SELECT username as user, domain, password \
                 FROM mailbox WHERE username = '%u' AND active = '1'

user_query = SELECT CONCAT('*:bytes=', IF(mailbox.quota = 0 || mailbox.quota = -1, 0, mailbox.quota)) as quota_rule \
             FROM mailbox, domain \
             WHERE username = '%u' AND mailbox.active = '1' AND \
                   domain.domain = '%d' AND domain.active = '1'
 

Нюансы — квоты обсчитываются в байтах, соответственно убедитесь, что в Вашей БД значения сохраняются именно в байтах… в ином случае, вы можете добавить множитель прямо в запрос, как и сделано для квоты всего домена (это значение хранится в базе в МБ).

Другим нюансом является указание/переопределение значений uid/userdb_uid, gid/userdb_gid, home и mail. В случае с виртуальными пользователями в MySQL используется один пользователь vmail на всю почту и все эти параметры уже определены в /etc/dovecot/conf.d/10-mail.conf ранее. Запрашивать их и получать с каждым новым запросом нет никакой нужды и смысла! В ином случае, добавьте в запрос следующие поля по аналогии:

password_query = …
      CONCAT('/home/vmail/',domain.domain) as  userdb_home, \
      CONCAT('maildir:/home/vmail/',domain.domain,'/', mailbox.local_part) as userdb_mail, \
      '5000' AS userdb_uid, '5000' AS userdb_gid \
    FROM mailbox, domain \
    …

user_query = …
      CONCAT('/home/vmail/',domain.domain) as home, \
      CONCAT('maildir:/home/vmail/',domain.domain,'/', mailbox.local_part) as mail, \
      '5000' AS uid, '5000' AS gid \
    FROM mailbox, domain \
      …

Проверить состояние квоты Dovecot для конкретного пользователя Вы можете с помощью утилиты dovadm:

root@mail:/# doveadm -Dv quota recalc -u admin@example.com

root@mail:/# doveadm -Dv quota get -u admin@example.com
Quota name Type    Value Limit                                                                              %
User Quota STORAGE  5758 10240                                                                             56
User Quota MESSAGE     3     -                                                                              0

5.4 Подключаем Dovecot к Postfix

Внесем новые опции в /etc/postfix/main.cf, дабы назначить Dovecot нашим виртуальным траспортом:

##
# Virtual 
#
virtual_mailbox_base = /home/vmail
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

##
# SASL 
#
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

В /etc/postfix/master.cf внесем две строки, не забывая о двух пробелах в начале второй строки:

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

Рестарт сервисов…

root@mail:/# service postfix restart
root@mail:/# service dovecot restart

Анализ лог-файлов. Тестирование. Внимательное чтение мануалов, если что-то не взлетело.

Основная настройка почтового сервера завершена. Однако не стоит на этом останавливаться — обязательны к реализации следующие действия и настройки:


Комментарии 54

  1. swany — Jun 07, 2017 at 09:41 AM

    Поскольку это моя любимая статья добавлю для тех, кто не смог победить:
    Error: net_connect_unix(/var/run/dovecot/dict) failed: Permission denied (euid=5000(vmail) egid=5000(vmail) missing +r perm: /var/run/dovecot/dict, we're not in group 108(postfix), dir owned by 0:0 mode=0755)
    May 13 11:43:35 mail dovecot: lda(admin{at}ъdemon.of.by): Error: Internal quota calculation error

    Поверьте свой 90-quota.conf, обязательно должно быть четыре цифры как минимум 0600, но мне кажется лучше 0666

    service quota-warning {
    executable = script /usr/local/bin/quota-warning.sh
    user = vmail
    unix_listener quota-warning {
    mode = 0666
    user = vmail
    }


  2. Денис — Dec 09, 2016 at 12:15 AM

    Наверное стоит
    ssl_cert =

  3. Василий — Aug 01, 2016 at 12:53 PM

    Замечательная статья! Спасибо вам за проделанную работу.

  4. Артем — Sep 10, 2015 at 01:33 PM

    В скрипт quota-warning.sh можно добавить строку:

    Content-Type: text/plain; charset=UTF-8

    Тогда получится отправлять предупреждение на русском языке.

  5. ipo — Aug 27, 2015 at 10:03 PM

    connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

    лечится hosts = 127.0.0.1 вместо hosts = localhost

  6. ipo — Aug 27, 2015 at 08:19 PM

    получаю ошибку
    postfix/trivial-rewrite[1776]: warning: mysql:/etc/postfix/mysql-virtual-alias-maps.cf: table lookup problem

  7. Rafael — Aug 21, 2015 at 10:18 AM

    Дмитрий Владимирович!
    А вам не трудно было бы дописать настройку Postfix + Dovecot + Postfixadmin для работы на IPv6 ?

  8. Сергей — Jun 17, 2015 at 11:01 PM

    Доброго времени суток.
    Всё сделал по инструкции. Может быть подскажете, в чем может быть проблема с DOVECOT. Не стартует. OS -ubuntu 14.04 В логах старта службы выходит следующее:
    systemctl status dovecot.service
    в—Џ dovecot.service - LSB: Dovecot init script
    Loaded: loaded (/etc/init.d/dovecot)
    Active: failed (Result: exit-code) since Wed 2015-06-17 22:53:32 MSK; 14s ago
    Docs: man:systemd-sysv-generator(8)
    Process: 1727 ExecStart=/etc/init.d/dovecot start (code=exited, status=1/FAILURE)

    systemd[1]: Starting LSB: Dovecot init script...
    dovecot[1727]: * Starting IMAP/POP3 mail server dovecot
    dovecot[1727]: Segmentation fault (core dumped)
    dovecot[1727]: ...fail!
    systemd[1]: dovecot.service: control process exited, code=exited status=1
    systemd[1]: Failed to start LSB: Dovecot init script.
    system
    Если есть идеи - помогите.
    В логах ещё есть такое:
    kernel: doveconf[1734]: segfault at 1 ip 00007fd510c144b2 sp 00007ffee33860c0 error 4 in libc-2.21.so[7fd510bc6000+1c0000]

  9. swany — May 22, 2015 at 10:14 AM

    проблема на Debian 8/Jessie-
    dovecot: master: Error: systemd listens on port 143, but it’s not configured in Dovecot. Closing.
    решение
    $sudo systemctl disable dovecot.socket

  10. Den — May 20, 2015 at 05:30 PM

    помогло 127.0.0.1 ))
    А вот с этим что делать?
    dovecot[9755]: lda(den@xxx.xxx): Warning: autocreate plugin is deprecated, use mailbox { auto } setting instead
    ну и походу тогда уж добавьте, где-то нужно было:
    dmitry@mail:/$ sudo chgrp vmail /var/log/dovecot*
    dmitry@mail:/$ sudo chmod u=rw,g=rw,o=r /var/log/dovecot*

  11. Дмитрий Владимирович — May 20, 2015 at 05:08 PM

    Den,
    1. Проверьте поля username + password в файле mysql-virtual-alias-maps.cf
    2. Поставьте hosts = 127.0.0.1 в том же файле
    Ну и потестайте альясы из командной строки
    postmap -q postmaster@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf

  12. Den — May 20, 2015 at 03:41 PM

    warning: connect to mysql server localhost: Can't connect to local MySQL server through socket...ock' (2)
    postfix/trivial-rewrite[7874]: warning: mysql:/etc/postfix/mysql-virtual-alias-maps.cf: table lookup problem

    и как-то гугл не помогает

  13. Павел — May 16, 2015 at 07:16 AM

    Спасибо. А будет статья по настройке spamassasin и amclaw?

  14. Артем — May 15, 2015 at 10:29 PM

    приветствую!
    подскажите пожалуйста, как сделать так, что бы отправлялось уведомление о превышении квоты пользователю и postmasterу?
    пробовал вставлять в скрипт отправки дополнительные опции TO и BCC, безуспешно (

  15. Игорь — May 05, 2015 at 08:23 PM

    Заработало так как мне надо только после того, как изрядно поковырялся в разных примерах и пробовал разные настройках. Спасибо еще раз за статью - очень удачный вариант базовых настроек, а дальше каждый допиливает как может.
    Анализ лог-файлов. Тестирование. Внимательное чтение мануалов, если что-то не взлетело.
    Самая правильная фраза :)

  16. Игорь — May 05, 2015 at 07:41 AM

    Спасибо, postfix стал соединяться с mysql. Похоже не хватало какого-то пакета sasl. Теперь postfix не находит пользователя, ищет только среди локальных: relay=local не нашел у Вас в конфигах где идет запрос к mailbox.transport

  17. Дмитрий Владимирович — May 03, 2015 at 08:07 PM

    Игорь,
    - 127.0.0.1 оставьте как есть. Первая ошибка аккурат была из-за сокета и проблем песочницы;
    - вторая ошибка касается неправильно настроенного мильтера - возможно недоконфигуряли OpenDKIM например... смотрите что у Вас в опции smtpd_milters и что в логах соответствующей службы;

    Спасибо за замечание о регистре - на работоспособность сие не влияет... Чисто эстетика по-моему)

  18. Игорь — May 02, 2015 at 08:54 PM

    Кстати поправьте в статье:
    dmitry@mail:/etc/postfix$ sudo vim /etc/postfix/mysql-virtual-alias-maps.cf
    user = postfixadmin
    password = myVerySecurePasswordFromUserPostfixadmin
    hosts = localhost
    dbname = postfixadmin
    query = select `goto` from `alias` where `address` = '%s'
    Сделайте запрос к базе прописными буквами

  19. Игорь — May 02, 2015 at 08:51 PM

    Спасибо, действительно разжевано все до мелочей.
    Ставил по Вашей статье, но столкнулся с проблемой postfix не может соединиться с mysql, в чем может быть проблема?
    postmap -q admin@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf выполняется и дает нужный результат (с поправками на настройки сервера)
    а сам postfi выдает:
    postfix/cleanup[2185]: warning: connect to mysql server localhost: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    причем # ls /var/run/mysqld/
    mysqld.pid mysqld.sock
    #lsof /var/run/mysqld/mysqld.sock
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    mysqld 905 mysql 12u unix 0xffff88005b207100 0t0 13092 /var/run/mysqld/mysqld.sock
    Пробовал менять localhost на 127.0.0.1 в таком случае появляется
    ....postfix/cleanup[2520]: 9E9802140719: milter-reject: END-OF-MESSAGE from localhost[127.0.0.1]: 4.7.1 Service unavailable - try again later; from=.....
    Подскажите, пожалуйста куда копать

  20. pava14 — Mar 19, 2015 at 04:30 AM

    Для квот:
    /etc/dovecot/conf.d/15-lda.conf
    quota_full_tempfail = yes


    Далее для квот:
    /etc/dovecot/conf.d/90-quota.conf
    service quota-status {
    executable = quota-status -p postfix
    inet_listener {
    port = 12340
    # You can choose any port you want
    }
    client_limit = 1
    }

    /etc/postfix/main.cf
    smtpd_recipient_restrictions =
    ...
    check_policy_service inet:127.0.0.1:12340,
    ...

    Или:
    /etc/dovecot/conf.d/90-quota.conf
    service quota-status {
    executable = quota-status -p postfix
    unix_listener /var/spool/postfix/private/quota-status {
    user = postfix
    }
    client_limit = 1
    }

    /etc/postfix/main.cf
    smtpd_recipient_restrictions =
    ...
    check_policy_service unix:private/quota-status,
    ...

  21. Дмитрий Владимирович — Mar 11, 2015 at 02:07 PM

    Виталий, спасибо за замечание - я исправил в статье.

    По поводу всей этой каши с hosts, hostname и mailname Вы всё верно сказали. Но я могу сказать только одно - Ваш сервер должен на команду hostname -f должен отдавать то самое, полное каноническое имя сервера, которое указано в ДНС. Остальное несущественно.

  22. Виталий — Mar 07, 2015 at 04:41 PM

    Также, ничего не написано про настройку /etc/mailname
    В /etc/hostname должно быть имя сервера без доменной части.
    А в /etc/mailname наоборот - fqdn имя.

    root@mx1:~# cat /etc/hostname
    mx1
    root@mx1:~# cat /etc/mailname
    mx1.example.com

    Замечание: опытным путем проверенно что hostname может быть любым, главное чтобы в mailname было прописан доменное имя, которое написано в MX-записи домена для которого делаем почту (Например: mail.example.com)

    /etc/hosts
    92.122.190.40 mx1.example.com mx1

    Замечание: если hostname и mailname у нас не совпадают, тогда желательно в hosts прописать mailname.

  23. Виталий — Mar 07, 2015 at 04:23 AM

    Аутентификация заработала только с
    $CONF['encrypt'] = 'md5crypt';
    в /etc/postfixadmin/config.inc.php

  24. Виталий — Mar 07, 2015 at 04:03 AM

    Пользователи не проходят авторизацию:
    Mar 07 02:52:58 auth-worker(17065): Debug: sql(123,46.211.132.130): query: SELECT username as user, domain, password FROM mailbox WHERE username = '123' AND active = '1'
    Mar 07 02:53:00 auth: Debug: client passdb out: FAIL 3 user=123

    Где может быть трабл?

  25. Виталий — Mar 07, 2015 at 04:01 AM

    /etc/postfixadmin/config.inc.php
    Пропущена точка с запятой:
    $CONF['dovecotpw'] = '/usr/bin/doveadm pw';

  26. Дмитрий Владимирович — Feb 05, 2015 at 04:35 PM

    Артём, спасибо - исправлено.

  27. Артем — Feb 05, 2015 at 03:02 PM

    Спасибо за статью!

    Есть опечатка:
    virtual_mailbox_base = /var/vmail

    Но ранее мы указывали /home/vmail

  28. Сергей Сергеев — Jan 28, 2015 at 09:36 AM

    Добрый день. Хотел бы внести небольшую поправку в статью. При настройке dovecot-а без квот я столкнулся с проблевой описанной выше в коментах. А именно что при не указывании user_query в /etc/dovecot/dovecot-sql.conf.ext dovecot ругается на неверный SQL запрос. Но как верно подмечено в статье нам не нужно делать запрос чтобы узнать uid/guid пользователя потому что он у нас один на всех. Решается это проблема вот так:
    root@mail:/# vim auth-sql.conf.ext

    passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf.ext
    }
    #userdb {
    # driver = sql
    # args = /etc/dovecot/dovecot-sql.conf.ext
    #}
    То есть просто отключаем модуль userdb для driver = sql
    Я проверил. Работает.

  29. Sergey — Dec 25, 2014 at 11:55 AM

    Спасибо Дмитрий Владимирович, правда всё-равно не заработало,
    нужно выкладывать конфиги логи, что мне кажется не правильно здесь это делать,
    поэтому я решил уйти на форум постфикса http://www.postfix.ru/viewtopic.php?t=25255 по решению проблем.
    PS/ Буду благодарен за помошь там.

  30. Дмитрий Владимирович — Dec 24, 2014 at 01:08 PM

    Sergey, в таком случае попробуйте добавить всё же в файл /etc/dovecot/dovecot-sql.conf.ext строчку

    user_query = SELECT CONCAT('/home/vmail/',domain.domain) as home, \
    '5000' AS uid, '5000' AS gid \
    FROM mailbox, domain \
    WHERE username = '%u' AND mailbox.active = '1' AND \
    domain.domain = '%d' AND domain.active = '1'

  31. Sergey — Dec 24, 2014 at 12:51 PM

    Спасибо Дмитрий Владимирович теперь в логах mail.err появляется такое:
    dovecot: auth-worker(3326): Error: sql(admin@ntkintourist.ru,192.168.22.29): User query failed: Table 'postfixadmin.users' doesn't exist (using built-in default user_query: SELECT home, uid, gid FROM users WHERE username = '%n' AND domain = '%d')
    dovecot: imap: Error: Internal auth failure (client-pid=3329 client-id=1)
    я понимаю что он ищет таблицу которой нет, используя этот запрос.
    Не совсем понятно где я напутал делал всё по статье выше кроме настройки квот.

  32. Дмитрий Владимирович — Dec 24, 2014 at 12:27 PM

    Sergey, в таком случае Вы можете вообще убрать user_query. Оставьте только password_query:

    driver = mysql
    connect = host=localhost dbname=postfixadmin user=postfixadmin password=myVerySecurePasswordFromUserPostfixadmin
    default_pass_scheme = CRAM-MD5

    password_query = SELECT username as user, domain, password \
    FROM mailbox WHERE username = '%u' AND active = '1'

  33. Sergey — Dec 24, 2014 at 11:33 AM

    Добрый день подскажите так должен выглядить /etc/dovecot/dovecot-sql.conf.ext без запроса на квоты?

  34. Игорь — Nov 21, 2014 at 12:38 PM

    Спасибо заработало. а еще подскажите можно сделать как нибудь чтоб при залогинивании можно было использовать только имя а не полностью имя с доменом.

  35. Alex — Nov 21, 2014 at 12:26 PM

    Нужно выставить права 777 на файл /var/log/dovecot.info или же сменить владельца файла, но с правами проще.

  36. Игорь — Nov 21, 2014 at 12:20 PM

    при отправки письма самому себе выходит такая ошибка
    dovecot: lda: Fatal: Can't open log file /var/log/dovecot.info: Permission denied
    postfix/pipe[11476]: 10A5B2102011: to=, relay=dovecot, delay=0.11, delays=0.04/0/0/0.07, dsn=4.3.0, status=deferred (temporary failure. Command output: Can't open log file /var/log/dovecot.info: Permission denied )

  37. user — Nov 14, 2014 at 08:33 PM

    Спасибо, Дмитрий Владимирович, regexp прекрасно справился.

  38. Дмитрий Владимирович — Nov 14, 2014 at 02:56 PM

    User, это не есть гуд, скрывать информацию из заголовка. Это есть -- нормальная практика и внесение изменений в заголовок нарушает требования RFC и кошерность почтового сервера)

    В целом, ничего стремного в том, что вы засветили серый адрес Вашей сети нет, наоборот -- Вы сможете быстро отреагировать если у Вас появился зомби-бот рассылающий гигабайты спама.

    С другой стороны, если уж Вам очень уж нужно скрыть часть информации из заголовков, то попробуйте
    smtpd_sasl_authenticated_header = no
    или "погуглите" на предмет внесения исправлений в заголовок с помощью regexp (например, как описано тут -- http://www.opennet.ru/tips/info/2402.shtml)

  39. user — Nov 13, 2014 at 08:16 PM

    Received: from [192.168.1.123] (testdomain.com [214.178.55.44])
    by testdomain.com (Postfix) with ESMTPSA id C8611185128
    for ; Thu, 13 Nov 2014 19:00:23 +0200 (EET)

    Принимающая сторона видит IP адрес (192.168.1.123) из которого высылалось письмо. Как скрыть IP посылающего письмо, есть идиеи?

  40. Игорь — Nov 13, 2014 at 01:32 PM

    все нашел и поправил

  41. Alex — Nov 13, 2014 at 01:30 PM

    Host для Mysql вместо localhost указывайте 127.0.0.1 во всех конфигах, хоть логического объяснения такому повороту я найти не могу, но оно помогает в этой ситуации.

  42. Игорь — Nov 13, 2014 at 12:45 PM

    выдает вместо 1 вот такую ошибку когда запускаю команду postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    postmap: warning: connect to mysql server localhost: Access denied for user 'postfixadmin'@'localhost' (using password: YES)
    postmap: fatal: table mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf: query error: Success

  43. Rafael — Nov 05, 2014 at 06:43 PM

    Для начала, это вам большое спасибо!
    Так грамотно и досконально вы описали процесс установки почтового сервера. Это такая редкость среди кучи хлама, завалившего интернет.

  44. Дмитрий Владимирович — Nov 03, 2014 at 03:05 PM

    Rafael, спасибо за ссылку.

    Действительно, начиная с 2.1 плагин autocreate уже стал deprecated. С другой стороны я добавил auto=subscribe для всех папок в файле 15-mailboxes.conf, но ничего "не взлетело" -- папки не создались автоматически для нового пользователя. Да и такого предупреждения я не вижу в лог-файлах службы MDA. Будет время, развберусь более детально.

    Еще раз спасибо.

  45. Дмитрий Владимирович — Nov 03, 2014 at 11:58 AM

    Alex, спасибо)

    нашел то место где именно была ошибка. Было дело... было) Один сервер был настроен на plain и MD5-CRYPT, а второй исключительно на CRAM-MD5. Вот и закралась ошибка из микса двух конфигов с двух серверов.

  46. Rafael — Nov 01, 2014 at 08:56 AM

    Проверил несколько раз. Все равно выходит эта ошибка
    dovecot: lda(admin@examle.ru): Warning: autocreate plugin is deprecated, use mailbox
    Вот здесь есть на эту тему
    http://wiki2.dovecot.org/Plugins/Autocreate
    Пришлось убрать autocreate

  47. Alex — Oct 30, 2014 at 01:05 PM

    Дмитрий Владимирович, перечитайте внимательно ещё раз мое сообщение выше)

  48. Дмитрий Владимирович — Oct 30, 2014 at 12:08 PM

    Rafael, а Вы часом в autocreate не прописали стандартную папку какую-нить, например INBOX? Эти папки создаются автоматически на уровне mailbox и их не нужно создавать плагином autocreate.
    Спасибою

  49. Дмитрий Владимирович — Oct 30, 2014 at 12:04 PM

    Alex, в гайде аккурат и указан MD5-CRYPT)

  50. Alex — Oct 29, 2014 at 04:42 PM

    Нашел ошибку в гайде, при редактировании файла /etc/dovecot/dovecot-sql.conf.ext в параметре default_pass_scheme нужно указывать CRAM-MD5 а не MD5-CRYPT иначе не будет логиниться через pop3

  51. Rafael — Oct 19, 2014 at 02:22 PM

    Postfix 2.12

    Dovecot 2.2.14

    Получаю такую ошибку:

    postfix Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    пока не исправил во всех файлах /etc/postfix/mysql-*.cf
    c
    hosts = localhost
    на
    hosts = 127.0.0.1
    и еще...
    в журнале получаю такое сообщение:
    dovecot: lda(admin@examle.ru): Warning: autocreate plugin is deprecated, use mailbox

  52. Alex — Oct 03, 2014 at 09:37 PM

    Разобрался, провайдер видимо блочит 25-й порт, для прослушки SMTP на нестандартном порту в /etc/postfix/master.cf добавляем строку

    BindIP:BindPort inet n - n - - smtpd

    где BindIP - IP адрес сервера
    BindPort - наш нестандартный порт

  53. Alex — Oct 03, 2014 at 04:41 PM

    Что-то не могу понять как настроить почтовую программу (тот же BAT) для отправки писем, какой порт и данные, все перепробовал, работает только получение через BAT

  54. user — Jul 09, 2014 at 05:33 PM

    Следует добавить:
    sudo apt-get install postfix-mysql

    Иначе:
    sudo postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
    Postfix error: fatal: unsupported dictionary type: mysql

  • 1
Разрешённые теги: <b><i><br>