Home » Linux » CentOS » Настройка postfix + dovecot + mysql база + postfixadmin + roundcube + dkim на CentOS 7

Настройка postfix + dovecot + mysql база + postfixadmin + roundcube + dkim на CentOS 7

Некоторое время назад я рассказывал, как настроить почтовый сервер на базе готовой сборки iredmail. Я подробно разобрал все актуальные вопросы почтового сервера на linux на базе postfix. Сейчас хочу настроить похожий функционал, но с нуля, за основу взяв postfix + dovecot. Я расскажу про установку и настройку postfix на centos 7, причем только тех модулей и дополнений, которые сам считаю нужными и полезными на почтовом сервере.

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужно пройти .

Данная статья является частью единого цикла статьей про сервер Centos.

Введение

Я буду настраивать почтовый сервер на ОС linux, а точнее на CentOS 7. За основу будет взят postfix, который присутствует в этой системе из коробки. Инструкция получится универсальной, можно использовать и для других дистрибутивов. Все основные конфиги легко переносятся на разные системы, требуя минимальной правки, в основном путей.

Я напишу статью на самом что ни на есть реальном примере, без какой-либо правки доменов, ip и прочего, чтобы не ошибиться и показать максимально возможный реальный пример. У меня есть технический домен zeroxzed.ru. Я буду использовать его в своей работе. Почтовый сервер будет иметь имя mail.zeroxzed.ru. Всю теорию по подготовке dns к установке и настройке почтового сервера я рассказывал в предыдущей статье о почтовом сервере. Не хочу здесь повторяться. Уточню только список действий, которые вам нужно проделать c ДНС:

  1. Создаем A запись в DNS — mail.zeroxzed.ru.
  2. Добавляем или редактируем MX запись, указывая в качестве почтового сервера mail.zeroxzed.ru.
  3. Просим провайдера прописать PTR для внешнего ip адреса, который будет использовать почтовый сервер. В качестве ptr записи просим установить имя нашего сервера — mail.zeroxzed.ru.

Настройка dns записей для почтового сервера

Я предпочитаю в качестве dns хостинга использовать сервера яндекса, даже если не прикрепляю его почту к домену. На картинке показан минимально необходимый набор записей, кроме PTR. Этими записями управляете не вы, а провайдер, который вам выдает ip. Пока с днс все. Позже мы вернемся к этому вопросу, когда будем добавлять dkim и spf записи. Но обо всем по порядку.

Подготовим систему centos к установке и настройке почтового сервера postfix. Если у вас еще нет готовой системы, то рекомендую воспользоваться моими статьями по установке и настройке centos. Отдельно потратьте время на настройку iptables. Я не буду касаться этого вопроса в данной статье, чтобы не раздувать ее второстепенными вещами. Удобнее, когда все по отдельности рассказано и описано с должной глубиной. Сваливать все в одну кучу не хочется.

По вступлению вроде все, основное рассказал. Приступим к настройке нашего почтового сервера.

Сразу хочу сделать предупреждение. Настройка почтового сервера достаточно трудоемкий процесс, требует определенных навыков, знаний и понимания принципов работы используемых средств. Я не ставлю для себя цель расписать максимально подробно так, чтобы было понятно даже неподготовленному администратору linux. Вы должны быть так или иначе подготовлены, либо запаситесь терпением и разбирайтесь внимательно сами в нюансах. Эта статья на полный копипаст не подходит, что-то остается за кадром для самостоятельного выполнения. Иначе нельзя, получится очень большой и громоздкий материал.

Установка postfixadmin

Начнем с установки и настройки панели управления почтовым сервером postfix — postfixadmin. Без него начинать что-то делать неудобно, так как управлять пользователями, ящиками, алиасами будет нечем. По своей сути postfixadmin — набор php скриптов для управления записями в mysql базе данных, которую использует сервер postfix во время своей работы. Соответственно, для работы postfixadmin нам нужен web сервер. Подробно о настройке web сервера на centos читайте отдельно. Сейчас же мы быстро установим все необходимое. Привожу только команды, без комментариев. Все подробности по приведенной выше ссылке.

# yum install httpd php phpmyadmin mariadb mariadb-server php-imap

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

Запускаем httpd и mariadb и добавляем их в автозагрузку.

# systemctl start httpd
# systemctl enable httpd
# systemctl start mariadb
# systemctl enable mariadb

Задаем пароль root для mysql.

# /usr/bin/mysql_secure_installation

Проверяем работу web сервера. Заходим по ip адресу сервера — http://188.35.19.125/, а также проверяем работу phpmyadmin — http://188.35.19.125/phpmyadmin/. Его нужно настроить, об этом рассказано в статье, которую я привел чуть выше. По-умолчанию в phpmyadmin доступ закрыт. Если все сделали правильно, то увидите примерно следующее.

Вход в phpmyadmin

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

Веб сервер готов, продолжаем настройку почтового сервера. Скачиваем последнюю версию postfixadmin.

# cd /usr/src
# wget https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.0.2/postfixadmin-3.0.2.tar.gz
Скорее всего во время вашей установки версия postfixadmin изменится и ссылка может быть неактуальной. Но даже если она будет актуальна, возможно выйдет более новая версия. Проверьте ее по ссылке https://sourceforge.net/projects/postfixadmin/ и скачайте самую свежую версию.

Распаковываем архив и копируем в директорию веб сервера.

# tar -xvzf postfixadmin-*
# mv /usr/src/postfixadmin-3.0.2 /var/www/html/postfixadmin

Назначаем владельцем пользователя веб сервера:

# chown -R apache. /var/www/html/postfixadmin/

Дальше редактируем конфигурационный файл postfixadmin.

# mcedit /var/www/html/postfixadmin/config.inc.php

Приводим параметры к следующему виду:

$CONF['configured'] = true;
$CONF['default_language'] = 'ru';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = '12345678';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'root@zeroxzed.ru';
$CONF['encrypt'] = 'md5crypt';
$CONF['default_aliases'] = array (
 'abuse' => 'root',
 'hostmaster' => 'root',
 'postmaster' => 'root',
 'webmaster' => 'root'
);
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';

Обращаю внимание на выделенный параметр. Он указывает на то, в каком виде хранить пароли пользователей в базе данных. Конечно, хранить обычным текстом без шифрования это дурной тон и может быть опасно. Я указал хранение в шифрованном виде. Но если мы говорим о небольшой компании без публичного доступа к серверу, можно использовать нешифрованные пароли. Для этого указываем значение параметра cleartext. Я сам так часто делаю просто из соображений удобства. Объясню, в чем удобство.

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

У меня распространены ситуации, когда я удаленно администрирую сервера, а на месте эникеи работают с пользователями. Чаще всего это не очень аккуратные и ответственные люди, иначе они бы работали с серверами :) Они часто забывают записать пароль, путают что-то и т.д. В итоге, когда один человек увольняется и приходит другой, оказывается, что найти пароли на некоторые ящики просто невозможно. Тут очень выручает возможность посмотреть пароль в базе. Я новому админу либо пароль говорю, либо весь дамп сразу отдаю, пусть работает.

Если вы сами работаете с сервером и все аккуратно ведете, записываете, например, в keepass все пароли от почтовых ящиков, то смело шифруйте все пароли, так будет спокойнее.

Последние 2 параметра domain_path и domain_in_mailbox указывайте по своему усмотрению. В файле конфигурации в комментариях расписано, за что они отвечают и в чем отличие. Мне кажется, удобно хранить директории именно в таком виде, как я указал. Получится следующий путь до ящика, если у вас архив почты будет жить, к примеру, в директории /mnt/mail/mnt/mail/zeroxzed.ru/root@zeroxzed.ru.

С параметрами разобрались. Сохраняем конфиг. Идем по адресу http://188.35.19.125/postfixadmin/setup.php и начинаем установку postfixadmin. Первым делом идет проверка всех необходимых для установки и работы компонентов. Для продолжения установки у вас должна быть такая картинка.

Установка postfixadmin

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

Добавление пароля установки

Добавляем полученную строку в файл конфигурации postfixadmin.

# mcedit /var/www/html/postfixadmin/config.inc.php
$CONF['setup_password'] = '67e46bdcc7aeb431f7af9a6d02f43352:30672e5a9deacaf505d32807b967caf9fd0c32ef';

Используя этот пароль, можно создать учетную запись администратора панели управления. Делаем это, учитывая, что пароль должен содержать не менее двух цифр. Если все сделали правильно, то увидите сообщение.

Добавление администратора postfixadmin

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

Главная страница postfixadmin

Теперь нам нужно добавить домен в панель управления. Идем в раздел Список доменов -> Новый домен и добавляем свой домен.

Создание нового домена

При создании домена были добавлены стандартные алиасы, получателя для которых мы указали еще в конфиге — ящик root@zeroxzed.ru. Создание таких алиасов требование стандартов, но по факту, кроме спама, вы скорее всего ничего не будете получать по этим адресам. Так что их создание оставляйте на свое усмотрения. Я обычно их не делаю, так как ящик для этих алиасов все равно не читаю.

Далее создадим почтовый ящик администратора — root@zeroxzed.ru. Для этого идем в раздел Обзор -> Создать ящик и заполняем поля.

Добавление почтового ящика

Непосредственно ящик на диске создан не будет, так как у нас еще не настроена почтовая система, но запись в базе данных появится. Это можно проверить через phpmyadmin.

Проверка нового ящика в mysql базе

Как мы видим, пароль указан в зашифрованном виде. На этом установку и настройку postfixadmin завершаем. Интерфейс для управления почтовым сервером мы подготовили. Теперь можно заняться непосредственно настройкой postfix.

Настройка postfix

Сердце нашего почтового сервера на linux — postfix. В дистрибутиве centos он уже установлен, можно сразу переходить к настройке. Рисуем следующий конфиг.

# mcedit /etc/postfix/main.cf
soft_bounce = no
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix

myhostname = mail.zeroxzed.ru
mydomain = zeroxzed.ru
myorigin = $myhostname

inet_interfaces = all
inet_protocols = ipv4

mydestination = localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

smtpd_banner = $myhostname ESMTP $mail_name

debug_peer_level = 2
# Строки с PATH и ddd должны быть с отступом в виде табуляции от начала строки
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf,
 mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf

smtpd_discard_ehlo_keywords = etrn, silent-discard
smtpd_forbidden_commands = CONNECT GET POST
broken_sasl_auth_clients = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
disable_vrfy_command = yes

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_sender_restrictions = permit_mynetworks,
 permit_sasl_authenticated,
 reject_non_fqdn_sender,
 reject_unknown_sender_domain

smtpd_recipient_restrictions = reject_non_fqdn_recipient,
 reject_unknown_recipient_domain,
 reject_multi_recipient_bounce,
 permit_mynetworks,
 permit_sasl_authenticated,
 reject_unauth_destination,

smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
smtpd_tls_key_file = /etc/postfix/certs/key.pem
smtpd_tls_cert_file = /etc/postfix/certs/cert.pem
tls_random_source = dev:/dev/urandom

# Ограничение максимального размера письма в байтах
message_size_limit = 20000000
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 15
smtpd_error_sleep_time = 20
anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 20
smtpd_client_connection_rate_limit = 30
smtpd_client_message_rate_limit = 30
smtpd_client_event_limit_exceptions = 127.0.0.0/8
smtpd_client_connection_limit_exceptions = 127.0.0.0/8

maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d

smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth

# Директория для хранения почты
virtual_mailbox_base = /mnt/mail
virtual_minimum_uid = 1000
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps

Я выделил жирным имя домена и путь для директории с почтовыми ящиками. Не забудьте поменять эти параметры на свои. Сохраняем конфиг и продолжаем настройку. В таком виде сервер еще не готов. Нужно теперь создать все то, что описано в файле конфигурации. Создаем папку для файлов с конфигурацией подключения к mysql и сами файлы подключения.

# mkdir /etc/postfix/mysql && cd /etc/postfix/mysql
# mcedit relay_domains.cf

hosts = localhost
user = postfix
password = 12345678
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
# mcedit  virtual_alias_domain_maps.cf

hosts = localhost
user = postfix
password = 12345678
dbname = postfix
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
# mcedit virtual_alias_maps.cf

hosts = localhost
user = postfix
password = 12345678
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
# mcedit virtual_mailbox_domains.cf
hosts = localhost
user = postfix
password = 12345678
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
# mcedit virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = 12345678
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

Редактируем файл /etc/postfix/master.cf. Нам надо добавить строки, касающиеся настройки Submission для того, чтобы почтовый сервер работал на 587 порту. Смартфоны очень часто при настройке используют этот порт по-умолчанию, где-то даже без возможности изменить эту настройку. Приводим секцию, отвечающую за эту работу к следующему виду.

submission inet n - n - - smtpd
 -o syslog_name=postfix/submission
 -o smtpd_tls_wrappermode=no
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
 -o milter_macro_daemon_name=ORIGINATING

Обращаю внимание на пробел в начале строки, начиная со второй. Его надо обязательно оставить. Добавляем еще настройки для того, чтобы наш сервер поддерживал протокол SSL/TLS и слушал порт 465

smtps inet n - n - - smtpd
 -o syslog_name=postfix/smtps
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
 -o milter_macro_daemon_name=ORIGINATING

В этот же файл добавляем еще одну настройку, которая будет указывать postfix, что доставкой почты у нас будет заниматься dovecot, который мы настроим следом. Добавляем в master.cf в самый конец.

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

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

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

# mkdir /etc/postfix/certs
# openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/cert.pem -keyout /etc/postfix/certs/key.pem

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

Создание ssl сертификата для postfix

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

# mcedit /etc/postfix/recipient_bcc_maps
@zeroxzed.ru all_in@zeroxzed.ru
# mcedit /etc/postfix/sender_bcc_maps
@zeroxzed.ru all_out@zeroxzed.ru

Создаем индексированные базы данных из этих файлов. Это нужно делать каждый раз, после изменения.

# postmap /etc/postfix/recipient_bcc_maps /etc/postfix/sender_bcc_maps

Теперь создайте два почтовых ящика all_in@zeroxzed.ru и all_out@zeroxzed.ru через postfixadmin.

Немного поясню по этим ящикам — для чего они нужны. Изначально я их делал, когда пользователи использовали протокол pop3 без сохранения писем на сервере. Это позволяло организовать бэкап всей переписки. Эти ящики очень быстро заполняются и занимают огромный объем, поэтому их обязательно надо чистить. Я просто скриптами регулярно собирал всю почту в архивы с именами в виде дат. Если нужно было какое-то письмо найти, то просто распаковывал нужный архив.

В случае с imap роль бэкапа отпадает, так как вся почта хранится на сервере. Но эти ящики все равно бывают полезны, когда пользователь, к примеру, удалил какое-то важное письмо и потом делает вид, что его и не было. Если это письмо пришло только сегодня и еще не успело улететь в бэкап, то кроме записи в логах об этом письме, вы не увидите само содержимое. А с такими ящиками все сразу будет понятно, и вопросы отпадут. Последнее применение — служба безопасности. Если у вас есть кто-то, кому положено читать всю переписку, то реализовать этот функционал можно таким простым способом.

Все основные настройки для postfix мы сделали. Некоторые из них завязаны на работу с dovecot, который мы еще не настроили. Поэтому больше postfix не трогаем, не перезапускаем. Идем настраивать dovecot — imap сервер нашей почтовой системы.

Настройка dovecot

Займемся настройкой dovecot — сервер доставки почты пользователю по протоколам pop3 и imap. Я не вижу причин использовать pop3. Он неудобен по сравнению с imap. Чаще всего pop3 отключаю вовсе. Но это уже на ваше усмотрение. Приведу пример с настройкой обоих протоколов. Помимо основного функционала по доставке почты, я настрою несколько полезных плагинов. Расскажу о них поподробнее:

  • Sieve — выполняет фильтрацию почты по заданным правилам в момент локальной доставки на почтовом сервере. Удобство такого подхода в том, что вы один раз можете настроить правило сортировки, и оно будет работать во всех клиентах, которыми вы будете получать почту по imap. Правила создаются, хранятся и исполняются на самом сервере.
  • Acl — позволяет пользователям расшаривать папки в своем почтовом ящике и предоставлять доступ к этим папкам другим пользователям. Не часто видел, чтобы этот функционал настраивали и использовали. Думаю, просто по незнанию. По мне так очень удобный и полезный функционал.

Часто вижу, что люди настраивают плагин quota, который позволяет ограничивать максимальный размер почтового ящика. Я лично в своей работе его не использую. Возможно, когда у тебя клиентов сотни и тысячи это имеет значение и надо обязательно настроить ограничение. Когда же ящиков меньше, нет смысла напрягать людей постоянной чисткой. Сейчас диски стоят не так дорого. Мне кажется, проще и дешевле увеличить место на сервере, нежели постоянно беспокоить пользователей необходимостью чистки ящика. Лучше ограничить максимальный размер письма, скажем 20-ю мегабайтами. Тогда сильно забить ящик даже при большом желании быстро не получится. А почта все-таки важный инструмент в работе. Мне кажется, ее лучше хранить как можно дольше.

Есть еще один полезный плагин expire, который позволяет удалять устаревшие письма в определенных папках. Например, удалять все письма старше 30-ти дней в корзине и папке со спамом. Но реально пользоваться им не получается по простой причине. Разные почтовые клиенты создают различные папки для корзины и спама. Thunderbird создает папки с латинскими именами trash и spam, outlook с русскими, которые на почтовом сервере преобразуются в кодировку UTF7, мобильные клиенты тоже используют разные имена папок. В итоге нет единообразия, плагин полноценно не работает.

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

Небольшую теорию я дал, теперь переходим к практике. Устанавливаем необходимые для dovecot пакеты.

# yum install dovecot dovecot-mysql dovecot-pigeonhole

Изначально конфиг dovecot разбит на отдельные сегменты и лежат в директории /etc/dovecot/conf.d. Каждый файл — отдельный функционал. Мне не нравится прыгать по файлам, поэтому я храню все в едином общем файле конфигурации /etc/dovecot/dovecot.conf. С ним мы и будем работать. Приводим его к следующему виду.

# mcedit /etc/dovecot/dovecot.conf
listen = * [::]

mail_plugins = mailbox_alias acl

protocols = imap pop3 sieve lmtp

mail_uid = 1000
mail_gid = 1000

first_valid_uid = 1000
last_valid_uid = 1000

log_path = /var/log/dovecot/main.log
info_log_path = /var/log/dovecot/info.log
debug_log_path = /var/log/dovecot/debug.log

ssl_protocols = !SSLv2 !SSLv3
ssl = required
verbose_ssl = no
ssl_cert = </etc/postfix/certs/cert.pem
ssl_key = </etc/postfix/certs/key.pem

ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_dh_parameters_length = 2048
ssl_prefer_server_ciphers = yes

disable_plaintext_auth = yes

mail_location = maildir:/mnt/mail/%d/%u/

auth_default_realm = zeroxzed.ru

auth_mechanisms = PLAIN LOGIN

service auth {
 unix_listener /var/spool/postfix/private/dovecot-auth {
 user = postfix
 group = postfix
 mode = 0666
 }
unix_listener auth-master {
 user = vmail
 group = vmail
 mode = 0666
 }

unix_listener auth-userdb {
 user = vmail
 group = vmail
 mode = 0660
 }
}

service lmtp {
 unix_listener /var/spool/postfix/private/dovecot-lmtp {
 user = postfix
 group = postfix
 mode = 0600
 }

 inet_listener lmtp {
 address = 127.0.0.1
 port = 24
 }
}

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

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

auth_master_user_separator = *
 
plugin {
 auth_socket_path = /var/run/dovecot/auth-master

 acl = vfile
 acl_shared_dict = file:/mnt/mail/shared-folders/shared-mailboxes.db
 sieve = /mnt/mail/sieve/%u.sieve
 mailbox_alias_old = Sent
 mailbox_alias_new = Sent Messages
 mailbox_alias_old2 = Sent
 mailbox_alias_new2 = Sent Items
}

protocol lda {
 mail_plugins = $mail_plugins sieve
 auth_socket_path = /var/run/dovecot/auth-master
 deliver_log_format = mail from %f: msgid=%m %$
 log_path = /var/log/dovecot/lda-errors.log
 info_log_path = /var/log/dovecot/lda-deliver.log
 lda_mailbox_autocreate = yes
 lda_mailbox_autosubscribe = yes
 postmaster_address = root
}

protocol lmtp {
 info_log_path = /var/log/dovecot/lmtp.log
 mail_plugins = quota sieve
 postmaster_address = postmaster
 lmtp_save_to_detail_mailbox = yes
 recipient_delimiter = +
}

protocol imap {
 mail_plugins = $mail_plugins imap_acl
 imap_client_workarounds = tb-extra-mailbox-sep
 mail_max_userip_connections = 30
}

protocol pop3 {
 mail_plugins = $mail_plugins
 pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
 pop3_uidl_format = %08Xu%08Xv
 mail_max_userip_connections = 30
}

service imap-login {
 service_count = 1
 process_limit = 500
 }

service pop3-login {
 service_count = 1
 }

service managesieve-login {
 inet_listener sieve {
 port = 4190
 }
}

namespace {
 type = private
 separator = /
 prefix =
 inbox = yes

 mailbox Sent {
 auto = subscribe
 special_use = \Sent
 }
 mailbox "Sent Messages" {
 auto = no
 special_use = \Sent
 }
 mailbox "Sent Items" {
 auto = no
 special_use = \Sent
 }
 mailbox Drafts {
 auto = subscribe
 special_use = \Drafts
 }
 mailbox Trash {
 auto = subscribe
 special_use = \Trash
 }
 mailbox "Deleted Messages" {
 auto = no
 special_use = \Trash
 }
 mailbox Junk {
 auto = subscribe
 special_use = \Junk
 }
 mailbox Spam {
 auto = no
 special_use = \Junk
 }
 mailbox "Junk E-mail" {
 auto = no
 special_use = \Junk
 }
 mailbox Archive {
 auto = no
 special_use = \Archive
 }
 mailbox Archives {
 auto = no
 special_use = \Archive
 }
}

namespace {
 type = shared
 separator = /
 prefix = Shared/%%u/
 location = maildir:%%h:INDEX=%h/shared/%%u
 subscriptions = yes
 list = children
}

Создаем группу и пользователя с указанными в конфиге uid 1000.

# groupadd  -g 1000 vmail
# useradd -d /mnt/mail/ -g 1000 -u 1000 vmail
# chown vmail. /mnt/mail

Создаем конфигурационные файлы для доступа к mysql базе.

# mcedit /etc/dovecot/dovecot-mysql.conf
driver = mysql
default_pass_scheme = CRYPT
connect = host=127.0.0.1 dbname=postfix user=postfix password=12345678
user_query = SELECT '/mnt/mail/%d/%u' as home, 'maildir:/mnt/mail/%d/%u' as mail, 1000 AS uid, 1000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password, '/mnt/mail/%d/%u' as userdb_home, 'maildir:/mnt/mail/%d/%u' as userdb_mail, 1000 as userdb_uid, 1000 as userdb_gid, concat('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1'

Создадим директорию и файлы для логов.

# mkdir /var/log/dovecot
# cd /var/log/dovecot && touch main.log info.log debug.log lda-errors.log lda-deliver.log lmtp.log
# chown -R vmail:dovecot /var/log/dovecot

Создаем пару служебных папок для плагинов sieve и acl.

# mkdir /mnt/mail/sieve && mkdir /mnt/mail/shared-folders
# chown -R vmail. /mnt/mail

И небольшой штрих в завершении настройки.

# chown vmail. /var/run/dovecot/auth-master

Уже не помню, зачем это было нужно, запись осталась в черновиках. Знаю только, что какая-то ошибка всплывала без этого.

На этом основная настройка почтового сервера на базе postfix и dovecot завершена. Можно перезапускать службы и проверять работу системы.

# systemctl restart postfix
# systemctl start dovecot
# systemctl enable dovecot

Проверка работы почтового сервера

Самаый простой и быстрый способ проверить работу почтового сервера — отправить на него письмо. Я буду отправлять со своего почтового адреса zeroxzed@gmail.com на адрес root@zeroxzed.ru. Вот что должно быть в логе, если у вас все правильно настроено и почтовый сервер нормально работает.

# cat /var/log/maillog
Mar 10 21:56:27 mail postfix/smtpd[28075]: connect from mail-yw0-f172.google.com[209.85.161.172]
Mar 10 21:56:28 mail postfix/smtpd[28075]: Anonymous TLS connection established from mail-yw0-f172.google.com[209.85.161.172]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Mar 10 21:56:28 mail postfix/smtpd[28075]: D4263420BB7B: client=mail-yw0-f172.google.com[209.85.161.172]
Mar 10 21:56:29 mail postfix/cleanup[28086]: D4263420BB7B: message-id=<CAHWPLcOeqf6uNHRg34+wuppDUGPDLY=fp8s-E=o9fmxYMS48cQ@mail.gmail.com>
Mar 10 21:56:29 mail postfix/qmgr[28042]: D4263420BB7B: from=<zeroxzed@gmail.com>, size=2533, nrcpt=2 (queue active)
Mar 10 21:56:29 mail postfix/pipe[28089]: D4263420BB7B: to=<all_in@zeroxzed.ru>, relay=dovecot, delay=0.39, delays=0.33/0.02/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
Mar 10 21:56:29 mail postfix/pipe[28090]: D4263420BB7B: to=<root@zeroxzed.ru>, relay=dovecot, delay=0.4, delays=0.33/0.03/0/0.04, dsn=2.0.0, status=sent (delivered via dovecot service)
Mar 10 21:56:29 mail postfix/qmgr[28042]: D4263420BB7B: removed
Mar 10 21:56:29 mail postfix/smtpd[28075]: disconnect from mail-yw0-f172.google.com[209.85.161.172]

Пояснять тут нечего, по логу все понятно. Письмо было доставлено в указанный ящик и в общий ящик для сбора всей входящей почты. В директории /mnt/mail была создана директория с именем домена zeroxzed.ru, а в ней созданы 3 папки с именами ящиков:

  • all_in@zeroxzed.ru
  • all_out@zeroxzed.ru
  • root@zeroxzed.ru

Директории с почтовыми ящиками создаются в момент получения первого письма в ящик. Непрочитанное письмо помещается в директорию /new в почтовом ящике. После прочтения переносится в /cur.

Попробуем теперь подключиться к почтовому ящику по imap, прочитать письмо и отправить ответ. Настроим любой почтовый клиент для проверки работы настроенного почтового сервера. Я для этих целей буду использовать Thunderbird. Из всех почтовых клиентов мне он нравится больше всего. В основном из-за его портированной версии. Указываем следующие настройки.

Настройка подключения к почтовому серверу

Так как мы используем самоподписанный сертификат ssl, почтовый клиент предупредит нас о том, что серверу нельзя доверять.

Добавление ssl сертификата в исключения

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

Я подключился к почтовому ящику и увидел тестовые письма. Отвечу на одно из них и посмотрю в логе, как прошла отправка. У меня еще раз выскочило окно с предупреждением о небезопасном сертификате. Еще раз добавляю его в исключения. Это нормально, сертификат проверяется во время получения почты в dovecot, а во время отправки в postfix. Так что нужны 2 подтверждения. Отправляю письмо еще раз и смотрю лог.

# cat /var/log/maillog
Mar 10 22:10:12 mail postfix/smtpd[28764]: connect from broadband-75-37-235-139.moscow.gw.ru[75.37.235.139]
Mar 10 22:10:12 mail postfix/smtpd[28764]: Anonymous TLS connection established from broadband-75-37-235-139.moscow.gw.ru[75.37.235.139]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Mar 10 22:10:12 mail postfix/smtpd[28764]: B24C2420BB70: client=broadband-75-37-235-139.moscow.gw.ru[75.37.235.139], sasl_method=PLAIN, sasl_username=root@zeroxzed.ru
Mar 10 22:10:12 mail postfix/cleanup[28779]: B24C2420BB70: message-id=<aaac96c3-197e-c6bd-4dfe-85d09bce216a@zeroxzed.ru>
Mar 10 22:10:12 mail postfix/qmgr[28042]: B24C2420BB70: from=<root@zeroxzed.ru>, size=955, nrcpt=2 (queue active)
Mar 10 22:10:12 mail postfix/smtpd[28764]: disconnect from broadband-75-37-235-139.moscow.gw.ru[75.37.235.139]
Mar 10 22:10:12 mail postfix/pipe[28784]: B24C2420BB70: to=<all_out@zeroxzed.ru>, relay=dovecot, delay=0.14, delays=0.07/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
Mar 10 22:10:13 mail postfix/smtp[28783]: B24C2420BB70: to=<zeroxzed@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.163.26]:25, delay=0.62, delays=0.07/0.01/0.28/0.26, dsn=2.0.0, status=sent (250 2.0.0 OK 1489173013 13si2106703ljv.3 - gsmtp)
Mar 10 22:10:13 mail postfix/qmgr[28042]: B24C2420BB70: removed

Все в порядке. Видно подключение с моего ip, успешную sasl авторизацию, формирование письма на сервере, присваивание ему message-id, отправка копии письма в ящик для сбора исходящей почты и отправка оригинала в ящик получателя. Все этапы прошли без ошибок.

Расскажу, куда еще надо смотреть для отладки почтовой системы. Да и не только отладки, во время работы периодически придется разбираться, куда ушло то или иное письмо, кто и когда подключался к ящику. Разные ситуации бывают. В файле /var/log/dovecot/lda-deliver.log содержится информация обо всех пришедших письмах — когда, от кого и в какой ящик было положено.

Mar 10 22:25:29 lda(all_in@zeroxzed.ru): Info: mail from zeroxzed@gmail.com: msgid=<CAHWPLcNG=WMOoWW2Y_Lw4qn9+V4TOrbxZpwtA=O+CSEBaiwuBg@mail.gmail.com> saved mail to INBOX
Mar 10 22:25:29 lda(root@zeroxzed.ru): Info: mail from zeroxzed@gmail.com: msgid=<CAHWPLcNG=WMOoWW2Y_Lw4qn9+V4TOrbxZpwtA=O+CSEBaiwuBg@mail.gmail.com> saved mail to INBOX
Mar 10 22:25:49 lda(all_out@zeroxzed.ru): Info: mail from root@zeroxzed.ru: msgid=<75358e4d-7c8e-24c2-a21f-7ee0df2a4704@zeroxzed.ru> saved mail to INBOX

В /var/log/dovecot/info.log информация о подключениях к почтовым ящикам — кто, когда, откуда и каким способом авторизовывался на сервере.

Mar 10 22:10:20 imap-login: Info: Login: user=<root@zeroxzed.ru>, method=PLAIN, rip=75.37.235.139, lip=188.35.19.125, mpid=28790, TLS, session=<3tDeHGVKpQBNJeCL>
Mar 10 22:19:39 imap-login: Info: Login: user=<root@zeroxzed.ru>, method=PLAIN, rip=75.37.235.139, lip=188.35.19.125, mpid=29248, TLS, session=<7VY8PmVKbwBNJeCL>

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

На текущий момент сервер полностью работоспособен. В таком виде им без проблем можно пользоваться. Но функционал полностью не раскрыт. Использовать плагины sieve и acl через удаленные почтовые клиенты неудобно. Проще всего их настроить через web почту roundcube. Установим эту web панель на наш почтовый сервер.

Установка web интерфейса roundcube

Установим и настроим самый популярный web интерфейс для postfix — roundcube. Скачиваем исходники.

# cd /usr/src
# wget https://github.com/roundcube/roundcubemail/releases/download/1.2.9/roundcubemail-1.2.3-complete.tar.gz
Не забудьте проверить в момент установки, какая версия является самой свежей на текущий момент. Нет необходимости устанавливать устаревшую версию. Рекомендую ставить самую последнюю на момент настройки.
# yum install php-pear php-mcrypt php-intl php-ldap php-pear-Net-SMTP php-pear-Net-IDNA2 php-pear-Mail-Mime php-pear-Net-Sieve
# tar -xzvf roundcubemail-*
# mv roundcubemail-1.2.9 /var/www/html/webmail
# chown -R apache. /var/www/html/webmail

Переходим в браузер по следующей ссылке для установки roundcube — http://188.35.19.125/webmail/installer/. Вы увидите несколько незначительных замечаний. На них можно не обращать внимание, если установщик позволяет нажать кнопку NEXT. Единственное, рекомендую установить правильный часовой пояс в /etc/php.ini и перезапустить после этого httpd.

На следующем этапе нам надо указать настройки подключения к mysql базе. Предварительно ее следует создать через phpmyadmin. Я создал пользователя roundcube и такую же базу с полными правами пользователя на нее. Эти параметры указал в настройках.

Установка roundcube

Так же на этой странице нужно будет указать несколько параметров:

  • smtp_server — пусто (ничего не пишем)
  • language — ru_RU
  • Выбираем плагины — managesieve, userinfo, acl. Остальные на свое усмотрение.

Жмем CREATE CONFIG. Должны увидеть сообщение:

The config file was saved successfully into RCMAIL_CONFIG_DIR directory of your Roundcube installation.

Жмем CONTINUE. Открывается страница с проверкой настроек. Тут проверять неудобно, можно этого не делать. Зайдем в почтовый ящик и там все проверим. Если что, конфиг потом все равно можно вручную отредактировать. Папку /var/www/html/webmail/installer удаляем. Заходим в почтовый ящик через roundcube — http://188.35.19.125/webmail/ Набирать нужно полное имя ящика и пароль. Если все сделали правильно, должны попасть в свой почтовый ящик.

Вход в почтовый ящик через roundcube

Ну вот и все. Можно пользоваться web интерфейсом для почтового сервера. У меня есть статья по настройке мобильной версии roundcube. Рекомендую ее настроить, если есть необходимость. Тема качественная и добротная. Пользоваться удобно.

Дальше рассмотрим настройку и использование плагинов acl и sieve с помощью roundcube.

Настройка фильтра почты sieve

Sieve очень удобная штука, но вот хорошего интерфейса для управления через почтовый клиент я не знаю. Существует плагин для thunderbird, который так и называется sieve. Но лично мне он не понравился вообще, так как предлагает писать правила определенным кодом. Для этого надо знать синтаксис, тратить время. Можете сами на него посмотреть — https://github.com/thsmi/sieve.

К счастью, есть удобный способ писать правила фильтрации для sieve через roundcube. Там это реализовано отдельным плагином managesieve, который мы активировали во время установки. Для создания правила фильтрации, зайдите в свой почтовый ящик через roundcube. Переходите в раздел Настройки -> Фильтры и создавайте новое правило.

Настройка фильтра почты в roundcube

После этого письма будут обрабатываться правилом сразу после поступления в почтовый сервер, в независимости от вашего подключения к ящику. В папке /mnt/mail/sieve появилась запись с настроенным правилом. Можете познакомиться с синтаксисом написания правил. Он не сложный.

Настройка автоответчика

В roundcube есть замечательная возможность настроить автоответчик в почтовом ящике. Это актуально, к примеру, если вы уходите в отпуск. Вы можете сами настроить автоответчик, который будет отправлять письмо с указанной вами информацией всем, от кого будут приходить письма в ваш ящик. Возможность эта реализована на базе того же плагина managesieve. По-умолчанию она отключена. Активировать ее нужно вручную.

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

# mcedit /var/www/html/webmail/plugins/managesieve/config.inc.php

Изменяем там параметр:

$config['managesieve_vacation'] = 1;

После этого достаточно просто обновить веб интерфейс roundcube, и появятся новые настройки по адресу Настройки -> Отпуск

Настройка автоответчика

На вкладке Дополнительные настройки есть возможность настроить различные полезные действия, в том числе пересылку входящей почты вашему заместителю.

Общие папки по imap

Рассмотрим настройку необычного и полезного функционала в виде общих папок. С их помощью один пользователь почтового ящика может предоставить другому пользователю доступ к папке внутри своего почтового ящика. Где и как использовать этот функционал, каждый может придумать сам, в зависимости от своих потребностей. Мне кажется это удобным в том случае, когда создан какой-то общий ящик, на который только поступает информация и нет необходимости писать ответ от его имени. То есть по сути работает как обычный почтовый алиас. Но в случае с алиасом и несколькими почтовыми ящиками, письмо падает в каждый ящик. Если таких писем и получателей много, то идет большое дублирование одного и того же письма в рамках почтового сервера. Если сделать ящик и расшарить на нем папку, подключить ее всем пользователям, то дублирования почты не будет. Каждый сможет прочитать письмо, без необходимости его доставки в каждый конкретный ящик.

Настроим общую папку imap. Хотя настраивать нам, по сути, нечего. Мы уже все настроили ранее. Добавили соответствующие настройки в dovecot и активировали плагин acl в roundcube. Теперь нужно просто сделать папку и открыть ее для другого пользователя. Для этого идем в раздел Настройки -> Папки. Создаем там любую папку. В моем случае это папка с названием Общая.

Настройка общей папки imap

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

  • чтение
  • запись
  • удаление

Права доступа на общую папку imap

Заходим в ящик, которому добавили общий доступ и проверяем.

Проверка общей папки

Все в порядке, общая папка imap настроена и подключена. В папке /mnt/mail/shared-folders появился файл с настроенным выше правилом.

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

Настройка dkim и spf

Напишу своими словами как я понимаю работу dkim. С помощью dkim вся исходящая почта сервера подписывается электронной цифровой подписью, связанной с именем домена. Открытый ключ шифрования с помощью DNS публикуется в txt записи. Таким образом, удаленный сервер, при получении письма от вас, сравнивает цифровую подпись с опубликованным в dns открытым ключом вашего домена. Если все в порядке, то считает, что ваше письмо в самом деле пришло от вас, а не от мошенников. То есть с помощью этой технологии можно однозначно идентифицировать отправителя.

Некоторые считают, что эта технология помогает бороться со спамом. Не знаю, насколько это верно. Спамеру не составит большого труда настроить на своем сервере dkim и отправлять спам, но подписанный электронной цифровой подписью. Теоретически, dkim помогает защититься от подделки адреса отправителя, когда письмо якобы от вас шлет совсем другой сервер. Но с этим можно бороться и другими способами. В общем, я до конца не понимаю, зачем это надо. Прошу поделиться в комментариях тем, к кого есть бОльший опыт. Я только недавно стал шагать в ногу со временем и настраивать dkim. Раньше всегда без него обходился.

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

Для настройки dkim устанавливаем соответствующий пакет:

# yum install opendkim

Создаем директорию для хранения ключей:

# mkdir -p /etc/postfix/dkim && cd /etc/postfix/dkim

Генерируем ключи для домена:

# opendkim-genkey -D /etc/postfix/dkim/ -d zeroxzed.ru -s mail
zeroxzed.ruимя почтового домена
mailнепосредственно имя сервера

На выходе получаете пару файлов — закрытый (приватный) и открытый ключ. Закрытый останется на сервере, открытый будет опубликован в dns. Переименуем их сразу, чтобы не путаться, если у вас будет несколько доменов. Ключи нужно будет делать для каждого домена.

# mv mail.private mail.zeroxzed.ru.private
# mv mail.txt mail.zeroxzed.ru.txt

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

# mcedit keytable
mail._domainkey.zeroxzed.ru zeroxzed.ru:mail:/etc/postfix/dkim/mail.zeroxzed.ru.private

Тут же создаем еще один файл, в котором будет описано, каким ключом подписывать письма каждого домена. У нас один домен, поэтому только одна запись.

# mcedit signingtable
*@zeroxzed.ru mail._domainkey.zeroxzed.ru

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

# chown root:opendkim *
# chmod u=rw,g=r,o= *

Рисуем конфиг службы.

# mcedit /etc/opendkim.conf
AutoRestart Yes
AutoRestartRate 10/1h
PidFile /var/run/opendkim/opendkim.pid
Mode sv
Syslog yes
SyslogSuccess yes
LogWhy yes
UserID opendkim:opendkim
Socket inet:8891@localhost
Umask 022
Canonicalization relaxed/relaxed
Selector default
MinimumKeyBits 1024
KeyFile /etc/postfix/dkim/mail.zeroxzed.ru.private
KeyTable /etc/postfix/dkim/keytable
SigningTable refile:/etc/postfix/dkim/signingtable

Добавляем в конфигурационный файл postfix в самый конец следующие параметры:

# mcedit /etc/postfix/main.cf
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2

Перезапускаем postfix и dkim, последний добавляем в автозагрузку.

# systemctl restart postfix
# systemctl restart opendkim.service
# systemctl enable opendkim.service

Теперь нам надо добавить открытый ключ в dns. Идем в консоль управления dns и добавляем новую txt запись. Ее содержание берем из файла /etc/postfix/dkim/mail.zeroxzed.ru.txt

cat /etc/postfix/dkim/mail.zeroxzed.ru.txt
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
 "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClZX2xWRDISlVLF4b4pUiinY5N9WN7VXEHeyPw8smHTamXh35wJoh+j0+MIQDWG/KtdCcETeawTuypXbvtbneXniYR0iiv6kt754T2WXBjz7O/uHL+vK58LhJsm4TGyhUN6ZBit+w22jG92zdeybSZeU/g7hQdkaAAi0I+0nIkUwIDAQAB" ) ; ----- DKIM key mail for zeroxzed.ru

Убираем кавычки, лишние проблемы и вставляем. Должно получиться вот так:

Настройка dkim записи в dns

Проверяю работу. Отправляю письмо на gmail и смотрю лог почтового сервера:

# cat /var/log/maillog
Mar 17 17:40:26 mail postfix/smtpd[22352]: connect from localhost[127.0.0.1]
Mar 17 17:40:26 mail postfix/smtpd[22352]: BB1794195584: client=localhost[127.0.0.1]
Mar 17 17:40:26 mail postfix/cleanup[22364]: BB1794195584: message-id=<baf63dcec016594d49f2d80f815e5d26@zeroxzed.ru>
Mar 17 17:40:26 mail opendkim[21744]: BB1794195584: DKIM-Signature field added (s=mail, d=zeroxzed.ru)
Mar 17 17:40:26 mail postfix/qmgr[21990]: BB1794195584: from=<root@zeroxzed.ru>, size=593, nrcpt=2 (queue active)
Mar 17 17:40:26 mail postfix/pipe[22369]: BB1794195584: to=<all_out@zeroxzed.ru>, relay=dovecot, delay=0.14, delays=0.11/0.02/0/0.02, dsn=2.0.0, status=sent (delivered via dovecot service)
Mar 17 17:40:26 mail postfix/smtpd[22352]: disconnect from localhost[127.0.0.1]
Mar 17 17:40:27 mail postfix/smtp[22370]: BB1794195584: to=<zeroxzed@gmail.com>, relay=gmail-smtp-in.l.google.com[64.233.163.26]:25, delay=0.84, delays=0.11/0.02/0.31/0.4, dsn=2.0.0, status=sent (250 2.0.0 OK 1489761627 185si4568435lfa.398 - gsmtp)

Все в порядке, электронная цифровая подпись установлена. Проверим, как гугл отреагировал на нашу подпись:

Проверка dkim

Тоже все в порядке. Подпись выполнена корректно, проверку прошла. Дополнительно, проверить корректность dkim записи в dns можно онлайн сервисом — http://dkimcore.org/c/keycheck.

Настроим еще одно средство для повышения доверия к нашей почте со стороны других серверов — spf. Расскажу опять своими словами для чего это нужно. Spf запись добавляется в виде txt записи в dns вашего домена. С помощью этой записи вы указываете, какие ip адреса имеют право отправлять почту от вашего имени. Если кто-то из спамеров будет использовать ваше имя домена при рассылке спама, он не пройдет проверку по spf и скорее всего будет идентифицирован как спам.

Можно указать конкретные ip адреса в записи, а можно сказать, чтобы ip адреса проверялись по спискам A и MX записей. У нас простой случай и только 1 сервер с одним ip, поэтому укажем конкретно этот ip адрес. Идем в панель управления dns и добавляем новую txt запись.

zeroxzed.ru. TXT v=spf1 ip4:188.35.19.125 ~all

Добавление spf записи в dns

Больше ничего делать не надо. Снова отправляем письмо на gmail и смотрим логи.

Проверка spf записи

Обращаю внимание на прошлый скрин, когда мы проверяли dkim и еще не настроили spf, и этот. Видно, что запись работает, гугл определил наш ip, как доверенный для отправки писем с этого домена.

Дополнительный функционал почтового сервера postfix

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

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

  1. Защиту от подбора паролей с помощью fail2ban.
  2. Мониторинг почтового сервера postfix с помощью zabbix.
  3. Сбор статистики с помощью pflogsumm или чего-то подобного.
  4. Просмотр и анализ логов с помощью webmin.
  5. Использование бесплатных сертификатов let’s encrypt.
  6. Регулярную очистку служебных почтовых ящиков.
  7. Бэкап всей почтовой базы.

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

  1. Clamav — известный антивирус. Считаю, что сейчас он не актуален, так как вирусов, от которых он способен защитить, я уже давно не видел. Сейчас вирусная эпидемия шифровальщиков. От них он не защищает.
  2. Spamassasin — популярный бесплатный антиспам фильтр. Скажу честно, работал с ним очень мало и могу быть не объективен. Насколько я видел его настройку и работу — он требует к себе некоторого внимания, калибровки, особенно на начальном этапе. Мне обычно не хочется этим заниматься.
  3. Graylist — эффективное средство борьбы со спамом. Я уже подробно его рассматривал, когда писал про iredmail, так что не буду повторяться. Скажу лишь, что режет спам очень эффективно и бесплатно, но есть существенные неудобства, которые по моему мнению не перекрывают плюсы. Поэтому я не использую.

В качестве антиспама я предпочитаю коммерческое решение — Kaspersky Anti-Spam. Я знаю этот продукт уже лет 8. Он действительно отлично фильтрует спам. Ложных срабатываний вообще не припоминаю, 95% спама фильтрует, может больше. С ним вопрос спама отпадает вообще. Стоит он недорого, можно купить лицензию на меньшее количество ящиков, чем реально используется в системе. Этот вопрос никак не отслеживается и на качество работы не влияет. Но нужно понимать, что это уже нарушение лицензионного соглашения. Но можно всякие хитрости придумать, чтобы и фильтровать и не нарушать.

Борьба со спамом средствами postfix

Сначала хотел сразу все настройки postfix разместить в соответствующем разделе в едином конфиге, но потом передумал и решил все же вынести этот вопрос на отдельное рассмотрение. Возможно, не каждому захочется сразу в эту тему углубляться. Все, что рассказано выше, позволит настроить полноценный почтовый сервер, который будет успешно принимать почту и доставлять ее пользователям. Но в таком виде он будет принимать слишком много спама, но зато не будет проблем с тем, что от кого-то что-то не придет. Как ни крути, но все средства борьбы со спамом так или иначе несут накладные расходы в виде ложных срабатываний с той или иной вероятностью. Если вы решите не заморачиваться и купить Kaspersky Anti-Spam, можете этот раздел не читать. Он сам реализует все те проверки, что мы будем делать. Если же хотите своими силами бороться со спамом средствами postfix, то давайте дальше разбираться.

Я буду использовать штатные возможности postfix, позволяющие отсеять спам по тем или иным параметрам еще до получения письма. Это очень эффективный способ с точки зрения производительности. Благодаря этому, правильно настроенный на отсев спама postfix часто ставят перед exchange, чтобы снизить на него нагрузку. Сразу дам ссылки на официальную документацию с описанием параметров, которые я буду использовать:

  1. smtpd_helo_restrictions
  2. smtpd_sender_restrictions
  3. smtpd_recipient_restrictions
  4. smtpd_data_restrictions
  5. smtpd_client_restrictions

Есть еще парочка — smtpd_etrn_restrictions и smtpd_end_of_data_restrictions, но я ими не пользуюсь.

Обращаю внимание на то, что нужно очень аккуратно работать с настройками, о которых пойдет речь. Нужно четко понимать как, зачем и что вы делаете. Неверные настройки могут нарушить нормальное хождение почты. Нужно уметь анализировать лог файл почтового сервера и понимать, что там происходит.

Долго думал, как лучше всего представить информацию по этому разделу. В итоге решил просто написать часть конфига, которая отвечает за restrictions с комментариями. Более подробную информацию по каждой настройке вы можете найти в официальной документации postfix, ссылки я привел выше, либо в гугле. Данные настройки это моя многолетняя калькуляция различных параметров, собранных из черновиков и рабочих серверов. Не везде все было настроено именно в таком виде, так как ситуации бывают разные. Сейчас я постарался все собрать в одном месте и аккуратно описать. Те проверки в борьбе со спамом, что вам не нужны, просто закомментируйте. В конце я еще пройдусь по некоторым из них и поделюсь своим опытом.

#Описание списков исключений
smtpd_restriction_classes = white_client_ip,
                            black_client_ip,
                            block_dsl,
                            white_client,
                            white_helo,
                            black_client,
                            mx_access

# IP адреса, которые нужно пропускать всегда
white_client_ip		= check_client_access hash:/etc/postfix/lists/white_client_ip

# IP адреса, которые нужно блокировать всегда
black_client_ip		= check_client_access hash:/etc/postfix/lists/black_client_ip

# E-mail, которые нужно пропускать всегда
white_client		= check_sender_access hash:/etc/postfix/lists/white_client

# E-mail, которые нужно блокировать всегда
black_client		= check_sender_access hash:/etc/postfix/lists/black_client

# Неправильные значения HELO, которые мы тем не менее принимаем
white_helo = check_sender_access hash:/etc/postfix/lists/white_helo
# Правила для блокировки различных динамических ip.
block_dsl 		= check_client_access regexp:/etc/postfix/lists/block_dsl

# Список приватных сетей, которые не могут быть использованы в качестве IP для MX записей
mx_access		= check_sender_mx_access cidr:/etc/postfix/lists/mx_access

# Проверки на основе данных, переданных в HELO/EHLO hostname
smtpd_helo_restrictions =	permit_mynetworks,
		permit_sasl_authenticated,
		white_client_ip,
                white_helo,
		black_client_ip,
		block_dsl,
		# Отказываем серверам, у которых в HELO несуществующий или не FQDN адрес 
		reject_invalid_helo_hostname,
		reject_non_fqdn_helo_hostname,
		# Запрещаем приём писем от серверов, представляющихся адресом, для которого не существует A или MX записи.
		reject_unknown_helo_hostname

# Проверки клиентского компьютера или другого почтового сервера, который соединяется с сервером postfix для отправки письма
smtpd_client_restrictions = 	permit_mynetworks,
		permit_sasl_authenticated,
		# Отвергает запрос, когда клиент отправляет команды SMTP раньше времени, еще не зная, поддерживает ли Postfix конвейерную обработку команд ESMTP
		reject_unauth_pipelining,
		# Блокируем клиентов с адресами from, домены которых не имеют A/MX записей
		reject_unknown_address,
		reject_unknown_client_hostname

# Проверки исходящей или пересылаемой через нас почты на основе данных MAIL FROM
smtpd_sender_restrictions =	permit_mynetworks,
		permit_sasl_authenticated,
		white_client,
		black_client,
		# Запрет отправки писем, когда адрес MAIL FROM не совпадает с логином пользователя
		reject_authenticated_sender_login_mismatch,
		# Отклоняем письма от несуществующих доменов
		reject_unknown_sender_domain,
		# Отклоняем письма от доменов в не FQDN формате
		reject_non_fqdn_sender,
		# Отклонение писем с несуществующим адресом отправителя
		reject_unlisted_sender,
		reject_unauth_destination,
		# Отклонять сообщения от отправителей, ящики которых не существуют, использовать аккуратно
		#reject_unverified_sender,
		mx_access

# Правила приема почты нашим сервером на основе данных RCPT TO
smtpd_recipient_restrictions =  permit_mynetworks,
		permit_sasl_authenticated,
		# Отклоняет всю почту, что адресована не для наших доменов
		reject_unauth_destination,
		# Отклонение писем с несуществующим адресом получателя
		reject_unlisted_recipient,
		# Отклоняет сообщения на несуществующие домены
		reject_unknown_recipient_domain,
		# Отклоняет сообщения если получатель не в формате FQDN
		reject_non_fqdn_recipient,
		# Отклоняем прием от отправителя с пустым адресом письма, предназначенным нескольким получателям.
		reject_multi_recipient_bounce

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

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

  • reject_invalid_helo_hostname и reject_unknown_helo_hostname — под эти правила иногда попадают почтовые серверы клиентов, которые не очень хорошо настроены. У них бывают неправильные адреса, кривые записи dns, отсутствие обратных зон и т.д. Их не много, но попадаются. Это не страшно, если вы регулярно следите за сервером. Отправитель получит сразу сообщение о том, что его письмо не дошло до вас. Если он как-то сообщит вам о проблеме, вы легко добавите его в белый список и все будет нормально. Если вам не хочется следить за сервером, лучше не указывайте эти ограничения. Но спам они отсекают не плохо. Сюда попадают все завирусованные компьютеры и сервера без нормальных настроек dns (а их чаще всего и нет).
  • reject_unverified_sender — специально его закомментировал. Я тестировал этот параметр. В принципе, работает нормально, но есть, как обычно, нюансы. Поясню, что делает этот параметр. Когда вам кто-то шлет письмо, ваш сервер обращается к серверу отправителю и спрашивает его стандатрной командой, есть ли на сервере такой отправитель. Если удаленный сервер отвечает, что есть, то никаких проблем — письмо принимается. Если удаленный сервер не отвечает или говорит, что такого адресата нет — письмо отклоняем. Очевидно, что такие проверки создают дополнительную постоянную нагрузку. Это нужно учитывать. К тому же, у вас почтовый лог постоянно будет забит этими проверками, особенно, если вам приходит много спама. На каждое спамовое письмо будет идти проверка, а сервера отправителя скорее всего либо нет, либо он неправильный, либо не отвечает и т.д. Все это будет постоянно проверяться и фиксироваться. В общем, я не использую.

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

soft_bounce = yes

Когда он включен, все ответы сервера с кодами ошибок 5XX, заменяются на 4ХХ. То есть постоянная ошибка, которая сразу отклоняет письмо, заменяется на временную, которая предлагает повторить отправку позже. Таким образом, вы увидите работу всех ограничений, но письма не будут отклонены навсегда. Сервер отправителя через некоторое время снова придет к вам с новой попыткой доставки почты. Письмо безвозвратно не отклоняется. Вы можете проанализировать работу фильтра и решить, ставить его на постоянную работу или с ним что-то не так.

Создадим теперь файлы с белыми и черными списками.

cd /etc/postfix/lists && touch white_client_ip black_client_ip white_client black_client white_helo block_dsl mx_access

Ниже пример содержания этих файлов. Вы можете менять по своему усмотрению.

# cat white_client_ip
195.28.34.162 OK
141.197.4.160 OK
# cat black_client_ip
205.201.130.163 REJECT You IP are blacklisted!
198.2.129.162 REJECT You IP are blacklisted!
# cat white_client
# Принимать всю почту с домена яндекс
yandex.ru OK
# Разрешить конкретный ящик
spammer@mail.ru OK
# cat black_client
# Блокировать всю почту с домена mail.ru
mail.ru REJECT You domain are blacklisted!
# Блокировать конкретный ящик
spam@rambler.ru REJECT You e-mail are blacklisted!
# cat white_helo
# Могут попадаться вот такие адреса, которые не пройдут наши проверки
ka-s-ex01.itk.local     OK
exchange.elcom.local    OK
# cat block_dsl
/^dsl.*\..*\..*/i                               553 AUTO_DSL spam
/dsl.*\..*\..*/i                                553 AUTO_DSL1 spam
/[ax]dsl.*\..*\..*/i                            553 AUTO_XDSL spam
/client.*\..*\..*/i                             553 AUTO_CLIENT spam
/cable.*\..*\..*/i                              553 AUTO_CABLE spam
/pool.*\..*\..*/i                               553 AUTO_POOL spam
/dial.*\..*\..*/i                               553 AUTO_DIAL spam
/ppp.*\..*\..*/i                                553 AUTO_PPP spam
/dslam.*\..*\..*/i                              553 AUTO_DSLAM spam
/node.*\..*\..*/i                               553 AUTO_NODE spam
/([0-9]*-){3}[0-9]*(\..*){2,}/i                 553 SPAM_ip-add-rr-ess_networks
/([0-9]*\.){4}(.*\.){3,}.*/i                    553 SPAM_ip-add-rr-ess_networks
/.*\.pppool\..*/i                               553 SPAM_POOL
/[0-9]*-[0-9]*-[0-9]*-[0-9]*-tami\.tami\.pl/i   553 SPAM_POOL
/pool-[0-9]*-[0-9]*-[0-9]*-[0-9]*\..*/i         553 SPAM_POOL
/.*-[0-9]*-[0-9]*-[0-9]*-[0-9]*\.gtel.net.mx/i  553 SPAM_POOL
/dhcp.*\..*\..*/i                               553 SPAM_DHCP
# cat mx_access
127.0.0.1      DUNNO 
127.0.0.2      550 Domains not registered properly
0.0.0.0/8      REJECT Domain MX in broadcast network 
10.0.0.0/8     REJECT Domain MX in RFC 1918 private network 
127.0.0.0/8    REJECT Domain MX in loopback network 
169.254.0.0/16 REJECT Domain MX in link local network 
172.16.0.0/12  REJECT Domain MX in RFC 1918 private network 
192.0.2.0/24   REJECT Domain MX in TEST-NET network 
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network 
224.0.0.0/4    REJECT Domain MX in class D multicast network 
240.0.0.0/5    REJECT Domain MX in class E reserved network 
248.0.0.0/5    REJECT Domain MX in reserved network

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

После редактирования файлов обязательно выполняем команду на перестроение базы данных. Я перестрою сразу все файлы:

cd /etc/postfix/lists && postmap white_client_ip black_client_ip white_client black_client white_helo block_dsl mx_access

Еще упомяну о таком популярном явлении в спамерских письмах, как подделка адреса отправителя. Причем не просто подделка на абы кого, а именно на ваше имя домена. Пользователь получает спам письмо и в почтовом клиенте видит, что оно отправлено с вашего домена. Только по заголовкам можно определить реального отправителя. Такой подход позволяет обходить некоторые антиспам системы, которые не фильтруют письма внутреннего домена. Бороться с подменой адреса отправителя в нашем случае очень просто. Для этого в black_client добавим следующую запись:

zeroxzed.ru 554 Stop spam from my name

Отправка с нашего домена осуществляется только с SASL авторизацией, а она во всех ограничениях стоит первой, поэтому письма реальных пользователей без проблем будут уходить. А всех тех, кто только притворяется нашим доменом, мы будет отфильтровывать этим правилом.

Приведу в завершении описания методов борьбы со спамом простой пример. Добавим в black_client почтовый адрес и отправим с него письмо.

# cat black_client
zeroxzed@gmail.com REJECT Your e-mail was banned!
# postmap black_client

Отправляем сообщение и проверяем почтовый лог.

# cat /var/log/maillog
Mar 20 02:21:34 mail postfix/smtpd[10816]: connect from mail-yw0-f177.google.com[209.85.161.177]
Mar 20 02:21:35 mail postfix/smtpd[10816]: Anonymous TLS connection established from mail-yw0-f177.google.com[209.85.161.177]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Mar 20 02:21:35 mail postfix/smtpd[10816]: NOQUEUE: reject: RCPT from mail-yw0-f177.google.com[209.85.161.177]: 554 5.7.1 <zeroxzed@gmail.com>: Sender address rejected: Your e-mail was banned!; from=<zeroxzed@gmail.com> to=<root@zeroxzed.ru> proto=ESMTP helo=
Mar 20 02:21:35 mail postfix/smtpd[10816]: disconnect from mail-yw0-f177.google.com[209.85.161.177]

Вот и результат. На этом по борьбе со спамом все.

Заключение

Проверить настроенный почтовый сервер можно с помощью онлайн сервиса https://www.mail-tester.com. Не факт, что получите максимальный бал, но все недочеты будут указаны. Критичное нужно исправить (например, если обратная зона неправильная), некритичное можно пропустить (если dkim, к примеру, не настраивали).

Кажется все написал, что знал по поводу почтового сервера на linux в небольших и средних организациях. У некоторых может возникнуть вопрос, а зачем свой почтовый сервер? Почему бы не воспользоваться средствами корпоративной почты, которую представляют популярные почтовые сервисы бесплатно? Я планирую написать по этому поводу отдельную заметку (в итоге написал — выбор почтового сервера). У меня тоже есть определенный опыт на этот счет. И если некоторое время назад я считал, что свои почтовые серверы в небольших организациях уже не актуальны, то сейчас я так не думаю, поэтому и появилась эта статья.

Буду рад замечаниям по делу и советам в комментариях. Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Онлайн курс "DevOps практики и инструменты"

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров. Проверьте себя на вступительном тесте и смотрите программу детальнее по .

Помогла статья? Есть возможность отблагодарить автора

Автор Zerox

Zerox
Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству.

399 комментариев

  1. Аватар

    Добрый день!
    У меня все работает. Теперь необходимо еще один домен добавить. Сможете помочь?

    • Zerox

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

  2. Аватар

    Спасибо большое за Ваши статьи и ответы в комментариях!
    Пытаюсь сейчас выбрать между двумя вариантами настройки почты (на своем ВНЕШНЕМ почтовом сервере или на своем почтовом поддомене, расположенном на отдельном (от сайтов) IP.
    Итак, как я понял алгоритм:
    Схема 1 (на своем внешнем отдельном почтовом сервере):
    1. Поднимаем сервер 1 — создаем на нем почтовый (технический) поддомен, например, mail.site1.ru на IP1
    в DNS указываем: A запись site1.ru — IP1, A запись mail.site1.ru — IP1, MX запись — mail.site1.ru
    настраиваем на сервере: postfix + dovecot + mysql база + postfixadmin + dkim
    имя хоста и обратную зону указываем: mail.site1.ru
    настраиваем также SSL для site1.ru и mail.site1.ru
    2. Поднимаем сервер 2 — для сайтов — размещаем на нем site2.ru на IP2
    в DNS указываем: A запись site2.ru — IP2, MX запись — mail.site1.ru
    ОПЯТЬ? настраиваем на сервере: postfix + dovecot + mysql база + postfixadmin + dkim
    добавляем в main.cf
    relayhost = [mail.site1.ru]:587
    задаем также пароли для доступа к своему SMTP в файле
    /etc/postfix/sasl_passwd в виде
    postmaster@site2.ru:password
    настраиваем также SSL для site2.ru
    имя хоста и обратную зону ОПЯТЬ указываем 1 СЕРВЕРА?: mail.site1.ru

    Схема 2 (на своем почтовом поддомене, расположенном на отдельном IP1 на том же сервере с сайтами, имеющими IP2):
    в DNS указываем: A запись site.ru — IP1, A запись mail.site.ru — IP2, MX запись — mail.site.ru
    имя хоста и обратную зону указываем: mail.site.ru

    В чем ошибки или недостатки в схемах?

    • Zerox

      Я не понял, зачем в схеме 1 почтовый сервер поднимается на сервере 2 с сайтом. Он там не нужен. Обычно сайты умеют, а если не умеют, надо научить, использовать внешний smtp сервер. Если не получится, то достаточно одного postfix с пересылкой всей почты на первый сервер.

      • Аватар

        Это для системной почты. Дело в том, что когда я ранее, настраивая почтовый сервер на том же IP и том же сервере, что и сайты, так и не смог добиться, чтобы системная почта (по обновлению сервера и т.д.) дублировалась на внешний ящик. Добавление алиаса внешнего ящика для системной почты в /etc/aliases у меня почему-то не срабатывало. Поэтому создал через postfixadmin внешний ящик root@site.ru. Возможно наверное, чтобы не поднимать также почтовый сервер на сервере 2 по 1 схеме, можно создать этот же внешний ящик root для 2 сервера на 1 сервере (почтовом), но я не думал, что это возможно.

        • Zerox

          Это возможно. Локальный postfix может отправлять почту через внешний smtp сервер.

  3. Аватар

    Доброго времени суток!
    Выходит такое сообщение, что может быть не так настроено?

    Nov 08 12:26:10 jup postfix/pickup[18503]: 6F07E3408483: uid=0 from=
    Nov 08 12:26:10 jup postfix/cleanup[18505]: warning: mysql:/etc/postfix/mysql/virtual_alias_maps.cf lookup error for «testPN1@yandex.ru»
    Nov 08 12:26:10 jup postfix/cleanup[18505]: warning: 6F07E3408483: virtual_alias_maps map lookup problem for testPN1@yandex.ru — deferring delivery

    *virtual_alias_maps.cf*
    hosts = localhost
    user = postfix
    password = *******
    dbname = postfix
    query = SELECT goto FROM alias WHERE address=’%s’ AND active = ‘1’

    • Zerox

      Проверяйте настройки доступа в mysql к таблице с алиасами. Postfix не может получить из нее информацию, о чем и пишет.

      • Аватар

        Проверил подключение к таблице с алиасами под пользователем postfix. Запрос обрабатывается и данные выводятся. Куда можно еще копать?

        • Zerox

          Я думаю, где-то описка, опечатка. Проверяйте все внимательно. Postfix четко пишет, в чем проблема, надо копать в этом направлении.

  4. Аватар

    Нужна помощь. При попытке подрубиться к серверу IMAP периодически слетает соединение по SASL. В логе dovecot единственная ошибка Error: namespace configuration error: Duplicate namespace prefix: «»
    Везде говорят что надо проверить наличие строки inbox = yes в dovecot.conf или в 15-mailboxes.conf. она у меня присутствие. Где еще посмотреть?

    Так есть ошибка NOQUEUE: reject: RCPT from relay.wildberries.ru[…]: 451 4.3.0 что тут-то может быть причиной. В сети как-то размыто

  5. Аватар

    В практике не встречалось задача mx сервер держать на другом сервере, вроде данной схемы https://wiki.dieg.info/postfix_backup_mx ?

    • Zerox

      Делал так. Тут нет ничего сложного. Просто поднимается еще один сервер в другом месте и ему прописывается меньший приоритет в mx записи. Условно, у основного 10, у резервного 20. При недоступности основного, почта отправляется на резервный.

      • Аватар

        имеется в виду у клиентов чаще настроено с резервом или все на одном )

        • Zerox

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

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

          Резервные mx это для сложных распределенных систем с балансировщиками, чтобы можно было быстро людей переключить на резервный сервер автоматически. Чтобы работа была комфортная, нужна постоянная синхронизация почты между этими двумя серверами.

          В общем, это решение для крупного enterprise, где даже минимальный простой недопустим. Всем остальным смертным это слишком дорого и хлопотно.

  6. Аватар

    Дошел до запуска установки postfixadmin http://192.168.1.8/postfixadmin/setup.php — получаю: $CONF[‘configured’] = true; $CONF[‘default_language’] = ‘ru’; $CONF[‘database_type’] = ‘mysqli’; $CONF[‘database_host’] = ‘localhost’; $CONF[‘database_user’] = ‘postfix’; $CONF[‘database_password’] = ‘12345678’; $CONF[‘database_name’] = ‘postfix’; $CONF[‘admin_email’] = ‘root@zeroxzed.ru’; $CONF[‘encrypt’] = ‘md5crypt’; $CONF[‘default_aliases’] = array ( ‘abuse’ => ‘root’, ‘hostmaster’ => ‘root’, ‘postmaster’ => ‘root’, ‘webmaster’ => ‘root’ ); $CONF[‘domain_path’] = ‘YES’; $CONF[‘domain_in_mailbox’] = ‘YES’; Что я делаю не так?

  7. Аватар

    Вопрос номер 1: так все таки как правильно указывать в postfix’e в main.cf: virtual_transport = dovecot или virtual_transport = lmtp:unix:private/dovecot-lmtp ? И зачем в dovecot’e в 10-master.conf поднимать lmtp если в postfix’e в main.cf про lmtp ни слова?
    И вопрос номер 2: зачем в dovecot’e в 10-master.conf нужен слушатель unix_listener auth-master ? Во многих руководствах про него ни слова. Есть же unix_listener auth-userdb и unix_listener /var/spool/postfix/private/auth.

  8. Аватар

    Подскажи, почему могут не создаваться каталоги с почтовыми ящиками, куда копать. Сделал по твоей документации. В логах maillog: SSL_accept error from unknown -1. В Outlook ящик создался. Письма не уходят и не приходят.

  9. Аватар

    Добрый день. Подскажите пожалуйста, как организована работа между почтовыми ящиками all_* и непосредственно клиентскими ящиками. Возможно в статье не заметил это место. Хочу понять каким образом происходит обмен.

    • Zerox

      Не понял вопрос. Что значит организована работа? Там никакого обмена нет. Просто вся входящая и исходящая почта в момент поступления на сервер копируется в эти ящики.

      • Аватар

        Я можно сказать про это и спрашивал. Т.е. из каждого ящика она просто копируется или наоборот есть фильтр при помощи которого в ящики копируется или как-то по другому.

        • Zerox

          Никаких нюансов нет, просто в момент поступления на сервер на этапе передачи письма в ящик пользователя, копия кладется в ящик all. В последствии эти письма никак не связаны. Никакие фильтры почты в ящике пользователя не участвуют в копировании. Это все делается раньше в момент обработки входящего письма.

  10. Аватар

    Здравствуйте, у кого получилось победить ошибку по авторизации imap на веь интерфейсе roundcube ?
    не получается пройти авторизацию.
    Плюс в инструкции написано после конфигурации roundcube перейти на веб морду и авторизоваться на почтовый ящик. но не указанно что делать когда ситуация показанная на фото по ссылке: https://drive.google.com/open?id=1uZ-fdQTMBZzmM2dNIYK0b62HExonquhV
    Говорит что схема БД не создана ? Её создать ? Веди в инструкции это не написано ? И не понятно как roundcube будет общаться с базой данных postfix ?
    Dovecot запущен, статус отличный, ошибок нет. Письма отправляются, по к thunderbird не подключается, как понять ошибка в Dovecot если на самом деле он запущен и работает ?
    Какие порты нужно прокинуть на шлюзе (на сервере по инструкции от Автора данной инструкции порты прокинуты в iptables) ? Может из за этого не подключается ? Но ведь подключения делаю в той же подсети что и сервер.
    Могут эти неполадки вызваны тем что по инструкции необходимо в одном месте собирать Dovecot но штатно он разделён. Может быть в этом проблема ? Так как один из участников оставлял комментарий что Dovecot оставил по-умолчанию таким какой есть.
    Но смущает что у Автора всё получается, значит ошибка у меня, но понять не могу где?

    • Zerox

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

      • Аватар

        Да просто я растерялся) в статье про инициализацию не написано вот и задумался может автоматически должна обратиться ? А так я это понял и инициализация после нажатия соответствующей кнопки прошла успешно, а вот поводу imap и 143 порта, буду смотреть, спасибо большое)

      • Аватар

        А по поводу как dovecot обращаеться к базе postfix, правильно понимаю что он использует файл dovecot-mysql.conf ?

      • Аватар

        После того как закомментировал все правила файла imap в папке «/etc/dovecot/conf.d/», изменились показатели, теперь неудачная попытка авторизации по веб морде а в консоли вот что пишет:
        https://drive.google.com/open?id=1uTyI_6aQ9UPmnEZZiZZ0GvyNXBFP41Bc
        Возможно проблема получается в файле dovecot-mysql.conf

      • Аватар

        И в правду была ошибка, простите пожалуйста за не внимательность, но удачно попытки авторизоваться нету, опять ошибка по IMAP: https://drive.google.com/open?id=1p_iTGKIGms-6LqJM4gMEu7NYNCfCNELa
        Может быть проблема в uid and gid ? Так как при настройке uid and gid 1000 не позволил создать ссылаясь на ранее уже созданный и присвоил и создал 2000 во всех конфигурациях, в этом не может быть проблема ? И если в этом то как можно «убить» 1000 что бы заново его создать исправно под эти намерения ?

      • Аватар

        В итоге удалось авторизоваться на веб морде, но теперь следующая ошибка:
        https://drive.google.com/open?id=1gA2nvdeQpN3wKOEHEvNe1RRm6kUohBGE

      • Аватар

        Всё, разобрался! Обажаю тебя Автор статьи, как всегда воистинну. ты прав и всё верно и правильно.
        В случае с моей проблемой, нужно удалить полностью папку в dovecot/conf.d/ так как обращается raoundcobe постоянно именно к ним. Буду тестировать дальше, если что напишу. Спасибо ещё раз!

  11. Аватар

    Всем привет!

    Настроил у себя во многом по данному мануалу на CentOS 7.6.1810:

    dovecot 2.2.36 + exim 4.92 + maridb 5.5.60 + Apache/2.4.6, PHP/5.4.16 + SSL(HTTPS)/Let’sEncrypt + RoundCube 1.3.9(+fail2ban для Roundcube/Apache/exim/dovecot) c плагинами:
    — ACL(шаринг папок по imap)
    — managesive (фильтры)
    — password (смена пароля из веб-интерфейса, пароли в БД, в шифрованном виде CRAM-MD5)
    — newmail_notifier (уведомления о новой почте)
    — mobile (мобильная версия веб-интерфейса)

    Конфиг dovecot по отдельным файлам — то, чего автор статьи не любит)

    Может быть, смогу быть кому-то полезным, пока всё свежо в памяти. Проблем было много, приходилось и списки рассылки по dovecot покурить и github по Roundcube почитать, даже написать разработчику (https://github.com/alecpl), но всё удалось победить. У меня всё работает на ура, веб-интерфейс шикарный, привыкаешь очень быстро. Единственное, что не работает — почему-то зависает при нажатии на «Управление папками» в мобильной версии.

    Теперь думаем как постепенно внедрять, убирать почтовые клиенты в компании.
    Папки для общего доступа (ACL) — прекрасный функционал. Когда сотрудник работает с несколькими почтовыми ящиками, некоторые из которых т.н. «общие», то использовать веб-интерфейс затруднительно. Каждый ящик — новая вкладка, везде нужно зайти (хотя есть плагин для автоматической авторизации), сразу всё не видно. А с шарами можно выдать пользователю в личный ящик нужные ему папки с других ящиков, сделав единую точку работы с почтой. Шары, кстати, прекрасно работают и во всех наиболее распространённых бесплатных почтовых клиентах. А если ещё задействовать фильтры для автоматизации — возможности широчайшие. Фильтры позволяют раскладывать письма и по расшаренным папкам, в другие ящики. Проверено.

    Автору огромное спасибо!

    • Аватар

      Здравствуйте можете подсказать почему у меня не получается авторизоваться на веб интерфейс roundcube по учетке Postfix ?
      И можете привести свои настройки dovecot ?

  12. Аватар

    Подскажите, пожалуйста при связке postfix + roundcube как запретить некоторым пользователям писать письма наружу через вебморду?
    оставить только получение

    • Zerox

      Не думаю, что такое ограничение настроить реально. По сути roundcube это просто imap клиент. Я не знаю, как запретить доступ выборочно на основе imap клиента. Вы можете либо запретить полностью доступ в roundcube, либо самому пользователю в принципе запретить отправку писем. А вот так, чтобы запретить именно через roundcube не знаю, как сделать.

      Теоретически, можно. Если roundcube установлен на том же почтовом сервере, что и postfix с dovecot, то он будет подключаться с адреса localhost к imap серверу. Возможно, с помощью этой информации можно как-то настроить ограничения, но тут надо разбираться и думать. Решение простым точно не будет.

      • Аватар

        Большое спасибо за ответ!
        «либо самому пользователю в принципе запретить отправку писем»
        Выходит, если раундкуб через imap работает, то я не могу добавить в main.cf
        smtpd_sender_restrictions=hash:/etc/postfix/no-out

        no-out
        user@domain REJECT

        у меня, во всяком случае не работает ;/

        • Zerox

          Можете добавить ограничение на отправку через sender_restrictions в postfix. Вероятно, вы где-то ошиблись, поэтому не работает. Я раньше настраивал, но сейчас нет примера под рукой. Можно даже отдельно список доменов завести, на которые отправлять можно, а на все остальные нельзя. На opennet была статья с описанием подобной настройки.

  13. Аватар

    Здравствуйте, можете пожалуйста обьяснить как правильно указывать/конфигурировать путь для сохранения архивов почт.
    $CONF[‘domain_path’] = ‘YES’;
    $CONF[‘domain_in_mailbox’] = ‘YES’;
    У Вас получается присвоить путь: Получится следующий путь до ящика, если у вас архив почты будет жить, к примеру, в директории /mnt/mail — /mnt/mail/zeroxzed.ru/root@zeroxzed.ru.

    Но я к сожалению не понимаю как его присваивать $CONF[‘ /mnt/mail/zeroxzed.ru/root@zeroxzed.ru.’] = ‘YES’; ?
    Или так: $CONF[‘/mnt/mai’] = ‘YES’;
    $CONF[‘/mnt/mail/zeroxzed.ru/root@zeroxzed.ru.’] = ‘YES’; ???
    Помогите пожалуйста разобраться

    • Zerox

      Вы немного запутались. В конфиге postfixadmin настраивается вариант структуры хранилища почты, а не сам путь к этому хранилищу. Адрес хранилища, в моем случае /mnt/mail указывается в конфигах postfix и dovecot. Смотрите их внимательно, там эти настройки прокомментированы.

  14. Аватар

    Доброе утро.
    Спасибо большое за подробные мануалы, но я только начинаю администрировать сервера Linux
    И в данном контексте у меня возникли трудности с авторизацией пользователей.
    Пишет что нету соединения по IMAP.
    Дело в том что в начале мануала нужно проставлять как я понимаю пути к директориям хранения созданных почт
    ($CONF[‘domain_path’] = ‘YES’;
    $CONF[‘domain_in_mailbox’] = ‘YES’;)
    Далее Вы пишите что можно указывать самостоятельный путь (Получится следующий путь до ящика, если у вас архив почты будет жить, к примеру, в директории /mnt/mail — /mnt/mail/zeroxzed.ru/root@zeroxzed.ru.), но не понимаю как ? Точнее как правильно его указывать в этом конфиге ? Помогите пожалуйста.

  15. Аватар

    Добрый день, сделал все строго по вашей инструкции. Но когда ввожу логин и пароль от почты в THUNDERBIRD. Выдает ошибку «Не могу войти на сервер. Возможно, имеется ошибка в конфигурации, имени пользователя или пароле.». Просто в каком направлении копать? Я так понимаю конфиги настроенны не верно ?

    • Zerox

      Начинать исследование любых проблем надо с просмотра логов postfix и dovecot. Они в /var/log/ лежат. Там либо будут ошибки, либо если не будет вообще никаких упоминаний о подключении, решать вопрос, а туда ли вы вообще подключаетесь. Эти сервисы хорошо логируются и по логам всегда можно понять, что именно не работает и в чем проблема.

  16. Аватар

    Как заставить Roundcube работать по https??

    • Zerox

      Это отдельная тема. Пример настройки https в apache есть здесь — https://serveradmin.ru/nastroyka-ssl-v-apache-na-centos/ Единственное, там в примере используются сертификаты от сервиса, который уже не работает. Сейчас надо использовать бесплатные сертификаты от let’s encrypt.

  17. Аватар

    «Позже получим и настроим нормальный сертификат.» — очень хотелось бы посмотреть!
    Пробовал указать в конфиге (/etc/postfix/main.cf) в строчках
    smtpd_tls_key_file =
    smtpd_tls_cert_file =

    smtp_tls_CAfile =

    пути файлов ранее настроенного сертификата от Let’s Encrypt — при этом в почтовом клиенте The Bat почта либо не отправляется , либо пишет — недействительный сертификат.

    • Zerox

      Вот пример настроек сертификатов let’s encrypt в postfix с рабочего сервера. Там никаких нюансов нет, чтобы отдельно рассказывать. Просто указывается сертификат и все.

      smtpd_tls_key_file = /etc/postfix/cert/privkey.pem
      smtpd_tls_cert_file = /etc/postfix/cert/cert.pem
      smtpd_tls_CAfile = /etc/postfix/cert/chain.pem
    • Аватар

      smtpd_tls_cert_file=/etc/letsencrypt/live/domain/fullchain.pem
      smtpd_tls_key_file=/etc/letsencrypt/live/domain/privkey.pem

  18. Аватар

    Делаю по мануалу , есть такая ошибка
    The Postfix Admin directory layout changed.

    Please update your webserver config so that the DocumentRoot or Alias points to the directory «public».
    Не нашел рабочего решения. Селениум отключен.

    • Zerox

      В принципе, в ошибки все написано, что требуется. Судя по всему, в конфиге параметр DocumentRoot или alias смотрят не на директорию public.

      • Аватар

        Спасибо за отет. Тапками не кидайтесь если че .
        Тоесть нужно праить путь в конфиге /etc/httpd/conf.d дописать
        DocumentRoot «/var/www/html/postfixadmin/public»

  19. Аватар

    Версия такая же как у Вас — 3.0.2. А не подскажете тогда, где можно посмотреть логи postfixadmin, что именно происходит при этом входе, какие сообщения или ошибки появляются? Или может быть дело в том что виртуальная машина?

  20. Аватар

    Здравствуйте, уважаемый автор. Большое спасибо за статью. Начал делать по ней, только вместо apache установил nginx.
    Установку проводил на VMWare. Все шло хорошо до момента настройки postfixadmin. Сам он запустился, я создал суперадмина с новым паролем.
    Но войти в браузере не могу. Никаких ни ошибок ни сообщений не выдается, просто страница прокручивается и опять попадаю в окно приглашения.
    Что делать — непонятно. Читал. что такая ошибка часто встречается, но однознчного ответа так никто и не дал. Не могли бы Вы подсказать, в чем может быть дело? Заранее спасибо, с уважением.

    Выглядит это так: (Скрин к сожалению вставить не получается)

    Mail admins login here to administer your domain.
    Login (email):
    Password:
    Language:

    Users click here to login to the user section.

    • Zerox

      К сожалению, не знаю, чем помочь. Возможно что-то изменилось в новых версиях postfixadmin. Попробуйте более старую. Они принципиально ничем не отличаются. Управлять сервером без проблем можно любой версий, даже 5-7 летней давности.

  21. Аватар
    Александр

    В roundcube в настройках есть закладка — Профили. Любой пользователь может туда войти и вбить данные которые сам придумает. Я например сегодня отправил со своего сервера письмо с ящика qq@qq.ru на gmail и оно даже пришло во входящие. Точно так же можно подставить данные любого пользователя. Как с этим бороться?

    • Аватар
      Александр

      Если кому-то понадобится:

      # Убрать кнопки добавления и удаления профилей в каждой теме:
      vim /var/www/roundcube/skins/larry/templates/identities.html
      <!—
      <roundcube:button command="add" type="link" title="newidentity" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="addidentity" condition="config:identities_level:0<roundcube:button command="delete" type="link" title="delete" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" label="delete" condition="config:identities_level:0
      —>

      vim /var/www/roundcube/skins/classic/templates/identities.html
      <!—
      <roundcube:button command="add" type="link" title="newidentity" class="buttonPas addgroup" classAct="button addgroup" content=" " condition="config:identities_level:0<roundcube:button command="delete" type="link" title="delete" class="buttonPas delgroup" classAct="button delgroup" content=" " condition="config:identities_level:0
      —>

      # Установить флаг disabled на поле для ввода E-mail
      vim /var/www/roundcube/program/steps/settings/edit_identity.inc
      # function rcube_identity_form($attrib)
      # …
      # // list of available cols
      # …
      ’email’ => array(‘type’ => ‘text’, ‘size’ => $i_size, ‘disabled’ => ‘disabled’),
      # …

      • Аватар
        Александр

        Поправка, если установить disabled то нельзя будет менять другие параметры, поэтому можно просто скрыть поле для ввода E-mail:

        vim /var/www/roundcube/program/steps/settings/edit_identity.inc
        # function rcube_identity_form($attrib)
        # …
        # // list of available cols
        # …
        ’email’ => array(‘type’ => ‘text’, ‘size’ => $i_size, ‘style’ => ‘visibility: hidden’),
        # …

        В плагине new_user_dialog такая же уязвимость, лечится так же (можно еще переместить ниже подписи для красоты):
        vim /var/www/roundcube/plugins/new_user_dialog/new_user_dialog.php
        $table->add(‘title’, »); // изменение
        $table->add(null, html::tag(‘input’, array(
        ‘type’ => ‘text’,
        ‘name’ => ‘_email’,
        ‘value’ => rcube_utils::idn_to_utf8($identity[’email’]),
        // ‘disabled’ => in_array($identities_level, array(1, 3, 4)) // изменение
        ‘style’ => ‘visibility: hidden’ // изменение
        )));

    • Zerox

      Бороться с этим невозможно. Это особенность почтового протокола, который позволяет так поступать. Любой может поставить какой-угодно обратный адрес и отправить письмо. Я вот тут отдельно разбирал эту тему — https://serveradmin.ru/zapret-pisem-s-poddelnyim-polem-from-ili-spam-ot-sebya-k-sebe-v-postfix/

      • Аватар
        Александр

        По сути то что в статье по ссылке уже есть в данной статье, только используется файл black_client — верно?

        • Zerox

          Да, я и сам забыл, что уже рассказывал об этом. Еще раз статью написал :)

          • Аватар
            Александр

            Да, я это сделал сразу же, очень полезно, спасибо! :)
            Но проблема которую я хотел озвучить не в злодеях снаружи, а злодеях внутри. Используя возможность roundcube в виде подстановки From любой сотрудник компании!!! может от имени генерального директора написать письмо сомнительного содержания — указание внутри компании или клиенту и т.к. это все локальный сервер письмо уйдет без вопросов. Поэтому, на мой взгляд, эту возможность нужно ограничить как можно сильнее. Пример я привет выше — убрать возможность создавать профили самостоятельно, и изменять e-mail адрес в профиле по умолчанию.

            • Zerox

              Это да, имеет смысл. Я никогда не обращал внимание, что там такая возможность есть в настройках.

  22. Аватар
    Александр

    При подключении из оутлука по imap, папки отправленные и т.п. написаны на англ. языке. Есть решение этой проблемы на стороне сервера?

    • Zerox

      Да, есть плагин для dovecot, который автосоздает папки при первом подключении. Названия папок указываются в настройках. Точно не помню название плагина. Еще надо учитывать, что имена папок должны быть написаны в какой-то кодировке для imap, не помню точно какая. Я кое-где встречал такие настройки, но сам никогда не делал. Я всегда использую латинские названия, так меньше проблем и глюков.

      • Аватар
        Александр

        Можно прям в настройках dovecot указать папки на русском и они создадутся в ФС в нужной кодировке и даже outlook будет правильно распределять письма до тех пор пока не войдешь в roundcube. С этого момента в вебе будет 2 папки отправленные, например. Веб будет отправлять письма в .sent а оутлук в отправленные. Не проверял, но думаю, что тандерберд и мобильные клиенты присоединятся к вебу. И оутлук будет сам по себе в сторонке… а хочется, чтобы было все едино. Может кто-то уже боролся с этим?

        • Zerox

          У этой проблемы нет решения. Смысл в том, что разные клиенты создают разные папки, они так созданы. К примеру, мобильный клиент создаст какие-то свои. Я это постоянно наблюдаю и простого решения не знаю. То же самое будет с папкой для спама. Где-то она будет называться «Нежелательная почта», где-то «Спам», где-то «Spam» и т.д.

      • Аватар
        Александр

        Провел еще 1 эксперимент. В настройках отулука при подключении указал путь к корневой папке как inbox
        Перезапустил оутлук, все папки на русском, кладет как написано. Но если зайти в тандерберд или роундкуб — во входящей папки появились подпипки — отправленные, черновики и т.п. спешиал фо оутлук)) Причем сам оутлук напроч не хочет видеть папки .Sent. А мобильный клиент на андройде (стандартный) напроч не хочет видеть папки оутлука. Получается такая неразбериха….

  23. Аватар

    Заново переписал все конфиги, теперь выдает ошибку:

    localhost postfix/pipe[17840]: 4636A82A211: to=, relay=dovecot, delay=1, delays=0.14/0.01/0/0.87, dsn=5.1.1, status=bounced (user unknown)

    • Аватар

      Для таких же не умных как я. Указанная выше проблема решается очень просто:
      flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
      нужно просто написать это без ошибки, добавив оба значка доллара)))

      Теперь же вылезло вот это:
      Error: User initialization failed: Namespace »: Ambiguous mail location setting, don’t know what to do with it: myhost.com/root@myhost.com (try prefixing it with mbox: or maildir:)

      • Zerox

        Проверяй опять ошибки. Статья 100% рабочая. Я несколько серверов по ней настроил.

        • Аватар

          Погуглил, люди пишут, что это из-за того, что папки не создаются в mail_location. А вот почему они не создаются не понятно. Права на /mnt/mail/ vmail присвоил

        • Аватар

          Можешь сказать какая часть конфига отвечает за создание папок в /mnt/mail ?

  24. Аватар

    Здравствуйте. Посмотрите пожалуйста лог, и помогите исправить ошибку:

    Feb 7 13:34:36 localhost postfix/smtpd[14415]: connect from f169.i.mail.ru[94.100.178.88]
    Feb 7 13:34:37 localhost postfix/smtpd[14415]: Anonymous TLS connection established from f169.i.mail.ru[94.100.178.88]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
    Feb 7 13:34:38 localhost postfix/smtpd[14415]: B848682E63D: client=f169.i.mail.ru[94.100.178.88]
    Feb 7 13:34:38 localhost postfix/cleanup[14428]: B848682E63D: message-id=
    Feb 7 13:34:38 localhost postfix/qmgr[14051]: B848682E63D: from=, size=2972, nrcpt=2 (queue active)
    Feb 7 13:34:38 localhost postfix/smtpd[14415]: disconnect from f169.i.mail.ru[94.100.178.88]
    Feb 7 13:34:40 localhost postfix/smtp[14432]: B848682E63D: to=, relay=none, delay=2.9, delays=1.5/0.01/1.4/0, dsn=5.4.6, status=bounced (mail for myhost.com loops back to myself)
    Feb 7 13:34:40 localhost postfix/smtp[14432]: B848682E63D: to=, relay=none, delay=2.9, delays=1.5/0.01/1.4/0, dsn=5.4.6, status=bounced (mail for myhost.com loops back to myself)
    Feb 7 13:34:40 localhost postfix/cleanup[14428]: 44C3C82E63E: message-id=
    Feb 7 13:34:40 localhost postfix/qmgr[14051]: 44C3C82E63E: from=, size=4761, nrcpt=1 (queue active)
    Feb 7 13:34:40 localhost postfix/bounce[14433]: B848682E63D: sender non-delivery notification: 44C3C82E63E
    Feb 7 13:34:40 localhost postfix/qmgr[14051]: B848682E63D: removed
    Feb 7 13:34:40 localhost postfix/smtp[14434]: 44C3C82E63E: enabling PIX workarounds: disable_esmtp delay_dotcrlf for mxs.mail.ru[94.100.180.104]:25
    Feb 7 13:34:41 localhost postfix/smtp[14434]: 44C3C82E63E: to=, relay=mxs.mail.ru[94.100.180.104]:25, delay=1.5, delays=0/0.01/0.34/1.1, dsn=2.0.0, status=sent (250 OK id=1grf8q-0005t0-QE)
    Feb 7 13:34:41 localhost postfix/qmgr[14051]: 44C3C82E63E: removed

    Не уверен, но может это повлияло: PFA установился отлично, без ошибок, таблицы в БД создались, но по какой-то причине в саму панель не логиниться, выдает ошибку «Invalid token!» (может и это знаете как пофиксить). Далее я заполнил вручную созданные таблицы и возможно это как-то влияет на работу.

    Заранее благодарен за помощь.

  25. Аватар

    не отправляется лог почему-то, но данную проблему решил комментом строк с uid

    • Аватар

      А можно подробней, какие именно строки закомментили? у меня такая же проблема.

      • Аватар

        в конфиге dovecot, в самом начале
        было так:
        first_valid_uid = 1000
        last_valid_uid = 1000
        сделал так:
        #first_valid_uid = 1000
        #last_valid_uid = 1000
        и авторизация пошла

        • Аватар

          Увы, мне не помогло.

          • Аватар

            покажи что у тебя в логах dovecot

            • Аватар

              imap-login: Info: Disconnected (auth failed, 3 attempts in 109 secs): user=, method=PLAIN, rip=, lip=, TLS, session=

              • Аватар

                может логин не правильно вводишь, там нужно полностью с доменом вводить, как в настройке конфига было

                • Аватар

                  Я полностью ввожу. Ну ладно, это сейчас не главная проблема, там ниже я оставил коммент, у меня почта не принимает письма, хотя на отправку идут.

                  • Аватар

                    было так же, перенастраивал dns записи (у меня не правильные были). И открывал порт 25й на прием почты и все теперь ходит

                    • Аватар

                      Порт открыт, ДНС правильно настроил, все равно не работает.

  26. Аватар

    Привет, сделал по твоим конфигам, возникла проблема авторизации. Не заходит, в почту, ни под одним пользователем, пишет, что неверный логин/пароль. И папка с почтой(доменом) в /mnt/mail не создается. В базе все пользователи есть

    • Zerox

      Надо лог postfix и dovecot смотреть и разбираться предметно. Где-то шибка. Статья рабочая.

  27. Аватар

    Добрый день! Настройку Postfix+Dovecot делал по вашему мануалу. Отправка почты работает, но входящая не идет.
    В логах Dovecot ошибок нет. В maillog следущее: Dec 28 11:06:22 mailsrv postfix/smtpd[5062]: connect from mail-ot1-f49.google.com[209.85.210.49]
    Dec 28 11:06:22 mailsrv postfix/smtpd[5062]: 72DB46074252: client=mail-ot1-f49.google.com[209.85.210.49]
    Dec 28 11:06:22 mailsrv postfix/cleanup[5065]: 72DB46074252: message-id=
    Dec 28 11:06:22 mailsrv postfix/qmgr[4957]: 72DB46074252: from=, size=2487, nrcpt=1 (queue active)
    Dec 28 11:06:22 mailsrv postfix/local[5066]: 72DB46074252: to=, orig_to=, relay=local, delay=0.32, delays=0.26/0.01/0/0.05, dsn=2.0.0, status=sent (delivered to mailbox)
    Dec 28 11:06:22 mailsrv postfix/qmgr[4957]: 72DB46074252: removed
    Dec 28 11:06:22 mailsrv postfix/smtpd[5062]: disconnect from mail-ot1-f49.google.com[209.85.210.49] В ящике входящих пусто

    • Zerox

      Чудес не бывает. Письмо положено в ящик — (delivered to mailbox)
      Я еще ни разу не видел, чтобы по логам чисто, а в ящике пусто. Где-то что-то напутано.

  28. Аватар

    Здравствуйте, у меня в journalctl -xe появились вот такие ошибки:
    дек 16 17:05:46 Server postfix/smtpd[21664]: connect from mail-lj1-f172.google.com[209.85.208.172]
    дек 16 17:05:46 Server postfix/smtpd[21664]: Anonymous TLS connection established from mail-lj1-f172.google.com[209.85.208.172]: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    дек 16 17:05:46 Server postfix/smtpd[21664]: 6AC91CE06FE: client=mail-lj1-f172.google.com[209.85.208.172]
    дек 16 17:05:46 Server postfix/cleanup[21673]: 6AC91CE06FE: message-id=
    дек 16 17:05:46 Server postfix/qmgr[21636]: 6AC91CE06FE: from=, size=13300, nrcpt=2 (queue active)
    дек 16 17:05:46 Server postfix/smtpd[21664]: disconnect from mail-lj1-f172.google.com[209.85.208.172] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
    дек 16 17:05:46 Server postfix/pipe[21676]: 6AC91CE06FE: to=, relay=dovecot, delay=0.31, delays=0.2/0.01/0/0.1, dsn=2.0.0, status=sent (delivered via dovecot service (lda(all_in@mysite.com,)Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission ))
    дек 16 17:05:46 Server postfix/pipe[21677]: 6AC91CE06FE: to=, relay=dovecot, delay=0.32, delays=0.2/0.02/0/0.09, dsn=2.0.0, status=sent (delivered via dovecot service (lda(username@mysite.com,)Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission d))
    дек 16 17:05:46 Server postfix/qmgr[21636]: 6AC91CE06FE: removed
    На отправку/приём писем это не влияет, но всё же хотелось бы узнать в чём проблемы.
    Dovecot 2.3.4
    Postfix 3.3.2

    • Zerox

      Вот на этот сокет у dovecot или postfix нет доступа.
      Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission
      За что он отвечает, не знаю, надо погуглить и почитать. Может это баг, а может реально права стоят не правильные. Раз все работает, значит сокет от не критичной службы.

      • Аватар

        Ну по сути это сервис собирающий статистику и в инете о нём информация толком отсутствует, но всё равно спасибо за ответ.

  29. Аватар

    Встречались упоминания в комментариях к этой статье по поводу exim’a, может кто-то поделится рабочим конфигом exim? Настроено exim+dovecot+mysql+postfixadmin. Уже месяц бьюсь не могу решить проблему. Все тесты сервер проходит: сервер не является публичным пересыльщиком почты, прикрутил spf, dkim, dmarc, user’s на proxy и каждую ночь ip попадает в блэклист абузы (abuseat.org), в логах ничего нет.

  30. Аватар

    Добрый день.
    Уважаемый гуру)) у меня возникла ситуация. Что от одного заказчика стало с одной почты очень много писем генеррэироваться. По 20 тысяч в день при помощи жиры. Нагрузка очень большая и очень важные письма с того же домена сталкивался попадать в какую то невидимую очередь на 2 -3 часа. Какие параметры могли бы предложить увеличить пропускную способность постфткса? Большое спасибо за наводку. Экспериментировал с параметрами эффекта нужного не дало.

    • Zerox

      20 тысяч в день это небольшая нагрузка. Надо смотреть, что там в моменте. Но даже если разом приходит 1000 писем, то postfix такую очередь разгребает минут за 10 даже при очень слабой конфигурации. Надо смотреть, в чем конкретно проблема и где возникают задержки. Универсальный совет — добавить памяти и процессора. Но может и диск тормозить.

      • Аватар

        Ну у меня сейчас там 2 проца выделено, но в перспективе переезд на более слабый сервер. Где максимум 2 ядра будет выделено, правда у них частота выше. Оперативки 2 гига и больше не получится сделать. Ну с диском я тоже к сожалению ничего сделать не могу. Ну как хоть попытаться повысить скорость обработки очереди. Вот сегодня в 12 пришло сообщение которое было отправлено вчера в 17:00, а за 5 минут до него дошло сообщение отправленное сегодня в 9:00.

        • Zerox

          Так надо логи смотреть, когда пришло письмо на сервер, сколько висело в очереди и по какой причине. Мониторить размер очереди, время ее сокращения. Без этого невозможно сделать какие-то выводы. Но если есть приличная нагрузка и большая очередь писем, то 2 гб памяти однозначно мало.

          • Аватар

            Исходящая очередь понятно как мониторить mailq (тут от силы 1 — 2 письма за день).
            А как входящую?
            Лог файл письма которое отправлено от клиента в 9:30
            «Dec 5 11:12:28 mail postfix/smtpd[36407]: C9065300068F5: client=mx1.roskazna.ru[83.229.175.71]
            Dec 5 11:13:08 mail postfix/cleanup[45270]: C9065300068F5: message-id=
            Dec 5 11:13:08 mail opendkim[820]: C9065300068F5: mx1.roskazna.ru [83.229.175.71] not internal
            Dec 5 11:13:08 mail opendkim[820]: C9065300068F5: not authenticated
            Dec 5 11:13:08 mail opendkim[820]: C9065300068F5: no signature data
            Dec 5 11:13:08 mail postfix/qmgr[45084]: C9065300068F5: from=, size=8546, nrcpt=2 (queue active)
            Dec 5 11:13:09 mail postfix/pipe[45280]: C9065300068F5: to=, relay=dovecot, delay=60, delays=60/0/0/0.23, dsn=2.0.0, status=sent (delivered via dovecot service)
            Dec 5 11:13:09 mail postfix/pipe[45281]: C9065300068F5: to=, relay=dovecot, delay=60, delays=60/0/0/0.25, dsn=2.0.0, status=sent (delivered via dovecot service)
            Dec 5 11:13:09 mail postfix/qmgr[45084]: C9065300068F5: removed
            «

            • Zerox

              По логу видно, что сервер быстро принял и положил письмо в ящик. Может проблема не на принимающей стороне, а на отправляющем сервере?

              • Аватар

                Ситуация следующая это р*сказна, думаю у них там не один почтовый сервер. Начали с одного ящика кучу бесполезных уведомлений слать на наших 20 почтовых ящиков, это и есть та куча писем. Мы с ними связались попросили это отключить или вернуть как было ноль реакции, вот заблокировал их одну почтовую учетку для рассылки. Но теперь получается они отправляют, мой сервер шлёт им запрос что письмо не принято, потом их сервер шлёт что эта почтовая учетка не принимает письма.
                Может быть можно как то посмотреть более подробный лог и там что то будет понятно. У меня стоит log level 2.

                • Zerox

                  Так а что посмотреть хочется в логах? Если они шлют вам письма и не получается договориться, то лучше все же не блокировать учетки, а принимать все письма, а левые сразу каким-нибудь фильтром уже в ящике сразу удалять. Тогда хоть будет понятно, что все письма доходят. Опять же, по логу, вы письмо сразу же приняли. Если у вас нет на сервере проблем и от других серверов письма не застревают, то скорее всего это не ваша проблема, а сервера, который отправляет письма. У него огромная очередь отправки и он тормозит, поэтому к вам письма приходят с опозданием.

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

                  • Аватар

                    Огромное спасибо за уделенное время. После ваших слов у меня появилось больше уверенности для разговора с ними и доказательства что у них что то не так.

  31. Аватар

    Zerox
    Подскажите, пожалуйста, сколько все это великолепие кушает ресурсов? Я имею ввиду весь стек из статьи со всеми web панелями и процессами MySQL. Интересует RAM, CPU.

    • Zerox

      Очень мало. Начинать можно с 1 cpu и 1 gm ram. 50 пользователей запросто тянет конфа с 2 cpu, 4gb ram. Тут больше вопрос к производительности диска. Но до 100 юзеров даже одиночный sata диск справится без проблем.

  32. Аватар
    Александр

    Добрый день!
    Ставил все с 0, шел по вашим статьям и погиб на настройке Dovecot

    Все шло успешно до проверки отправленой почты:
    cat /var/log/maillog

    Nov 27 06:28:26 mail postfix/postfix-script[1007]: starting the Postfix mail system
    Nov 27 06:28:26 mail postfix/master[1013]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 03:31:53 mail postfix/postfix-script[27823]: stopping the Postfix mail system
    Nov 29 03:31:53 mail postfix/master[1013]: terminating on signal 15
    Nov 29 03:31:53 mail postfix/postfix-script[27905]: starting the Postfix mail system
    Nov 29 03:31:53 mail postfix/master[27907]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 03:31:59 mail dovecot: master: Error: service(auth): unlink(/var/run/dovecot/auth-master) failed: Is
    Nov 29 03:31:59 mail dovecot: master: Fatal: Failed to start listeners
    Nov 29 03:37:28 mail postfix/postfix-script[28021]: stopping the Postfix mail system
    Nov 29 03:37:28 mail postfix/master[27907]: terminating on signal 15
    Nov 29 03:37:28 mail postfix/postfix-script[28103]: starting the Postfix mail system
    Nov 29 03:37:28 mail postfix/master[28105]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 03:37:35 mail dovecot: master: Error: service(auth): unlink(/var/run/dovecot/auth-master) failed: Is
    Nov 29 03:37:35 mail dovecot: master: Fatal: Failed to start listeners
    Nov 29 03:45:15 mail postfix/postfix-script[28254]: stopping the Postfix mail system
    Nov 29 03:45:15 mail postfix/master[28105]: terminating on signal 15
    Nov 29 03:45:15 mail postfix/postfix-script[28335]: starting the Postfix mail system
    Nov 29 03:45:15 mail postfix/master[28337]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 03:45:22 mail dovecot: master: Error: service(auth): unlink(/var/run/dovecot/auth-master) failed: Is
    Nov 29 03:45:22 mail dovecot: master: Fatal: Failed to start listeners
    Nov 29 04:07:34 mail postfix/smtpd[28846]: connect from mail[::1]
    Nov 29 04:07:34 mail postfix/smtpd[28846]: 5537F4696FC: client=mail[::1]
    Nov 29 04:07:34 mail postfix/cleanup[28849]: 5537F4696FC: message-id=<20181129040734.5537F4696FC@mail.locald
    Nov 29 04:07:34 mail postfix/qmgr[28339]: 5537F4696FC: from=, size=450, nrcpt=1 (queue act
    Nov 29 04:07:34 mail postfix/smtpd[28846]: disconnect from mail[::1]
    Nov 29 04:07:36 mail postfix/smtp[28850]: 5537F4696FC: to=, relay=mxs.mail.ru[94.109, dsn=5.0.0, status=bounced (host mxs.mail.ru[94.100.180.31] said: 550 non-local sender verification failed
    Nov 29 04:07:36 mail postfix/cleanup[28849]: 693C145C30B: message-id=<20181129040736.693C145C30B@mail.locald
    Nov 29 04:07:36 mail postfix/bounce[28851]: 5537F4696FC: sender non-delivery notification: 693C145C30B
    Nov 29 04:07:36 mail postfix/qmgr[28339]: 693C145C30B: from=, size=2371, nrcpt=1 (queue active)
    Nov 29 04:07:36 mail postfix/qmgr[28339]: 5537F4696FC: removed
    Nov 29 04:07:36 mail postfix/smtp[28850]: warning: no MX host for cheapcat.ru has a valid address record
    Nov 29 04:07:36 mail postfix/smtp[28850]: 693C145C30B: to=, relay=none, delay=0.14, delaysomain name not found. Name service error for name=mail.cheapcat.ru type=AAAA: Host found but no data record
    Nov 29 04:07:36 mail postfix/qmgr[28339]: 693C145C30B: removed
    Nov 29 04:42:06 mail postfix/postfix-script[29317]: stopping the Postfix mail system
    Nov 29 04:42:06 mail postfix/master[28337]: terminating on signal 15
    Nov 29 04:42:06 mail postfix/postfix-script[29399]: starting the Postfix mail system
    Nov 29 04:42:06 mail postfix/master[29401]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 08:16:08 mail postfix/postfix-script[792]: stopping the Postfix mail system
    Nov 29 08:16:08 mail postfix/master[29401]: terminating on signal 15
    Nov 29 08:16:08 mail postfix/postfix-script[873]: starting the Postfix mail system
    Nov 29 08:16:08 mail postfix/master[875]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 08:30:36 mail postfix/postfix-script[1169]: stopping the Postfix mail system
    Nov 29 08:30:36 mail postfix/master[875]: terminating on signal 15
    Nov 29 08:30:36 mail postfix/postfix-script[1251]: starting the Postfix mail system
    Nov 29 08:30:37 mail postfix/master[1253]: daemon started — version 2.10.1, configuration /etc/postfix
    Nov 29 08:43:22 mail postfix/postfix-script[1417]: stopping the Postfix mail system
    Nov 29 08:43:22 mail postfix/master[1253]: terminating on signal 15
    Nov 29 08:43:22 mail postfix/postfix-script[1498]: starting the Postfix mail system
    Nov 29 08:43:22 mail postfix/master[1500]: daemon started — version 2.10.1, configuration /etc/postfix

    Вот такой ответ мне дает.
    И залогиниться в не могу. Просто гворит, что не найден такой ящик.
    Но письма на сервер уходят

    • Zerox

      Где-то что-то напутано. Тут и dovecot не стартует, и в postfix ошибки. Наверняка где-то ошибки в конфигах. Можно либо гуглить ошибки в логах и исправлять, либо все с нуля аккуратно настраивать.

  33. Аватар

    Привет! Спасибо за хорошие и очень понятные статьи.

    Столкнулся с проблемой — opendkim[7426]: opendkim: /etc/opendkim.conf: refile:/etc/postfix/dkim/signingtable: dkimf_db_open(): Permission denied
    Устанавливал по данной статье один в один, ну только доменное имя другое, само собой.
    При чем, уже третий сервер настраиваю по этому мануалу, но вот ошибку эту побороть не могу.
    Права все указал, как в статье. Куда копать?
    Гугл не очень помогает, раз я решил написать тут (

    • Zerox

      Так а чем тут помочь? Четко написано — проблемы с правами доступа к файлу /etc/postfix/dkim/signingtable, сервис dkim не может его прочитать.

      • Аватар

        В том то и дело, что права выставлены, какие и требуются. Я бы по ерунде не писал(
        # ls-l
        -rw-r—— 1 root opendkim 93 Nov 26 01:23 keytable
        -r—r—— 1 root opendkim 887 Nov 26 01:22 mail.[domainname].private
        -rw-r—r— 1 root opendkim 311 Nov 26 01:22 mail.[domaiiname].txt
        -rw-r—— 1 root opendkim 45 Nov 26 01:24 signingtable
        пользователь opendkim, postfix и root в группе opendkim. Права на чтение есть у всех.
        Opendkim запускается от opendkim:opendkim.
        Но все тщетно… Я уже какие только права не ставил. Даже 777 ради эксперимента.
        Пробовал также удалять и заново устанавливать opendkim.

        • Zerox

          А в саму директорию с самого корня диска есть доступ у opendkim?

          • Аватар

            [root@mail etc]# ls -l /
            total 28
            lrwxrwxrwx. 1 root root 7 Nov 19 16:15 bin -> usr/bin
            dr-xr-xr-x. 5 root root 4096 Nov 21 23:49 boot
            drwxr-xr-x 21 root root 3440 Nov 25 23:32 dev
            drwxr-xr-x. 107 root root 8192 Nov 27 15:32 etc
            drwxr-xr-x. 118 root root 4096 Nov 27 00:15 home
            lrwxrwxrwx. 1 root root 7 Nov 19 16:15 lib -> usr/lib
            lrwxrwxrwx. 1 root root 9 Nov 19 16:15 lib64 -> usr/lib64
            drwxr-xr-x. 2 root root 6 Apr 11 2018 media
            drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
            drwxr-xr-x. 3 root root 16 Nov 21 23:48 opt
            dr-xr-xr-x 229 root root 0 Nov 25 23:32 proc
            dr-xr-x—. 8 root root 276 Nov 26 23:27 root
            drwxr-xr-x 34 root root 980 Nov 27 05:28 run
            lrwxrwxrwx. 1 root root 8 Nov 19 16:15 sbin -> usr/sbin
            drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
            dr-xr-xr-x 13 root root 0 Nov 27 15:02 sys
            drwxrwxrwt. 14 root root 4096 Nov 27 15:33 tmp
            drwxr-xr-x. 13 root root 155 Nov 19 16:15 usr
            drwxr-xr-x. 23 root root 4096 Nov 26 23:20 var
            drwxr-xr-x 6 apache apache 83 Nov 25 00:57 web
            ———————————————————————
            [root@mail etc]# ls -l | grep opendkim
            drwxr-xr-x 3 root opendkim 74 Nov 26 01:19 opendkim
            -rw-r—r— 1 root opendkim 396 Nov 26 23:37 opendkim.conf
            ———————————————————————
            [root@mail etc]# ls -l | grep postfix
            drw-r—r—. 5 root root 4096 Nov 26 01:30 postfix
            ———————————————————————
            [root@mail etc]# getent group | grep root
            root:x:0:opendkim
            opendkim:x:988:postfix,root,opendkim

            Даже будучи в группе root, сервис не запускается (
            Оставлю так, пожалуй…

  34. Аватар

    К сожалению, старую скачать не удается(
    Может у Вас есть рабочая ссылка на старую версию?

    Заранее благодарен.

  35. Аватар
    Дмитрий

    Добрый день!
    Подскажите пожалуйста, может конечно я где-то накосячил.
    Делал по вашим инструкциям https://serveradmin.ru/ustanovka-lamp-apache-php-mysql-v-centos-7/
    После этого, настроил на этом же сервере Zabbix, он работает, но когда начал ставить postfix-3,2
    Столкнулся с проблемой
    «$CONF[‘configured’] = true; $CONF[‘default_language’] = ‘ru’; $CONF[‘database_type’] = ‘mysqli’; $CONF[‘database_host’] = ‘localhost’; $CONF[‘database_user’] = ‘postfix’; $CONF[‘database_password’] = ‘123456789’; $CONF[‘database_name’] = ‘postfix’; $CONF[‘admin_email’] = ‘pivkin_ds@maxisvet.com’; $CONF[‘encrypt’] = ‘md5crypt’; $CONF[‘default_aliases’] = array ( ‘abuse’ => ‘root’, ‘hostmaster’ => ‘root’, ‘postmaster’ => ‘root’, ‘webmaster’ => ‘root’ ); $CONF[‘domain_path’] = ‘YES’; $CONF[‘domain_in_mailbox’] = ‘YES’;»
    Как ее победить?
    При этом Zabbix работает без проблем.

    Заранее спасибо за помощь.

    • Аватар
      Дмитрий

      Вот более точный ответ от postfix
      «$CONF[‘configured’] = true; $CONF[‘default_language’] = ‘ru’; $CONF[‘database_type’] = ‘mysqli’; $CONF[‘database_host’] = ‘localhost’; $CONF[‘database_user’] = ‘postfix’; $CONF[‘database_password’] = ‘asWQgfRT123!’; $CONF[‘database_name’] = ‘postfix’; $CONF[‘admin_email’] = ‘pivkin_ds@maxisvet.com’; $CONF[‘encrypt’] = ‘md5crypt’; $CONF[‘default_aliases’] = array ( ‘abuse’ => ‘root’, ‘hostmaster’ => ‘root’, ‘postmaster’ => ‘root’, ‘webmaster’ => ‘root’ ); $CONF[‘domain_path’] = ‘YES’; $CONF[‘domain_in_mailbox’] = ‘YES’;ERROR: the templates_c directory doesn’t exist or isn’t writeable for the webserver»

      • Zerox

        Что-то такое припоминаю, сталкивался. Если не ошибаюсь, то это с новой версией postfixadmin ошибка. Не дошли руки поправить статью. Как вариант, использовать туже версию postfixadmin, что в статье. Принципиальных отличий все равно не.

  36. Аватар

    Здравствуйте, после пункта «а также проверяем работу phpmyadmin — http://188.35.19.125/phpmyadmin/. Его нужно настроить, об этом рассказано в статье, которую я привел чуть выше.» Я прошел по ссылке и обнаружил, что в результате после установки phpmyadmin у меня в каталоге /etc/httpd/conf.d/ не появился конфиг phpMyAdmin.conf

    С чем это может быть связано?

    • Аватар

      C этим разобрался, не устанавливался phpMyAdmin без epel

      Теперь еще одна неприятность настигла(((

      http//myip/postfixadmin/setup.php

      Выдает:
      Not Found
      The requested URL /postfixadmin/setup.php was not found on this server.

      Все предыдущие шаги выполнены.

      • Zerox

        Нужно смотреть настройки веб сервера. Там ошибка.

      • Аватар

        Если вы настраивали ваш вебсервер по мануалу с этого сайта, т.е. создавали site1.ru и сделали структуру папок, как было в примере, /web/.. — то отключите ваш тестовый файл конфигурации site1.ru.conf и работа должны восстановиться и setup.php будет работать.

  37. Аватар

    привет,
    как всегда полезная инфа, уже не первый раз обращаюсь к ресурсу!

    вопрос к колеегам, а вот имея уже установленный почтовик (egroupware+postfix+dovecot+mysql) можно ли прикрутить postfixadmin (конечно, так что б он подтянул конфу почтовика)?
    вообще, у меня задача массовая смена поролей пользователей и введение политик длины пароля. вот пока не пойму, как решить
    спасибо!

    • Zerox

      Нужно смотреть структуру текущей базы данных. Если она совпадает с postfixadmin, то можно его добавить. Если нет, то нужно переносить данные из старой базы в новую для postfixadmin.

      • Аватар

        угу. была такая мысль… ок, это длинный путь, как я полнял. есть подозрение, что структура иная
        тогда, может будут идеи как с паролями решить? пока роюсь в настройках dovecot и т.д. — не вижу

        • Zerox

          У вас пользователи сами меняют свои пароли? Если не сами, то в чем проблема при выдаче пароля сразу делать сложный? Этот вопрос решается в момент создания учетки. Соответственно, настраивается в менеджере учетных записей.

          • Аватар

            сорри, я совсем не подробно все обрисовал…
            есть уже работающая система и есть уже почти 1000 пользователей. Сейчас принято решение поменять все пароли и задать политику длины пароля. вот ищу как эту политику реализовать на моей связке (postfix+egroupware+dovecot).
            вот, спросил совета, мож кто делал ;)

  38. Аватар

    Как в роундкубе сделать общую адрессную книгу, хотя бы тех контактов которые есть в базе данных постфикс (существующих контактов домена)

  39. Аватар
    Валентин

    Здравствуйте. А почему ничего не написано про DMARC?

  40. Аватар

    Добрый день, настраивал по вышей инструкции. Почта не ходит, подскажите куда смотреть?

    Sep 28 15:53:38 mail postfix/pipe[12875]: AFEDC40B31: to=, relay=dovecot, delay=361, delays=361/0.03/0/0.18, dsn=4.3.0, status=deferred (temporary failure)
    Sep 28 15:53:38 mail postfix/pipe[12876]: AFEDC40B31: to=, relay=dovecot, delay=361, delays=361/0.04/0/0.19, dsn=4.3.0, status=deferred (temporary failure)
    Sep 28 15:53:38 mail postfix/pipe[12880]: 3C9FD40B2E: to=, relay=dovecot, delay=563, delays=563/0.05/0/0.2, dsn=4.3.0, status=deferred (temporary failure)
    Sep 28 15:53:38 mail postfix/pipe[12878]: 3C9FD40B2E: to=, relay=dovecot, delay=563, delays=563/0.04/0/0.26, dsn=4.3.0, status=deferred (temporary failure)

  41. Аватар

    Не могу понять, где может быть пропущено =

    postmap: fatal: /etc/postfix/main.cf, line 758-766: missing ‘=’ after attribute name: «submission inet n — n — — smtpd -o syslog_name=postfix/submission -o smtpd_tls_wrappermode=no -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination -o milter_macro_daemon_name=ORIGINATING»
    [root@mail postfix]# systemctl restart postfix
    Job for postfix.service failed because the control process exited with error code. See «systemctl status postfix.service» and «journalctl -xe» for details.

  42. Аватар

    Добрый день, Zerox!

    алиасы прописаны как у вас.

    в postfixadmin создан алиас домен — mail.exemple.com на домен exemple.com

    есть ящик — test@exemple.com

    Я пишу на почту — test@mail.exemple.com

    Но мне приходит отбивка, что такой пользователь не найден.

    Вопрос — как проверить корректность скриптов postfix-a которые обращаются в БД mysql?

    я полагаю, что мне надо либо изменить параметры
    mydomain
    mydestination

    relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
    virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf
    mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf,
    mysql:/etc/postfix/mysql/virtual_alias_domain_catchall_maps.cf
    virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
    virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf,
    mysql:/etc/postfix/mysql/virtual_alias_domain_mailbox_maps.cf
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    mydestination = localhost.$mydomain, localhost
    myorigin = $mydomain
    mydomain = example.com
    myhostname = post.example.com

  43. Аватар

    Добрый день!

    Есть ли смысл обновлять Postfix до последней версии?
    Сейчас в CentOs 7 1804 по умолчанию Postfix версии 2.10.1, а на оф сайте последняя стабильная версия уже 3.3.

  44. Аватар

    Добрый день! Спасибо за отличную статью! Когда-то давно я поднимал почтарь на лине. Все было отлично. Сейчас поднял по Вашей статье и у меня такая проблемка. Все перепроверил/перерыл, но не могу найти решение. Это связано с сертификатами?

    Aug 16 17:32:13 mail postfix/smtpd[2018]: connect from unknown[10.0.20.3]
    Aug 16 17:32:13 mail postfix/smtpd[2018]: Anonymous TLS connection established from unknown[10.0.20.3]: TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)
    Aug 16 17:32:13 mail postfix/smtpd[2018]: NOQUEUE: reject: RCPT from unknown[10.0.20.3]: 504 5.5.2 : Helo command rejected: need fully-qualified hostname; from= to= proto=ESMTP helo=
    Aug 16 17:32:13 mail postfix/smtpd[2018]: lost connection after RCPT from unknown[10.0.20.3]
    Aug 16 17:32:13 mail postfix/smtpd[2018]: disconnect from unknown[10.0.20.3]

    Выключал iptables, к одному днс подключал, unknown просто меняется на имя машины, ошибка остается. Не могу войти почтовым клиентом. Всегда спрашивает пароль, как будто он не верен. Базы все в порядке. Кто-нибудь встречался с такой ошибкой?

    • Zerox

      Конкретно здесь вот эта ошибка:
      Helo command rejected: need fully-qualified hostname
      Она связана с настройками smtpd_helo_restrictions. С ними надо либо разобраться, либо совсем отключить. iptables тут не при чем.

  45. Аватар

    Здравствуйте, спасибо за ваш труд переодически просматриваю ваши статьи, может кто подскажет, есть iredmail на нём несколько доменов и у каждого из них свой ip, тоесть domain1.org — 1.1.1.1 domain2.org — 2.2.2.2 и получается что при отправке с domain2.org — 2.2.2.2 на условно mail.com то если посмотреть детализацию письма на mail.com видем в полях «Received: from» и «by mail» domain1.org — 1.1.1.1. тоесть, как заставить Postfix или куда копать, не использовать при отправке default hostname, а каждый домен был независимым транспортом и при этом в письме не висели хвости default hostname. Буду очень признателен за подказку уже весь инет перерил, спс.

  46. Аватар

    разобрался )))
    + прикрутил rspamd

  47. Аватар

    Еще косяк в конфиге выше

    postfix[2097]: fatal: /etc/postfix/main.cf, line 41: missing ‘=’ after attribute name: «mysql:/etc/postfix/mysq…maps.cf»

    правим на

    mysql = /etc/postfix/mysql/virtual_alias_domain_maps.cf

    и опять косяк

    postfix[2124]: /usr/sbin/postconf: warning: /etc/postfix/main.cf: unused parameter: mysql=/etc/postfix/mysql/virtual_alias _domain_maps.cf

    и ни хре на не работает

  48. Аватар

    Мало того
    Теперь для конфига нужно использовать config.local.php

    Warning: config.local.php — NOT FOUND
    It’s Recommended to store your own settings in config.local.php instead of editing config.inc.php
    Create the file, and edit as appropriate (e.g. select database type etc)

  49. Аватар

    Postfixadmin 3.2

    The requested URL /postfixadmin/setup.php was not found on this server.

    Дело в том что

    The Postfix Admin directory layout changed.
    Please update your webserver config so that the DocumentRoot or Alias points to the directory «public».

    Те теперь придется вносить доп изменения в конфиг httpd:

    https://github.com/postfixadmin/postfixadmin/issues/173

    Alias /postfixadmin/ «/var/www/html/postfixadmin/public/»

    Options FollowSymLinks
    AllowOverride None
    Allow from all
    Order allow,deny

  50. Аватар
    Евгений

    Статья шикарная!
    Но вот заработало у меня через dovecot только после добавления
    local_transport = dovecot

  51. Аватар
    Евгений

    Добавить хотел старые девайсы репорты шлют только по smtp а нужно чтобы пересылка была по smtps

  52. Аватар
    Евгений

    Отличная статья но у меня вопрос другого характера. в сетке очень много старых девайсов, стоит задача сделать некий «почтовик» который бы принимал от них репорты и пересылал на почту например яндекса. Каким образом это реализовать ?

    • Zerox

      Postfix умеет так делать. На нем можно настроить почтовый релей вообще без авторизации, если старые устройства не умеют это делать. Перечислить их по ip. Затем настроить отправку всей почты в какой-то другой ящик. Это сделать реально, но готовых инструкций у меня нет.

  53. Аватар

    В статье ошибка.

    Тк ранее хеширование паролей было отключено то соотв. в dovecot-mysql.conf нужно указать, что пароль идет прямым текстом:

    default_pass_scheme = CLEARTEXT

  54. Аватар

    Если у пользователи будет входить на почту только с помощью браузера-web интерфейс (т.е. pop3 не нужен вообще), тогда dovecot не нужен?

    • Аватар

      Не пойму зачем нужен dovecot вообще? Только для pop3?
      Будет ли это всё работать без dovecot, если на почту будем входить только с помощью бразуера-web интерфейс?

  55. Аватар

    Пришлось качать именно postfixadmin-3.0.2.tar.gz
    т.к. 3.1 — ругается на отсутствие папки tempaltes_c
    3.2 — отсутствие файла setup.php

    • Аватар

      в 3.2 setup.php находится в public/, там же создай ручками templates_c и дай права на нее

  56. Аватар

    Что такое «backupmx»?

    • Zerox

      Обычно это резервный mx сервер, у которого более низкий приоритет, по сравнению с основным. По-умолчанию вся почта идет на основной сервер, но если он не доступен, то почта будет отправляться на второй сервер.

  57. Аватар

    а зачем тут «Прошу поделиться в комментариях тем, у кого есть бОльший опыт» буква о — большая?
    чтобы не перепутали с болЬший или большИй?

  58. Аватар

    Приветствую!
    Недавно заметил небольшой косяк в настройках Postfix.
    В принципе, совсем некритичный но все же.
    Косяк касается Postfix reverse DNS lookup — https://serverfault.com/questions/911789/postfix-forced-reverse-lookup-for-incoming-connections
    При желании, если найдёте инфу полезной можете добавить в статью.

  59. Аватар
    [root@ksez ~]# cat /var/log/maillog
    Mar 30 21:59:57 mailcentos postfix/postfix-script[2847]: starting the Postfix mail system
    Mar 30 21:59:57 mailcentos postfix/master[2888]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 30 22:22:04 ksez postfix/postfix-script[2178]: starting the Postfix mail system
    Mar 30 22:22:04 ksez postfix/master[2225]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 30 22:33:55 ksez postfix/postfix-script[1107]: starting the Postfix mail system
    Mar 30 22:33:55 ksez postfix/master[1109]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 30 23:00:31 ksez postfix/smtpd[2276]: connect from localhost[::1]
    Mar 30 23:00:31 ksez postfix/smtpd[2276]: BA45340FDFCE: client=localhost[::1]
    Mar 30 23:00:31 ksez postfix/cleanup[2279]: BA45340FDFCE: message-id=
    Mar 30 23:00:31 ksez postfix/smtpd[2276]: disconnect from localhost[::1]
    Mar 30 23:00:31 ksez postfix/qmgr[1111]: BA45340FDFCE: from=, size=557, nrcpt=1 (queue active)
    Mar 30 23:00:31 ksez postfix/local[2281]: BA45340FDFCE: to=, relay=local, delay=0.04, delays=0.02/0.02/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
    Mar 30 23:00:31 ksez postfix/qmgr[1111]: BA45340FDFCE: removed
    Mar 30 23:28:40 ksez postfix/smtpd[2507]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:28:41 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2507 exit status 1
    Mar 30 23:28:41 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:29:41 ksez postfix/smtpd[2508]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:29:42 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2508 exit status 1
    Mar 30 23:29:42 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:30:42 ksez postfix/smtpd[2509]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:30:43 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2509 exit status 1
    Mar 30 23:30:43 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:31:43 ksez postfix/smtpd[2510]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:31:44 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2510 exit status 1
    Mar 30 23:31:44 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:32:44 ksez postfix/smtpd[2511]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:32:45 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2511 exit status 1
    Mar 30 23:32:45 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:33:45 ksez postfix/smtpd[2513]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:33:46 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2513 exit status 1
    Mar 30 23:33:46 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:34:46 ksez postfix/smtpd[2514]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:34:47 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2514 exit status 1
    Mar 30 23:34:47 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:35:47 ksez postfix/smtpd[2525]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:35:48 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2525 exit status 1
    Mar 30 23:35:48 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:36:48 ksez postfix/smtpd[2675]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:36:49 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2675 exit status 1
    Mar 30 23:36:49 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:37:49 ksez postfix/smtpd[2676]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:37:50 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2676 exit status 1
    Mar 30 23:37:50 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:38:50 ksez postfix/smtpd[2677]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:38:51 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2677 exit status 1
    Mar 30 23:38:51 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:39:51 ksez postfix/smtpd[2811]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:39:52 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2811 exit status 1
    Mar 30 23:39:52 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:40:52 ksez postfix/smtpd[2812]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:40:53 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2812 exit status 1
    Mar 30 23:40:53 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:41:53 ksez postfix/smtpd[2814]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:41:54 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2814 exit status 1
    Mar 30 23:41:54 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:42:55 ksez postfix/smtpd[2841]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:42:56 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2841 exit status 1
    Mar 30 23:42:56 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:43:56 ksez postfix/smtpd[2856]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:43:57 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2856 exit status 1
    Mar 30 23:43:57 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:44:57 ksez postfix/smtpd[2936]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:44:58 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2936 exit status 1
    Mar 30 23:44:58 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:45:58 ksez postfix/smtpd[2937]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:45:59 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2937 exit status 1
    Mar 30 23:45:59 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:46:59 ksez postfix/smtpd[2953]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:47:00 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2953 exit status 1
    Mar 30 23:47:00 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:48:00 ksez postfix/smtpd[2957]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:48:01 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2957 exit status 1
    Mar 30 23:48:01 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:49:01 ksez postfix/smtpd[2962]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:49:02 ksez postfix/master[1109]: warning: process /usr/libexec/postfix/smtpd pid 2962 exit status 1
    Mar 30 23:49:02 ksez postfix/master[1109]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:49:25 ksez postfix/postfix-script[2977]: stopping the Postfix mail system
    Mar 30 23:49:25 ksez postfix/master[1109]: terminating on signal 15
    Mar 30 23:49:26 ksez postfix/postfix-script[3059]: starting the Postfix mail system
    Mar 30 23:49:26 ksez postfix/master[3061]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 30 23:49:26 ksez postfix/qmgr[3063]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:49:27 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3063 exit status 1
    Mar 30 23:49:27 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:50:27 ksez postfix/qmgr[3102]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:50:28 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3102 exit status 1
    Mar 30 23:50:28 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:51:07 ksez postfix/master[3061]: warning: unix_trigger_event: read timeout for service public/qmgr
    Mar 30 23:51:28 ksez postfix/qmgr[3104]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:51:29 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3104 exit status 1
    Mar 30 23:51:29 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:52:29 ksez postfix/qmgr[3107]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:52:30 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3107 exit status 1
    Mar 30 23:52:30 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:53:30 ksez postfix/qmgr[3112]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:53:31 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3112 exit status 1
    Mar 30 23:53:31 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:54:02 ksez postfix/smtpd[3113]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:54:03 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3113 exit status 1
    Mar 30 23:54:03 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:54:31 ksez postfix/qmgr[3114]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:54:32 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3114 exit status 1
    Mar 30 23:54:32 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:55:03 ksez postfix/smtpd[3115]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:55:04 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3115 exit status 1
    Mar 30 23:55:04 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:55:32 ksez postfix/qmgr[3116]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:55:33 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3116 exit status 1
    Mar 30 23:55:33 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:56:04 ksez postfix/smtpd[3117]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:56:05 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3117 exit status 1
    Mar 30 23:56:05 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:56:33 ksez postfix/qmgr[3118]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:56:34 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3118 exit status 1
    Mar 30 23:56:34 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:57:05 ksez postfix/smtpd[3119]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:57:06 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3119 exit status 1
    Mar 30 23:57:06 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:57:34 ksez postfix/qmgr[3121]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:57:35 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3121 exit status 1
    Mar 30 23:57:35 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:58:06 ksez postfix/smtpd[3122]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:58:07 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3122 exit status 1
    Mar 30 23:58:07 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:58:35 ksez postfix/qmgr[3123]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:58:36 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3123 exit status 1
    Mar 30 23:58:36 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 30 23:59:07 ksez postfix/smtpd[3125]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:59:08 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3125 exit status 1
    Mar 30 23:59:08 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 30 23:59:36 ksez postfix/qmgr[3126]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 30 23:59:37 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3126 exit status 1
    Mar 30 23:59:37 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:00:08 ksez postfix/smtpd[3255]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:00:09 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3255 exit status 1
    Mar 31 00:00:09 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:00:37 ksez postfix/qmgr[3257]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:00:38 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3257 exit status 1
    Mar 31 00:00:38 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:01:09 ksez postfix/smtpd[3271]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:01:10 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3271 exit status 1
    Mar 31 00:01:10 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:01:38 ksez postfix/qmgr[3272]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:01:39 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3272 exit status 1
    Mar 31 00:01:39 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:02:10 ksez postfix/smtpd[3273]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:02:11 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3273 exit status 1
    Mar 31 00:02:11 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:02:39 ksez postfix/qmgr[3274]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:02:40 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3274 exit status 1
    Mar 31 00:02:40 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:03:11 ksez postfix/smtpd[3275]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:03:12 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3275 exit status 1
    Mar 31 00:03:12 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:03:41 ksez postfix/qmgr[3276]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:03:42 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3276 exit status 1
    Mar 31 00:03:42 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:04:12 ksez postfix/smtpd[3277]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:04:13 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3277 exit status 1
    Mar 31 00:04:13 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:04:42 ksez postfix/qmgr[3278]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:04:43 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3278 exit status 1
    Mar 31 00:04:43 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:05:13 ksez postfix/smtpd[3279]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:05:14 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3279 exit status 1
    Mar 31 00:05:14 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:05:43 ksez postfix/qmgr[3281]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:05:44 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3281 exit status 1
    Mar 31 00:05:44 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:06:14 ksez postfix/smtpd[3302]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:06:15 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3302 exit status 1
    Mar 31 00:06:15 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:06:44 ksez postfix/qmgr[3306]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:06:45 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3306 exit status 1
    Mar 31 00:06:45 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:07:15 ksez postfix/smtpd[3307]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:07:16 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3307 exit status 1
    Mar 31 00:07:16 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:07:45 ksez postfix/qmgr[3312]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:07:46 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3312 exit status 1
    Mar 31 00:07:46 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:08:16 ksez postfix/smtpd[3316]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:08:17 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3316 exit status 1
    Mar 31 00:08:17 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:08:46 ksez postfix/qmgr[3321]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:08:47 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3321 exit status 1
    Mar 31 00:08:47 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:09:17 ksez postfix/smtpd[3323]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:09:18 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3323 exit status 1
    Mar 31 00:09:18 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:09:47 ksez postfix/qmgr[3324]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:09:48 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3324 exit status 1
    Mar 31 00:09:48 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:10:18 ksez postfix/smtpd[3325]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:10:19 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3325 exit status 1
    Mar 31 00:10:19 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:10:48 ksez postfix/qmgr[3327]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:10:49 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3327 exit status 1
    Mar 31 00:10:49 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:11:19 ksez postfix/smtpd[3328]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:11:20 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3328 exit status 1
    Mar 31 00:11:20 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:11:49 ksez postfix/qmgr[3329]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:11:50 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3329 exit status 1
    Mar 31 00:11:50 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:12:20 ksez postfix/smtpd[3330]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:12:21 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3330 exit status 1
    Mar 31 00:12:21 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:12:50 ksez postfix/qmgr[3346]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:12:51 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3346 exit status 1
    Mar 31 00:12:51 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:13:21 ksez postfix/smtpd[3356]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:13:22 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3356 exit status 1
    Mar 31 00:13:22 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:13:51 ksez postfix/qmgr[3358]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:13:52 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3358 exit status 1
    Mar 31 00:13:52 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:14:22 ksez postfix/smtpd[3359]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:14:23 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3359 exit status 1
    Mar 31 00:14:23 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:14:52 ksez postfix/qmgr[3360]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:14:53 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3360 exit status 1
    Mar 31 00:14:53 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:15:23 ksez postfix/smtpd[3361]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:15:24 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3361 exit status 1
    Mar 31 00:15:24 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:15:53 ksez postfix/qmgr[3362]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:15:54 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3362 exit status 1
    Mar 31 00:15:54 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:16:24 ksez postfix/smtpd[3363]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:16:25 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3363 exit status 1
    Mar 31 00:16:25 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:16:54 ksez postfix/qmgr[3365]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:16:55 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3365 exit status 1
    Mar 31 00:16:55 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:17:25 ksez postfix/smtpd[3366]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:17:26 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3366 exit status 1
    Mar 31 00:17:26 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:17:55 ksez postfix/qmgr[3367]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:17:56 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3367 exit status 1
    Mar 31 00:17:56 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:18:26 ksez postfix/smtpd[3368]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:18:27 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3368 exit status 1
    Mar 31 00:18:27 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:18:56 ksez postfix/qmgr[3374]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:18:57 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3374 exit status 1
    Mar 31 00:18:57 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:19:27 ksez postfix/smtpd[3375]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:19:28 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3375 exit status 1
    Mar 31 00:19:28 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:19:58 ksez postfix/qmgr[3376]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:19:59 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3376 exit status 1
    Mar 31 00:19:59 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:20:28 ksez postfix/smtpd[3377]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:20:29 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3377 exit status 1
    Mar 31 00:20:29 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:20:59 ksez postfix/qmgr[3378]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:21:00 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3378 exit status 1
    Mar 31 00:21:00 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:21:29 ksez postfix/smtpd[3379]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:21:30 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3379 exit status 1
    Mar 31 00:21:30 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:22:00 ksez postfix/qmgr[3381]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:22:01 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3381 exit status 1
    Mar 31 00:22:01 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:22:30 ksez postfix/smtpd[3382]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:22:31 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3382 exit status 1
    Mar 31 00:22:31 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:23:01 ksez postfix/qmgr[3383]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:23:02 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3383 exit status 1
    Mar 31 00:23:02 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:23:31 ksez postfix/smtpd[3384]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:23:32 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3384 exit status 1
    Mar 31 00:23:32 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:24:02 ksez postfix/qmgr[3385]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:24:03 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3385 exit status 1
    Mar 31 00:24:03 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:24:32 ksez postfix/smtpd[3386]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:24:33 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3386 exit status 1
    Mar 31 00:24:33 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:25:03 ksez postfix/qmgr[3388]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:25:04 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3388 exit status 1
    Mar 31 00:25:04 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:25:33 ksez postfix/smtpd[3389]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:25:34 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3389 exit status 1
    Mar 31 00:25:34 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:26:04 ksez postfix/qmgr[3390]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:26:05 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3390 exit status 1
    Mar 31 00:26:05 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:26:34 ksez postfix/smtpd[3391]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:26:35 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3391 exit status 1
    Mar 31 00:26:35 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:27:05 ksez postfix/qmgr[3392]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:27:06 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3392 exit status 1
    Mar 31 00:27:06 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:27:35 ksez postfix/smtpd[3393]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:27:36 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3393 exit status 1
    Mar 31 00:27:36 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:28:06 ksez postfix/qmgr[3394]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:28:07 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3394 exit status 1
    Mar 31 00:28:07 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:28:36 ksez postfix/smtpd[3395]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:28:37 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3395 exit status 1
    Mar 31 00:28:37 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:29:07 ksez postfix/qmgr[3396]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:29:08 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3396 exit status 1
    Mar 31 00:29:08 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:29:37 ksez postfix/smtpd[3397]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:29:38 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3397 exit status 1
    Mar 31 00:29:38 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:30:08 ksez postfix/qmgr[3398]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:30:09 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3398 exit status 1
    Mar 31 00:30:09 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:30:38 ksez postfix/smtpd[3399]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:30:39 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3399 exit status 1
    Mar 31 00:30:39 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:31:09 ksez postfix/qmgr[3400]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:31:10 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3400 exit status 1
    Mar 31 00:31:10 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:31:39 ksez postfix/smtpd[3401]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:31:40 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3401 exit status 1
    Mar 31 00:31:40 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:32:10 ksez postfix/qmgr[3402]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:32:11 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3402 exit status 1
    Mar 31 00:32:11 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:32:40 ksez postfix/smtpd[3404]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:32:41 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3404 exit status 1
    Mar 31 00:32:41 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:33:11 ksez postfix/qmgr[3405]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:33:12 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3405 exit status 1
    Mar 31 00:33:12 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:33:41 ksez postfix/smtpd[3406]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:33:42 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3406 exit status 1
    Mar 31 00:33:42 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:34:12 ksez postfix/qmgr[3407]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:34:13 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3407 exit status 1
    Mar 31 00:34:13 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:34:42 ksez postfix/smtpd[3408]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:34:43 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3408 exit status 1
    Mar 31 00:34:43 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:35:13 ksez postfix/qmgr[3409]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:35:14 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3409 exit status 1
    Mar 31 00:35:14 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:35:43 ksez postfix/smtpd[3410]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:35:44 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3410 exit status 1
    Mar 31 00:35:44 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:36:14 ksez postfix/qmgr[3427]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:36:15 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3427 exit status 1
    Mar 31 00:36:15 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:36:45 ksez postfix/smtpd[3433]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:36:46 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3433 exit status 1
    Mar 31 00:36:46 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:37:15 ksez postfix/qmgr[3434]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:37:16 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3434 exit status 1
    Mar 31 00:37:16 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:37:46 ksez postfix/smtpd[3440]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:37:47 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3440 exit status 1
    Mar 31 00:37:47 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:38:16 ksez postfix/qmgr[3441]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:38:17 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3441 exit status 1
    Mar 31 00:38:17 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:38:47 ksez postfix/smtpd[3444]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:38:48 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3444 exit status 1
    Mar 31 00:38:48 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:39:17 ksez postfix/qmgr[3445]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:39:18 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3445 exit status 1
    Mar 31 00:39:18 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:39:48 ksez postfix/smtpd[3446]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:39:49 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/smtpd pid 3446 exit status 1
    Mar 31 00:39:49 ksez postfix/master[3061]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling
    Mar 31 00:40:18 ksez postfix/qmgr[3452]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:40:19 ksez postfix/master[3061]: warning: process /usr/libexec/postfix/qmgr pid 3452 exit status 1
    Mar 31 00:40:19 ksez postfix/master[3061]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:40:30 ksez postfix[3460]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:40:31 ksez postfix/master[3061]: terminating on signal 15
    Mar 31 00:40:32 ksez postfix/sendmail[3465]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:40:32 ksez postfix[3472]: fatal: /etc/postfix/main.cf, line 688: missing '=' after attribute name: "mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf"
    Mar 31 00:44:33 ksez postfix/sendmail[3543]: fatal: /etc/postfix/main.cf, line 701: missing '=' after attribute name: "permit_sasl_authenticated,"
    Mar 31 00:44:33 ksez postfix[3549]: fatal: /etc/postfix/main.cf, line 701: missing '=' after attribute name: "permit_sasl_authenticated,"
    Mar 31 00:46:03 ksez postfix/postfix-script[3656]: starting the Postfix mail system
    Mar 31 00:46:03 ksez postfix/master[3658]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 31 00:46:03 ksez postfix/qmgr[3660]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:46:04 ksez postfix/master[3658]: warning: process /usr/libexec/postfix/qmgr pid 3660 exit status 1
    Mar 31 00:46:04 ksez postfix/master[3658]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:47:04 ksez postfix/qmgr[3662]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:47:05 ksez postfix/master[3658]: warning: process /usr/libexec/postfix/qmgr pid 3662 exit status 1
    Mar 31 00:47:05 ksez postfix/master[3658]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:47:44 ksez postfix/master[3658]: warning: unix_trigger_event: read timeout for service public/qmgr
    Mar 31 00:48:05 ksez postfix/qmgr[3663]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:48:06 ksez postfix/master[3658]: warning: process /usr/libexec/postfix/qmgr pid 3663 exit status 1
    Mar 31 00:48:06 ksez postfix/master[3658]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:49:06 ksez postfix/qmgr[3665]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:49:07 ksez postfix/master[3658]: warning: process /usr/libexec/postfix/qmgr pid 3665 exit status 1
    Mar 31 00:49:07 ksez postfix/master[3658]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:50:07 ksez postfix/qmgr[3683]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:50:08 ksez postfix/master[3658]: warning: process /usr/libexec/postfix/qmgr pid 3683 exit status 1
    Mar 31 00:50:08 ksez postfix/master[3658]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:51:08 ksez postfix/qmgr[3684]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:51:09 ksez postfix/master[3658]: warning: process /usr/libexec/postfix/qmgr pid 3684 exit status 1
    Mar 31 00:51:09 ksez postfix/master[3658]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:51:48 ksez postfix/postfix-script[3700]: stopping the Postfix mail system
    Mar 31 00:51:48 ksez postfix/master[3658]: terminating on signal 15
    Mar 31 00:51:48 ksez postfix/postfix-script[3782]: starting the Postfix mail system
    Mar 31 00:51:48 ksez postfix/master[3784]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 31 00:51:48 ksez postfix/qmgr[3786]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:51:49 ksez postfix/master[3784]: warning: process /usr/libexec/postfix/qmgr pid 3786 exit status 1
    Mar 31 00:51:49 ksez postfix/master[3784]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:52:49 ksez postfix/qmgr[3805]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:52:50 ksez postfix/master[3784]: warning: process /usr/libexec/postfix/qmgr pid 3805 exit status 1
    Mar 31 00:52:50 ksez postfix/master[3784]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:53:10 ksez postfix/postfix-script[3821]: stopping the Postfix mail system
    Mar 31 00:53:10 ksez postfix/master[3784]: terminating on signal 15
    Mar 31 00:53:10 ksez postfix/postfix-script[3903]: starting the Postfix mail system
    Mar 31 00:53:10 ksez postfix/master[3905]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 31 00:53:10 ksez postfix/qmgr[3907]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:53:11 ksez postfix/master[3905]: warning: process /usr/libexec/postfix/qmgr pid 3907 exit status 1
    Mar 31 00:53:11 ksez postfix/master[3905]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:54:12 ksez postfix/qmgr[3909]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:54:13 ksez postfix/master[3905]: warning: process /usr/libexec/postfix/qmgr pid 3909 exit status 1
    Mar 31 00:54:13 ksez postfix/master[3905]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:54:51 ksez postfix/master[3905]: warning: unix_trigger_event: read timeout for service public/qmgr
    Mar 31 00:55:13 ksez postfix/qmgr[3910]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:55:14 ksez postfix/master[3905]: warning: process /usr/libexec/postfix/qmgr pid 3910 exit status 1
    Mar 31 00:55:14 ksez postfix/master[3905]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:56:14 ksez postfix/qmgr[3928]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:56:15 ksez postfix/master[3905]: warning: process /usr/libexec/postfix/qmgr pid 3928 exit status 1
    Mar 31 00:56:15 ksez postfix/master[3905]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:57:15 ksez postfix/qmgr[3930]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:57:16 ksez postfix/master[3905]: warning: process /usr/libexec/postfix/qmgr pid 3930 exit status 1
    Mar 31 00:57:16 ksez postfix/master[3905]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:58:16 ksez postfix/qmgr[3931]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:58:17 ksez postfix/master[3905]: warning: process /usr/libexec/postfix/qmgr pid 3931 exit status 1
    Mar 31 00:58:17 ksez postfix/master[3905]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    Mar 31 00:59:13 ksez postfix/postfix-script[1276]: starting the Postfix mail system
    Mar 31 00:59:13 ksez postfix/master[1278]: daemon started -- version 2.10.1, configuration /etc/postfix
    Mar 31 00:59:13 ksez postfix/qmgr[1323]: fatal: /etc/postfix/mysql/relay_domains.cf: bad string length 0 < 1: dbname =
    Mar 31 00:59:14 ksez postfix/master[1278]: warning: process /usr/libexec/postfix/qmgr pid 1323 exit status 1
    Mar 31 00:59:14 ksez postfix/master[1278]: warning: /usr/libexec/postfix/qmgr: bad command startup -- throttling
    [root@ksez ~]#
  60. Аватар
    Арсений

    Error: Smarty template compile directory templates_c is not writable.
    Please make it writable.
    If you are using SELinux or AppArmor, you might need to adjust their setup to allow write access.

    Ничего не помогает, папку создавал пустую, права 777 давал, не хочет что-то, что делать? Ставлю версию из статьи.

    • Аватар

      По умолчанию запись в каталог содержимого apache через SELINUX запрещена. Чтобы разрешить (конечно, это многовато):

      semanage fcontext -a -t httpd_sys_rw_content_t «/var/www/html/postfixadmin(/.*)?»

      restorecon -Rv /var/www/html/postfixadmin

  61. Аватар

    Привет! У меня тут такая ошибка типа нажимаю на получение почты, а там через 30 сек говорит «Не возможно соединиться с сервером»? посоветуйте чьё ни будь?

    • Zerox

      Настройте соединение с сервером :) В ошибке все сказано. Сервер либо не запущен, либо до него нет доступа.

  62. Аватар
    Владимир

    Возникла проблема в postfixadmin
    Скачал, распаковал, по инструкции. Внес изменения в файл /var/www/html/postfixadmin/config.inc.php
    Но по адресу http://IP/postfixadmin/setup.php
    Нет доступа. т.е. «Not Found The requested URL /postfixadmin/setup.php was not found on this server.»

    Apache, php, mariadb настраивались по статье «Настройка web сервера в CentOS 7»
    php обновлен до версии 5.6 Через phpmyadmin создан пользователь postfix и база postfix.

    • Zerox

      Тут 100% проблема в настройке web сервера. Можно лог посмотреть httpd. Суть в том, что по запросу из браузера нет скриптов postfixadmin.

  63. Аватар
    Алексей

    Здравствуйте, а вы не подскажите, с помощью какого инструмента можно забрать почту из другого почтового ящика?

    • Zerox

      С помощью fetchmail можно.

      • Аватар
        Алексей

        А у вас никакой статьи по этому поводу не написано?

        • Zerox

          На эту тему ничего нет.

          • Аватар
            Алексей

            Хорошо, спасибо. А то привык к вашим статьям, всегда они приходятся по делу. У ваших статей есть только один недостаток, сайт довольно долго открывается, я думаю что из-за большого количество комментов. Попробую найти что-нибудь в инете по fetchmail.

  64. Аватар

    Привет! слушай братан. Вот Я тебя не как не понимаю, давно слижу за твои статьи и у твоих статьей есть один минус. Ты вот на данный момент рассказываешь про почту, а тут нужно использовать разных инструментов типа php phpmyadmin httpd mariadb и т.д. Потом ты говоришь Я подробно говорил про настройку httpd отдельно, вот зачем крутит новичков вокруг своих очень больших статьей?!. Просто настрой необходимое шаг за шагом, чтобы не бегать между твоими статьями. А то лично Я запутаюсь или у меня что-то не получиться. Но эта реально бесить и это правильно. Просто делай всё на одном статье.

    • Zerox

      Каждая статья всегда самодостаточна. Ссылки идут только за подробностями. А какой мне смысл писать одно и то же, как попка попугай, в каждой статье? Я дроблю статьи по темам и даю на них ссылки. Если что-то где-то изменится, то мне достаточно будет поменять одну статью, где были изменения, а не все, где есть упоминание о теме.

  65. Аватар

    Что бы раздел отпуск заработал надо сделать:
    mkdir /vmail/sieve/
    chown -R vmail:vmail /vmail/sieve/
    И в разделе фильтр включить глобально managesievis

    • Zerox

      Это указано в статье, только путь для sieve другой в конфигах стоит, соответственно, директории тоже другие создаются. Отпуск работает через модуль sieve, поэтому он однозначно должен быть включен, настроен и работать.

  66. Аватар

    Добрый день
    Подскажите плиз. С исходящими все ок.
    А со входящими траблы. Это в логе /var/log/maillog

    Feb 22 12:05:29 mail postfix/pipe[107491]: 5718C5FB5C: to=, orig_to=, relay=dovecot, delay=464, delays=464/0/0/0.03, dsn=4.3.0, status=deferred (temporary failure)
    Feb 22 12:05:29 mail postfix/pipe[107497]: 58E105FB50: to=, orig_to=, relay=dovecot, delay=2374, delays=2374/0.01/0/0.05, dsn=4.3.0, status=deferred (temporary failure)
    Feb 22 12:05:29 mail postfix/pipe[107499]: 5D97B5FB12: to=, orig_to=, relay=dovecot, delay=8819, delays=8819/0.02/0/0.06, dsn=4.3.0, status=deferred (temporary failure)
    Feb 22 12:05:29 mail postfix/pipe[107501]: 417FF5FB55: to=, orig_to=, relay=dovecot, delay=938, delays=938/0.03/0/0.06, dsn=4.3.0, status=deferred (temporary failure)

    Письмо не попадает в ящик.

    • Zerox

      Надо смотреть в логи довекота. С ним какие-то проблемы. Доставка письма в ящик осуществляется им, и в логе видно, что тут какая-то проблема.

  67. Аватар

    Здравствуйте, чтобы добавить фильтрацию по типу вложений каким инструментом можно воспользоваться?

  68. Аватар

    Доброго времени суток! Хотел спросить. Если прикрутить почтарь к ad, смогу я потом добавлять пользователей левых? Для этого еще бд надо ставить на него? Или так нельзя?

    • Zerox

      Я не понял ничего в вопросе :) Что значит прикрутить к AD? Кто такие левые пользователи? О какой БД идет речь?

      • Аватар

        Если настроить ldap, так как около 300 пользователей в офисе. Но у меня ещё куча пользователей мобильные и офисы в других городах.

        • Zerox

          Если завернуть юзеров на ldap, то придется там их создавать в любом случае. Но я ни разу не настраивал. Можно ли настроить разные бд для хранения пользователей тоже не знаю. Да я бы и не стал так делать. Создал бы просто в AD отдельный OU и там бы хранил всех, кто не имеет отношения к домену, а использует только почту.

  69. Аватар

    Здравствуйте , большое спасибо за статью , практически все получилось . Единственное , почему-то не работает отправка через Roundcube ( через почтовые клиенты все ок ) , выдает ошибку в конфигураторе Roundcube ( тот же эфект и через веб-панель ) SMTP send: NOT OK(Failed to add recipient ‘test@gmail.com’. 4.7.1 : Relay access denied (Code: 454)) .

  70. Аватар

    Здравствуйте, отличная статья, дает знания но не разжевывает до состояния манной каши. Все сделал все работает, кроме функции автоответчика. У меня есть только конфиг /var/www/html/webmail/plugins/managesieve/config.inc.php.dist, в нем я нашел функцию $config[‘managesieve_vacation’] = 1; Но вкладка Отпуск в Настройках просто не появляется. И второе, при расшаривании папок по imap, классная функция кстати, если указываешь просто пользователя или Гости — все хорошо, а если Все пользователи (любые) — выскакивает ошибка «Невозможно добавить права доступа». Вроде все круто, а такая фигня весь аппетит портит. Еще раз спасибо за статью, очень толково написано

    • Zerox

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

      • Аватар

        Это да. В статье про блокировку спама с помощью postfix, не расписан пункт про smtpd_data_restrictions, вы обычно используете те настройки которые указаны по умолчанию в основной статье?

        • Zerox

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

  71. Аватар

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

    • Zerox

      Есть мысли это сделать, но увы, нет времени. Возможно когда-нибудь это будет сделано.

  72. Аватар
    Владислав

    Добрый вечер.
    Подскажите пожалуйста, как бороться с ошибкой:
    Jan 19 00:38:57 ns1 postfix/smtps/smtpd[4104]: error: unsupported dictionary type: mysql
    Jan 19 00:38:57 ns1 postfix/smtps/smtpd[4104]: warning: smtpd_sasl_auth_enable is true, but SASL support is not compiled in
    Jan 19 00:38:57 ns1 postfix/smtps/smtpd[4104]: warning: TLS has been selected, but TLS support is not compiled in

    Конфигурация:
    Postfix 3.2
    Centos 7

  73. Аватар
    Александр

    Добрый день, уважаемый Zerox, скажите пожалуйста вы настраивали штатный скрипт который в комплекте с postfix’ом идет, борюсь уже которые сутки судя по логам вроде все верно,сообщение отправляется на нужный ящик по средствам dovecot, но в ящике письма не отображаются, никак не могу отследить куда они вообще падают при сборе почты посредствам fetchmail
    по journalctl | grep dovecot выдается такое:
    янв 16 10:48:53 mail.st39.local dovecot[37491]: lda(vmail): msgid=: saved mail to operator@mail.st39.local
    var/log/maillog пишет:
    Jan 16 10:48:54 mail fetchmail[36756]: считывается сообщение myexternaldomain.ru:570 из 571 (378369 октетов) не очищено
    Jan 16 10:48:54 mail dovecot: lda(vmail): msgid=: saved mail to operator@mail.st39.local
    куда можно копать?

  74. Аватар
    Александр

    Все работает. Но ящики в папке создаются вида admin@example.ru Я хотел без Домена хранить и выставил опцию в /var/www/html/postfixadmin/config.local.php
    $CONF[‘domain_in_mailbox’] = ‘NO’;

    , но ящики все равно создаются в папке так же с доменом

  75. Аватар

    Как отключить аутентификацию из вне полностью, задрали подборщики паролей, стоит проброс портов на маршрутизаторе, но если убрать 25 порт не пойдут письма, нужно как то убрать средствами постфикса

  76. Аватар

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

  77. Аватар

    Можете помочь?
    Старался следовать этой статье.
    Dovecot соединяется, каталоги и письма в нем читает, но при попытке отправить, спустя долгое время на клиенте возникает окно «Соединение неожиданно было прервано сервером». А в логе postfix появляются такие записи:
    Dec 21 16:03:22 post postfix/smtpd[2025]: warning: SASL: Connect to smtpd failed: No such file or directory
    Dec 21 16:03:22 post postfix/smtpd[2025]: fatal: no SASL authentication mechanisms
    Dec 21 16:03:23 post postfix/master[1982]: warning: process /usr/libexec/postfix/smtpd pid 2025 exit status 1
    Dec 21 16:03:23 post postfix/master[1982]: warning: /usr/libexec/postfix/smtpd: bad command startup — throttling
    А в логах dovecot ничего(
    Где может быть ошибка?

    • Zerox

      Судя по логу, сам postfix не работает на отправку. Не могу так понять, в чем тут проблема, но ключевая строка вот эта:
      Connect to smtpd failed: No such file or directory
      Не удается подключиться к службе отправки. Надо смотреть, к какому порту подключаетесь и работает ли служба на этом порту. Смотреть с помощью:
      netstat -tulnp
      Хотя если смотреть лог дальше, то судя по всему, после попытки подключиться к smtpd, он завершает работу по какой-то причине. Надо повышать уровень логирования и смотреть на ошибки.

      • Аватар

        Нашел ошибку. Я отключал проверку сертификатов и не до конца отключил.
        Есть странность: когда я посылаю письмо в пределах локального домена неизвестному пользователю, почтовый клиент его отправляет, а postfix ставит его в очередь, естественно с диагнозом «User unknow». При этом клиенту никаких сообщений не выдается. Почему же dovecot дает отправить такое письмо и не возвращает его обратно клиенту?

        • Zerox

          Такую ситуацию разруливает postfix, не dovecot. Вообще, он должен отбойник слать, что user unknown in relay recipient table. Но подробностей этой настройки я уже не помню. Все это настраивается, надо смотреть все настройки postfix. По-умолчанию это 100% работает. Я только что проверил на одном из серверов. Надо лог postfix смотреть в момент отправки несуществующему пользователю.

          • Аватар

            Все нашел, почему он так себя ввел: я забыл выключить параметр soft_bounce = yes.
            Все настроил без сертификатов и авторизации. Но все же поддержка SSL нужна. Включил. Dovecot пускает по IMAP, но только по 993 порту. По 143 выдает отказ. Это нормально?
            Но главная проблема с авторизацией для отправки почты. Не хочет он авторизироваться хоть убей. В логах postfix пишется
            Dec 22 12:29:21 post /var/postfix/smtps/smtpd[12134]: Anonymous TLS connection established from sysadmin[192.168.0.39]: TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)
            Dec 22 12:29:21 post /var/postfix/smtps/smtpd[12134]: xsasl_dovecot_server_create: SASL service=smtp, realm=(null)
            Dec 22 12:29:21 post /var/postfix/smtps/smtpd[12134]: name_mask: noanonymous
            Dec 22 12:29:21 post /var/postfix/smtps/smtpd[12134]: xsasl_dovecot_server_connect: Connecting
            Dec 22 12:29:21 post /var/postfix/smtps/smtpd[12134]: warning: SASL: Connect to smtpd failed: No such file or directory
            Dec 22 12:29:21 post /var/postfix/smtps/smtpd[12134]: fatal: no SASL authentication mechanisms
            Dec 22 12:29:22 post postfix/master[9616]: warning: process /usr/libexec/postfix/smtpd pid 12134 exit status 1
            Dec 22 12:29:22 post postfix/master[9616]: warning: /usr/libexec/postfix/smtpd: bad command startup — throttling

            Почему нет «Connect to smtpd failed: No such file or directory»? В конфиге main.cf
            smtpd_sasl_auth_enable = yes
            smtp_sasl_security_options = noanonymous
            broken_sasl_auth_clients = yes
            smtpd_sasl_type = dovecot
            smtp_sasl_path = /var/spool/postfix/private/dovecot-auth

            файл /var/spool/postfix/private/dovecot-auth есть, права на чтение postfix есть. Никак не могу понять что не так(

  78. Аватар

    В общем дошел я до отправки писем со всеми подводными косяками что были разобрался.Но вот беда почта не ходит )
    Dec 15 20:33:26 vm1 postfix/error[9232]: warning: connect to mysql server localhost: Access denied for user ‘postfix’@’localhost’ to database ‘postfxdb’
    Dec 15 20:33:26 vm1 postfix/error[9232]: warning: mysql:/etc/postfix/mysql/relay_domains.cf: table lookup problem
    Dec 15 20:33:26 vm1 postfix/error[9232]: warning: 17FDF180F81: flush service failure
    Dec 15 20:33:50 vm1 postfix/smtpd[8826]: connect from ip и хост убрал но тут fqdn имя сервера и его ip
    Dec 15 20:33:50 vm1 postfix/trivial-rewrite[8831]: warning: mysql:/etc/postfix/mysql/relay_domains.cf: table lookup problem
    Dec 15 20:33:50 vm1 postfix/trivial-rewrite[8831]: warning: mysql:/etc/postfix/mysql/relay_domains.cf: table lookup problem
    Dec 15 20:33:50 vm1 postfix/trivial-rewrite[8831]: warning: relay_domains lookup failure
    Dec 15 20:33:50 vm1 postfix/smtpd[8826]: NOQUEUE: reject: RCPT from ip и хост убрал но тут fqdn имя сервера и его ip: 451 4.3.0 : Temporary lookup failure; from= to= proto=ESMTP helo=
    Dec 15 20:33:50 vm1 postfix/smtpd[8826]: warning: non-SMTP command from ip и хост убрал но тут fqdn имя сервера и его ip: To: test@gmail.com
    Dec 15 20:33:50 vm1 postfix/smtpd[8826]: disconnect from ip и хост убрал но тут fqdn имя сервера и его ip

    Как я понимаю сервер не посылает приветствие как поправить?

    • Zerox

      Тут же четко написано в самом начале:
      warning: connect to mysql server localhost: Access denied for user ‘postfix’@’localhost’ to database ‘postfxdb’
      У юзера postfix нет доступа к базе postfxdb.

  79. Аватар

    А в чем может быть проблема создаю пользователя админ все проходит хорошо но когда пытаюсь под ним авторизоваться ничего не происходит просто обновляется страница и все при этом нет ошибки что пароль или логин не верны?

  80. Аватар

    Добрый день!
    у меня такая проблема, имею ubuntu 12/04 LTS, работает 5 лет, настала пара перенести на другую версию сервера, сталкнулся с такой проблемой, что на новой платформе не читается пароль довекотом, не могу авторизоваться.
    подскажите, как правильно mysql базу перенести?

    • Zerox

      Проблема тут скорее всего не только в базе. База переносится стандартным способом, через дамп. Надо смотреть логи сервера на предмет ошибок авторизации и разбираться с ними.

      • Аватар

        dovecot выполняет авторизацию, подключается к бд без ошибок, достаёт из базы логин\пароль, а дальше:

        Dec 15 16:12:26 auth-worker(19067): Debug: sql(andrey.gizbrekht@ema.ru,192.168.10.140): query: SELECT username as user, password FROM mailbox WHERE username = ‘andrey.t@a.ru’
        Dec 15 16:12:26 auth-worker(19067): Info: sql(andrey.t@a.ru,192.168.10.140): Password mismatch
        Dec 15 16:12:28 auth: Debug: client passdb out: FAIL 2 user=andrey.t@a.ru

      • Аватар

        Добре!
        трабла связана скорее всего с тем, что изменилась бибилиотека, которая шифрует…
        ошибка выглядит сейчас вот так
        Dec 18 14:06:12 auth-worker(2301): Debug: sql(a@e.ru,192.168.10.110): MD5-CRYPT(mini-kuper123) != ‘$1$00436dc3$UQoR22mlFiHojeie6R2p50’

        хотя с новым пользователем всё работает.
        есть какие советы? опыт у вас есть, если поможете, готов финансово поучаствовать, в разумных пределах))

        п.с.
        вот и шифруй после этого пароли, хорошо, что у меня продакшен норм работает и это я эксперименты провожу….а если бы мне по делу пришлось восстанавливать рухнувший сервак из бэкапов??
        не совету никому шифровать пароли, ровно, как и вести базу паролей пользователей.

        • Zerox

          С шифрованием да, нюансов много. Я сам предпочитаю не шифровать пароли, если это возможно. Так посоветовать мне особо нечего. Если с новым пользователем все работает, а со старыми нет, значит на старом сервере указан другой алгоритм шифрования. Нужно просто выбрать такой же.
          В моей статье указан алгоритм CRYPT, а у тебя, судя по логу ошибки используется MD5-CRYPT.

          • Аватар

            на старом и на новом серверах стоит
            default_pass_scheme = MD5-CRYPT

            да и в любом случае, я этот параметр весь «перебрал» по очереди….

            • Zerox

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

              • Аватар

                я дампом переносил всё…..пароли на английском..
                запрос одни и тот же, локаль проверить мб….
                сейчас проверю

  81. Аватар

    DEBUG INFORMATION:
    MySQL 4.1 functions not available! (php5-mysqli installed?)
    database_type = ‘mysqli’ in config.inc.php, are you using a different database?

    Как победить?помогите!

    • Zerox

      Это откуда информация? Тут написано, что надо использовать коннектор mysqli для подключения к базе. В более старых версиях mysql, как, например, в 4.1 использовался просто mysql. Но 4.1 это очень старая версия, не понимаю, откуда она может вылезти.

      • Аватар

        Это если попытатся зайти на postfixadmin/setup.php на сервере стоит mariadb

      • Аватар

        в конфиге постфиксадмина и прописан mysqli

      • Аватар

        C ошибкой разобрался но появилась новая
        ERROR: the templates_c directory doesn’t exist or isn’t writeable for the webserver
        Причем каталог есть….

        • Zerox

          А второе условие выполняется? Веб сервер туда может писАть?

          • Аватар

            разобрался спасибо

          • Аватар

            $CONF[‘setup_password’] = ’67e46bdcc7aeb431f7af9a6d02f43352:30672e5a9deacaf505d32807b967caf9fd0c32ef’;

            я добавляю сюда хеш
            дальше добавляю пользователя Администратор указывая его почту его пароль и пароль с помощью которого получил хеш но получаю Setup password not specified correctly
            что я делаю не так?

  82. Аватар

    Автор скажи честно !!!
    зачем было тратить врем я на написание ЭТОГО гО*НА????
    такое чувство что аФФТОР НАКОПИПАСТИЛ конфигов взятых непонятно откуда и даже смысла не понимая что в них за что отвечает !!!
    по меньше бы такого мусора в инете!!!

    • Zerox

      У тебя наверняка есть статьи покруче. Показывай, я поучусь у тебя.

      • Аватар

        Да все верно !!! По круче !!!)))) Если уж ты захотел пиписьками мерятся !!!
        ПЫСЫ: твоя статья это КОПИЯ https://habrahabr.ru/post/193220/
        )))))))))))))))))

        • Zerox

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

  83. Аватар

    В # mcedit /etc/postfix/main.cf

    mynetworks = 127.0.0.0/8 ?

    пока незакомментил почта с извне не приходит.

    • Zerox

      Очень странно. Я не вижу связи между тем, что сделано и той ошибкой, что прошла :) Можете сами почитать описание этого параметра.

      • Аватар

        То есть mynetworks = 127.0.0.0/8 должна быть в конфиге?
        или нет
        если я добавляю как вы mynetworks = 127.0.0.0/8 в конфиг и смотрю ss -ntlp
        вижу что серевер слушает только локалхост по 25 порту. и ничего извне не идет.
        а так если закомментить все ай адреса.
        видимо там надо айпи внешнего интерфейса прописать

        • Zerox

          За то, какой интерфейс слушает postfix отвечают параметры:
          inet_interfaces = all
          inet_protocols = ipv4

          Параметр mynetworks отвечает за то, с каких подсетей можно отправлять почту без авторизации.

          • Аватар

            Так и не понял, в чем дело наверное очепятка в моем конфиге.
            Сейчас с этой записью как у вас в конфиге слушает по порту 25 как надо.
            Мерси боку

          • Аватар

            Тоже столкнулся с похожим моментом. По дефолту постфикс слушал на 25 порту локалхоста, а извне недоступен. inet_interfaces был localhost, при смене на all ругался, что какой-то там отсутствует.

            Наткнулся на данную ветку при решении проблемы, почитал доку по директиве mynetworks — да, ты прав, Zerox, это для релея обычно настраивается когда без авторизации. Тем не менее, прописав в mynetworks айпи своего внешнего интерфейса к уже имеющемуся 127.0.0.1/8 и прописав inet_interfaces = all, постфикс завёлся. Но я конфигурировал не так, как у тебя в статье, и наверняка есть какое-то объяснение этому.

  84. Аватар

    Значит все же не пропустил, это радует :) Но тем не менее у меня как и у Вас все стоит на одном сервере, т.е. и у Вас roundcube является почтовым клиентом для dovecot, но в Ваших логах все хорошо, а вот в моих (сейчас извне даже еще раз перепроверил — rip локальный увы…) неверный…. Я наверное покажусь занудой, но тем не менее я так и не понял как мне это поправить )))

    • Zerox

      Я больше не знаю, что еще добавить. Из того, что вы пишите, я вижу, что вы не понимаете тему вообще. В общем, то, что у вас одинаковые ip адреса в логе это нормально. Так и должно быть. Когда подключитесь сторонним почтовым клиентом, например thunderbird, тогда адреса будут разные.

  85. Аватар

    Спасибо за ответ. Видимо я был в какой то момент невнимателен и что то упустил. Просто следуя логике повествования установки я понял, что Apache,DB и Postfix установлены на сервере с ip 188.35.19.125
    («..Проверяем работу web сервера. Заходим по ip адресу сервера — http://188.35.19.125/, а также проверяем работу phpmyadmin — http://188.35.19.125/phpmyadmin/«..),

    там же RoundCube («..Переходим в браузер по следующей ссылке для установки roundcube — http://188.35.19.125/webmail/installer/..») и обрадованно найдя что в Ваших логах Dovecot все показывается верно:

    «Mar 10 22:10:20 imap-login: Info: Login: user=, method=PLAIN, rip=75.37.235.139, lip=188.35.19.125, mpid=28790, TLS, session=»

    где то пропустил упоминание, что Dovecot нужно было ставить на другой сервер.

    • Zerox

      Так его не нужно ставить на другой сервер. Каждый компонент в отдельности можно куда угодно поставить. Но в моем примере все стоит на одном сервере. В данном случае roundcube является почтовым клиентом для dovecot. И в этом случае все пользователи roundcube для dovecot имеют один и тот же адрес, равный адресу сервера, на котором установлен roundcube.

  86. Аватар

    Доброй ночи! Так же хотел присоединится к благодарностям за прекрасную статью. Но как же без вопроса )) Возможно покажется глупым, но не могу сам пока понять ОТКУДА это берется в моем логе, касательно вот этой части статьи:

    «В /var/log/dovecot/info.log информация о подключениях к почтовым ящикам — кто, когда, откуда и каким способом авторизовывался на сервере.»

    в моем логе записи выглядят как:
    Dec 06 01:15:42 imap-login: Info: Login: user=, method=PLAIN, rip=192.168.1.100, lip=192.168.1.100, secured
    Dec 06 01:15:42 imap(testuser@mydomain.ru): Info: Disconnected: Logged out in=82 out=498

    rip и lip идентичны… не получается ip подключающегося через RoundCube любого юзера. Из локалки, из инета коннект, не важно, все работает прекрасно — только rip и lip идентичны, а это изводит мою нервную систему )) Где это рыть: в Nginx’e, на котором крутиться RoundCube, в настройках Dovecot? Не могу понять…

    • Zerox

      Roundcube установлен на том же сервере, где и сам dovecot? Если так, что понятно, что ip адрес один и тот же. Для довекота все, кто подключились через web интерфейс имеют один и тот же локальный ip. Так и должно быть. Если нужны ip адреса клиентов, то их нужно смотреть в логах httpd.

  87. Аватар

    Огромное спасибо за статью!

    У меня postfix находится во внутренней сети, за почтовым шлюзом. Как ему сказать, что почту надо слать на почтовый шлюз? Что и в каких конф. файлах надо изменить? Домены внешней почты и внутри локалки, естественно, отличаются.

    • Zerox

      У меня нет точных настроек, обычно не использую такую конфигурацию. Но ничего сложного тут нет, искать в инете инфу на тему, как указать почтовый релей для postfix. Эта тема перекликается с тем, что я описывал здесь: https://serveradmin.ru/otpravka-pochtyi-cherez-konsol-s-avtorizatsiey-v-linux/ Только у меня есть еще и авторизация, у вас возможно релей без авторизации работает.

  88. Аватар

    Вывел серевер из-за NAT, теперь у него один интерфейс WAN , второй LAN, но проблемы с подключением снаружи к imap, imaps и pop3 остались:
    imap-login: Info: Disconnected (no auth attempts in 0 secs): user=, rip=82.14.62.88, lip=2.2.2.2, TLS handshaking: Disconnected
    imap-login: Warning: SSL failed: where=0x2002: SSLv3 read client key exchange A [82.14.62.88]

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

    • Zerox

      Нужно пробросить все необходимые порты с внешнего ip на внутренний почтового сервера. Обычно с этим проблем никаких нет. Почтовый сервер нормально работает с проброшенными портами. Никаких нюансов и лишних заморочек нет.

      • Аватар

        так уже без NAT и без проброса, интерфейс в инет торчит. уже два раза настраивал под разные домены.
        подозреваю что-то в Centos 7.4 и самоподписном сертификатом и с ssl_protocols = !SSLv2 !SSLv3
        вы на каком центосе ставили?

        • Zerox

          Статья под последней версией Centos на момент написания статьи. Не помню точно, 7.3 или 7.4 это было. Но дело наверняка не в версии системы.

  89. Аватар

    Доброго времени суток , подскажите ???

    Nov 20 07:19:39 DS866833 postfix/smtpd[41048]: connect from localhost[::1]
    Nov 20 07:19:39 DS866833 postfix/smtpd[41048]: 9AE7D20ADD: client=localhost[::1]
    Nov 20 07:19:39 DS866833 postfix/cleanup[41051]: 9AE7D20ADD: message-id=
    Nov 20 07:19:39 DS866833 postfix/qmgr[1516]: 9AE7D20ADD: from=, size=634, nrcpt=1 (queue active)
    Nov 20 07:19:39 DS866833 postfix/smtpd[41048]: disconnect from localhost[::1]
    Nov 20 07:19:39 DS866833 postfix/smtp[41053]: connect to mail.poshtamt.biz.ua[185.180.196.70]:25: Connection refused
    Nov 20 07:19:39 DS866833 postfix/smtp[41053]: 9AE7D20ADD: to=, relay=none, delay=0.11, delays=0.03/0.01/0.06/0, dsn=4.4.1, sta tus=deferred (connect to mail.poshtamt.biz.ua[185.180.196.70]:25: Connection refused)

    • Zerox

      Удаленный сервер mail.poshtamt.biz.ua[185.180.196.70]:25 отклонил запрос на подключение. Почему он это делает можно узнать только у него.

      • Аватар

        Добрый день подскажите тут прописывать эти данные или своего сервера?
        smtpd_milters = inet:127.0.0.1:8891

      • Аватар

        Nov 23 11:46:35 DS866833 postfix/pickup[67409]: 045AA20B55: uid=48 from=
        Nov 23 11:46:35 DS866833 postfix/cleanup[67272]: 045AA20B55: message-id=
        Nov 23 11:46:35 DS866833 opendkim[63805]: mail._domainkey.poshtamt.biz.ua: key data is not secure: /etc/postfix is writeable and owned by uid 48 which is not the executing uid (995) or the superuser
        Nov 23 11:46:35 DS866833 opendkim[63805]: 045AA20B55: error loading key ‘mail._domainkey.poshtamt.biz.ua’
        Nov 23 11:46:35 DS866833 postfix/cleanup[67272]: 045AA20B55: milter-reject: END-OF-MESSAGE from localhost[127.0.0.1]: 4.7.1 Service unavailable — try again later; from= to=

      • Аватар

        smtpd_milters = inet:тут поставил адрес сервера и все письма дошли :8891
        и еще вопрос Socket inet:8891@localhost тут так все и оставлять?

  90. Аватар

    Спасибо за статью!!! Делал все пошагово, возникло пару моментов:
    1. chown vmail. /var/run/dovecot/auth-master — это каманда не отрабатывала, т.к. dovecot не запускался, и такого файла ещё нет.
    2. Сразу не понял значепние фразы «Приводим его к следующему виду.» касательно файла dovecot.conf и начал в него добавлять параметры. Появились потом проблемы..оказалось нужно было полностью очистить dovecot.conf и наполнить уже вашими параметрами.

    В моей схеме сети, почтовый сервер стоит за NAT, сделал проброс портов через iptables, но не работает аутентификация pop3 и imap. Ошибки:
    Nov 18 15:18:27 imap-login: Info: Disconnected (no auth attempts in 0 secs): user=, rip=1.2.3.4, lip=192.168.10.13, TLS handshaking: Disconnected, session=

    C:\Users\user>openssl s_client -ssl3 -connect mail.server.com:995
    CONNECTED(00000150)
    9392:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1493:SSL alert number 40
    9392:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:659:

    Правила проброса делал по статье — https://habrahabr.ru/post/99898/
    проброс smtp работает нормально, а вот с pop3 и imap проблема.
    Подскажите, в чем может быть проблема??? Как правильно делать проброс 993 и 995 портов?

  91. Аватар

    Спасибо за Вашу статью! Настроил практически все согласно Ваших инструкций. Все работает!

  92. Аватар

    Спасибо за вашу работу. Респект

    • Zerox

      Получилось настроить по статье?

      • Аватар

        Я пока только ищу хороший мануал по установке и настройке. Решил остановиться на вашем. Все понравилось и понятно. Как только установлю, обязательно отпишусь о своём опыте

  93. Аватар

    Добрый день.
    Подскажите пожалуйста, как в этой связке организовать «мультидоменность»? Может быть у Вас есть статья на эту тему? Поиском пользовался, но не нашел ничего (может плохо искал:) )

    • Zerox

      Ничего особенного делать не надо. Настраиваете DNS записи второго домена на этот же сервер. Затем добавляете новый домен через postfixadmin. И все будет работать. Отдельно надо не забыть добавить новые записи по аналогии со старыми в настройки dkim.

  94. Аватар

    Здравствуйте, поднял сервер по Вашей инструкции, но при отправке сообщения с Gmail на локальную почту, Gmail присылает письмо с ошибкой следующего содержания:
    «The recipient server did not accept our requests to connect. Learn more at https://support.google.com/mail/answer/7720 [domain.ru. 127.0.0.1: unable to read banner]
    Final-Recipient: rfc822; user@domain.ru
    Action: delayed
    Status: 4.4.1
    Diagnostic-Code: smtp; The recipient server did not accept our requests to connect. Learn more at https://support.google.com/mail/answer/7720
    [domain.ru. 127.0.0.1: unable to read banner]
    Last-Attempt-Date: Mon, 23 Oct 2017 10:12:13 -0700 (PDT)
    Will-Retry-Until: Tue, 24 Oct 2017 09:38:41 -0700 (PDT)».
    Естественно вместо domain.ru, user@domain.ru и 127.0.0.1 указываются реальные данные. PTR запись на DNS сервере провайдера настроена и порты открыты. Куда копать?

  95. Аватар

    Создаю пользователя в постфикс админе, вижу его в базе, но при отправке ему письма, письма не доходят, получаю в логах — User unknown in local recipient table, хотя с него почта уходит. Подскажите кто нибудь куда копать?

    • Zerox

      Конфиг virtual_mailbox_maps.cf надо проверить на правильность подключения к mysql. Postfix не видит пользователя при получении письма и пишет об этом.

  96. Аватар

    Добрый день. Сделал все по вашей статье, исходяшая почта работает, а входящая не хочет. Отправляю с gmail на свой почтовый, письмо ушло, в логах вижу соединение с gmail потом идет запись Connection refused и в скобках адрес моего сервера, а также не могу зайти через клиенты на почту, тупо пишет ошибка сети при попытке авторизации с почтового клиента

    • Zerox

      Подробнее логи надо смотреть. Возможно какие-то сетевые проблемы, или с ssl. Connection refused неприятная ошибка, так как за ней может много чего скрываться. Нужно подробно смотреть и на проблему с клиентами, возможно эти 2 ошибки связаны, но не обязательно.

  97. Аватар

    И так, после часов мучений новая заметочка. Если вы столкнулись со следующим:
    Error: user ххх: Initialization failed: Namespace »: mkdir(/mnt/mail/ддд/ххх) failed: Permission denied (euid=1000(vmail) egid=1000(vmail) missing +w perm: /mnt/mail/ддд, UNIX perms appear ok (ACL/MAC wrong?))

    Нужно выполнить следующее:
    # semanage fcontext -a -t mail_home_rw_t ‘/mnt/mail(/.*)?’
    # restorecon -v /mnt/mail

    Выключать СЕЛинукс считаю профанацией.

  98. Аватар

    Полагаю, что вместо :
    # chown vmail. /var/run/dovecot/auth-master
    нужно бы сделать так:
    #mkdir /var/run/dovecot/auth-master && chown vmail. /var/run/dovecot/auth-master

    Так-же, на CentOS7 со включенным SELinux, перед # systemctl start dovecot нужно бы выполнить # restorecon -v /var/log/dovecot, иначе получим dovecot[6800]: Can’t open log file /var/log/dovecot/main.log: Permission denied

    • Аватар

      Ошибся:
      #mkdir /var/run/dovecot/auth-master && chown vmail. /var/run/dovecot/auth-master — Не верно!
      /var/run/dovecot/auth-master — это файл, он создается автоматически при запуске dovecot

  99. Аватар

    У нас почему-то раньше всех затык. Веб-сервер работает нормально — страница-заглушка отображается.
    phpmyadmin — работает. postfixadmin работать отказывается, в браузере — внутренняя ошибка сайта — HTTP 500.
    Уже пробовали копировать все команды с сайта, но старницу setup.php не открывает. Все каталоги и расположения — стандартные.
    В конфиге httpd действительно нигде не нужно указывать каких-то настроек связанных с postfixadmin?

  100. Аватар

    ДВС.
    Упёрся в
    «chown vmail. /mnt/mail».
    ЧТО эта команда делает?
    У меня фря 10,3, точка в конце vmail вызывает
    illegal user name
    Голову уже сломал…

  101. Аватар
    Владимир

    Спасибо разобрался )))

  102. Аватар
    Владимир

    Здравствуйте Подскажите пожалуйста. Все сделал по мануалу но выдает ошибку Aug 08 10:37:35 dovecot[14244]: Fatal: service(auth) Group doesn’t exist: vmail (See service auth { unix_listener /var/run/dovecot/auth-userdb {…} setting) Спасибо)