Установка и настройка почтового сервера Postfix в связке Linux Debian + Postfix + Dovecot + MySQL

Установка и настройка почтового сервера Postfix на платформе Linux процедура не слишком тривиальная, но и не сложная. Сегодня будем рассматривать процесс установки и настройки связки Postfix + Dovecot + MySQL на платформе Linux Debian или Linux Ubuntu. Статья была написана мной еще в 2010 году, с тех пор произошли небольшие изменения, поправки на которые я сделал в обновленной версии статьи.

Большинство моих серверов в качестве MTA использует Exim4, который по-умолчанию интегрирован во все дистрибутивы Linux Debian. Однако, столкнувшись недавно со сборкой из исходников Postfix для Unix FreeBSD понял, что могу прекрасно свои потребности покрывать этим MTA. Exim является стабильной и очень гибкой системой, но настройка этого софта утомляет очень сильно. Тот, кто видел конфигурационные файлы и россыпь параметров — понимает о чем разговор.

Серия тестов на нескольких серверах показала, что Postfix прекрасно у меня заменяет Exim. Думаю, что большинство администраторов смогут тоже отказаться от Exim в пользу Postfix. Подчеркиваю, что и тот и другой MTA очень хороши. Не исключено, что напишу статью и по поводу настройки Exim.

В данной статье продемонстрирована базовая настройка связки Postfix + Dovecot + MySQL с поддержкой безопасных соединений.

Статья написана с учетом того, что вы работаете с правами суперпользователя (root).

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

# apt-get update

1. Установка MySQL-сервера и средств администрирования (phpMyAdmin)

Поскольку управлять доменами и почтовыми ящиками удобнее с помощью Postfix Admin, требуется поставить Web-сервер Apache и PHP. Плюс — работать с базами данных MySQL удобнее с использованием phpMyAdmin. Соответственно, ставим необходимые пакеты:

# apt-get install apache2 php5 mysql-server
# apt-get install phpmyadmin

В итоге, будут установлены требуемые пакеты с учетом зависимостей.

Лучше соблюдать приведенную последовательность команд, поскольку в некоторых версиях Linux Debian при одновременной установке apache2 и phpmyadmin, последний — не регистрировался в хосте по-умолчанию. Однако, если планируется phpmyadmin реализовать в виде отдельного виртуального хоста, последовательность команд не критична. 😉

2. Установка PostfixAdmin

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

Устанавливаем скачанный пакет:

# dpkg -i postfixadmin-2.3.2_all.deb

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

# apt-get -f install

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

В ходе настройки базы данных необходимо задать пароль администратора MySQL, который был задан на первом этапе (см.п.1), а потом задать пароль для пользователя postfixadmin. Для примера я использовал 123456.

3. Настройка PostfixAdmin

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

Проверяем создала ли конфигурационная утилита базу данных и пользователя для нашего PostfixAdmin. Для этого заходим через phpMyAdmin на сервер MySQL. При установке по-умолчанию phpMyAdmin работает по адресу http://ВашХост/phpmyadmin. В списке баз данных должна быть БД postfixadmin. Не пугайтесь, что она пустая. Структура таблиц будет создана позже во время настройки подключения к БД самого PostfixAdmin. Так же в списке пользователей должен быть пользователь с идентификатором postfixadmin. Если этого нет, то необходимо создать БД и пользователя с максимальными правами доступа к этой БД.

К сожалению, конфигурационная утилита установки пакета не изменяет параметров файла config.inc.php, даже если с ее помощью создается БД. Конфигурационный файл PostfixAdmin находится в каталоге /etc/postfixadmin/config.inc.php. Изменяем параметры в данном файле в соответствии с приведенным ниже кодом:

$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = '123456';
$CONF['database_name'] = 'postfixadmin';
$CONF['database_prefix'] = '';

Изменим алгоритм шифрования пароля заданный по-умолчанию в PostfixAdmin:

$CONF['encrypt'] = 'md5';

Обращаемся к процедуре настройки http://ВашХост/postfixadmin/setup.php. Если ошибок не обнаружено, внизу страницы появится запрос на создание пароля установки. Этот пароль используется для создания администраторов. После указания пароля и нажатия на кнопку Generate password hash, должна появится строка вида:

$CONF['setup_password'] = '272aa1a6bdc0...283ac11e57';

В файле config.inc.php необходимо найти соответствующий параметр и заменить этой строкой, только после этого можно будет создать администратора.

4. Установка и настройка Postfix

Устанавливаем:

# apt-get install postfix postfix-mysql dovecot-common dovecot-imapd dovecot-pop3d openssl

После установки, чтоб предотвратить мешанину из конфигурационных файлов, в папке /etc/postfix создаем подпапку mysql. В ней будут храниться файлы запросов почтового сервера к БД. В этой папке создадим три конфигурационных файла:

4.1. virtual-alias-maps.cf

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

4.2. virtual-mailbox-domains.cf

user = postfixadmin
password = 123456
hosts = 127.0.0.1
dbname = postfixadmin
query = select 1 from `domain` where `domain` = '%s'

4.3. virtual-mailbox-maps.cf

user = postfixadmin
password = 123456
hosts = 127.0.0.1
dbname = postfixadmin
query = select 1 from `mailbox` where `username` = '%s'

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

# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /home/vmail -m

Postfix имеет удобный скрипт для управления конфигурационным файлом. Этот скрипт избавляет от необходимости искать директивы вручную. Теперь, используя этот скрипт, зададим конфигурацию для Postfix. Обычно для настройки параметров, дабы не вводить это все каждый раз вручную, я создаю отдельный скрипт. Назовем его postfix-myconf.sh:

#!/bin/sh

postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql/virtual-mailbox-domains.cf
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql/virtual-mailbox-maps.cf
postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql/virtual-alias-maps.cf
postconf -e virtual_uid_maps=static:5000
postconf -e virtual_gid_maps=static:5000
postconf -e virtual_transport=dovecot
postconf -e dovecot_destination_recipient_limit=1

postconf -e smtpd_tls_cert_file=/etc/ssl/cert/postfix.pem
postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
postconf -e smtpd_use_tls=yes

postconf -e smtpd_sasl_type=dovecot
postconf -e smtpd_sasl_path=private/auth
postconf -e smtpd_sasl_auth_enable=yes
postconf -e smtpd_recipient_restrictions=permit_sasl_authenticated,reject_unauth_destination

Итоговым аккордом настройки Postfix будет добавление Dovecot интерфейса. Для этого в файл /etc/postfix/master.cf добавляем две строчки:

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

5. Настройка безопасного соединения TLS/SSL

На данном этапе мы создаем ключи и сертификаты для Postfix и Dovecot. Процедура проста, как гвоздь: даем пару команд и отвечаем на заданные вопросы:

# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.pem
# chmod o= /etc/ssl/private/dovecot.pem

# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem
# chmod o= /etc/ssl/private/postfix.pem

В результате должны появится 4 файла: /etc/ssl/certs/dovecot.pem, /etc/ssl/private/dovecot.pem, /etc/ssl/certs/postfix.pem и /etc/ssl/private/postfix.pem. И не забываем дать права доступа на полученные файлы.

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

Конфигурационные файлы Dovecot находятся в /etc/dovecot.

6.1. dovecot.conf

Находим перечисленные ниже директивы и приводим их к заданному виду:

protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
mail_location = maildir:/home/vmail/%d/%n

namespace private {
   separator = .
   prefix = INBOX.
   inbox = yes
}

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

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

socket listen {
   master {
      path = /var/run/dovecot/auth-master
      mode = 0600
      user = vmail
   }

   client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
   }
}

protocol lda {
   postmaster_address = postmaster@ВашДомен.ru
   auth_socket_path = /var/run/dovecot/auth-master
   mail_plugins = sieve
   log_path = /home/vmail/dovecot-deliver.log
   global_script_path = /home/vmail/globalsieverc
}

6.2. dovecot-sql.conf

Настраиваем связку Dovecot с MySQL. Точно так же находим перечисленные ниже директивы и приводим их к заданному виду:

driver = mysql
connect = host=127.0.0.1
dbname=postfixadmin user=postfixadmin password=123456
default_pass_scheme = PLAIN-MD5
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u'

7. Завершение

Postfix и Dovecot настроены. Теперь перезапускаем и тот и другой:

# /etc/init.d/dovecot restart
# postfix reload

Если все сделано без ошибок, то в файле /var/log/mail.log должны появиться строки:

mail dovecot: Dovecot v1.0.15 starting up
mail dovecot: auth-worker(default):
mysql: Connected to 127.0.0.1 (postfixadmin)

Журналы ошибок и вообще результаты деятельности почтовой системы лежат в файлах:

  • /var/log/mail.log
  • /var/log/mail.err
  • /var/log/mail.info
  • /var/log/mail.warn

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

Удачной настройки.

8. Возможные косяки и способы их решения

В логах ошибка: postfix fatal: open database /etc/aliases.db: no such file or directory

Решение:

Генерим aliases.db с использованием скрипта postalias:

# postalias /etc/aliases /etc/aliases.db

В итоге появятся нужные файлы.

37 комментария(ев) для “Установка и настройка почтового сервера Postfix в связке Linux Debian + Postfix + Dovecot + MySQL

  1. в пункте 4.3 в postfix-myconf.sh прописываешь

    smtpd_tls_cert_file=/etc/ssl/cert/postfix.pem

    а ключи, пишешь, надо смотреть в /etc/ssl/certs/

  2. doveconf: Warning: NOTE: You can get a new clean config file with: doveconf -n > dovecot-new.conf
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:1: ‘imaps’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:1: ‘pop3s’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:5: namespace private {} has been replaced by namespace { type=private }
    doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 11: Unknown setting: mechanisms
    [….] Restarting IMAP/POP3 mail server: dovecotdoveconf: Warning: NOTE: You can get a new clean config file with: doveconf -n > dovecot-new.conf
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:1: ‘imaps’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:1: ‘pop3s’ protocol is no longer necessary, remove it
    doveconf: Warning: Obsolete setting in /etc/dovecot/dovecot.conf:5: namespace private {} has been replaced by namespace { type=private }
    doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf line 11: Unknown setting: mechanisms
    failed!

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

    1. У тебя опечатка в 11 строке dovecot.conf. Внимательнее читай сообщения об ошибках.

      1. mechanisms = plain login

        И какая тут может быть опечатка?

        1. Тут все верно, а вот в группе выше, скорее всего, не поставил закрывающую }

          1. Все проверил все закрывающие } стоят ….где ошибка не могу найти

          2. Тут же не может быть чудес. Явно есть ошибка. При этом, если ты все устанавливаешь по инструкции, все должно работать.

            Если ошибок нет, могу допустить, что ты установил версию dev пакета.

            Попробуй заново все установить внимательно. Сам только на днях в соответствии с процедурой настраивал очередной клиентский сервер. Все работает с первого раза. 😉

        2. Стоит сразу упомянуть важный нюанс. В Debian 7 используется уже Dovecot v2.1.7, поэтому если есть конфиг более ранней версии — то его необходимо будет изменять, так как на новой версии он однозначно не заведется.
          Для автоматического конвертирования конфига из ранней версии в позднюю есть утилита doveconf.

          Я думаю проблема в этом ..))

  3. Поясните пожалуйста по п. 5 кому и какие права дать на файлы?
    p.s. и ждем с нетерпением продолжения.

  4. Не могу зайти на «http://…/postfixadmin/setup.php». Просто не находит такую страницу: 404 not found. Делал все на чистом дебиане по данной статье.

    1. По статье postfixadmin привязан к дефолтному виртуальному хосту. Проверьте включен ли он вообще и доступен но по localhost или по прямому обращению по IP-адресу с внешнего компа. Далее — проверьте есть ли каталог в дефолтном хосте или директива перенаправления в конфигурационном файле Apache (последнее зависит от того, как устанавливался postfixadmin).

  5. Можно подробно про
    postfix-myconf.sh
    где создается?
    как запустить?

  6. Иду по инструкции…
    По запуску http://ВашХост/postfixadmin/setup.php. получаю пустую страницу. В error.log apache : syntax error, unexpected ‘database_host’ (T_STRING) in /etc/postfixadmin/config.inc.php on line 54
    Пишет ошибка в строке $CONF[‘database_host’] = ‘localhost’;

    В чем трабл?

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

  7. «Тема настройки почтовой системы далее будет расширена подключением Web-интерфейса почты, подключение антивирусной программы, борьба со спамом.»
    Когда?

      1. Жалко. А ведь именно web-интерфейс очень важен..

        1. Web интерфейсов просто тьма. Без проблем настраиваются для работы по IMAP протоколу. Устанавливаются элементарно как виртуальные хосты к Апачу. Вся необходимая техническая инфа у меня есть в постах. Нужно просто не полениться, прочитать и собрать из этого готовое решение. Какой веб интерфейс использовать — решать Вам. Есть плагины к CMS-кам, есть самостоятельные решения.

          В конечном итоге, самое сложное — это настроить сервер.

  8. Мануал хороший, только вот под Debian 7 он не канает. Dovecot там 2.1.7, а не 1.0.15 как у Вас и попросту не кушает конфиг.

    Конкретно у меня, как и у комментатора сверху, doveconf жалуется на «Unknown setting: mechanisms». Никаких опечаток и незакрытых } у меня нет. Проверил на 20 раз.

    1. Мануал действительно писал под 6 Debian. В Debian 7 настраивал по аналогии, какие-то ошибки были, которые исправил по-ходу. Просто не помню на что ругался. Будет время — сделаю по мануал на 7 Debian с учетом изменений версий сопутствующего ПО.

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

    в панели ispmanager с почтой просто работать, неужели она при установке столько конфигов создает для почты? что-то не верится.

  10. Здравствуйте.

    У нас сервер на Debian 7, используется dovecot и postfix. Скажите, пожалуйста, где в этом случае стоит искать логи по всей отправляемой через функцию php mail почте?

      1. Спасибо, Андрей!
        Столкнулся с ситуацией подмены адресата. Когда письма отсылаются на доменную почту сайта(формируются уведомления о заказах), то вместо info@somesite.ru письма уходят на virtuser_501@testrelease.ispsystem.net. Виной всему видимо прописанные строки в настройках main.cf postfix:
        myhostname = testrelease.ispsystem.net
        mydomain = ispsystem.net
        Остается только вопрос почему именно на ящик virtuser_501 домена testrelease.ispsystem.net, где это прописывается?

  11. Спасибо.
    Нашёл файл etc/mail/virtusertable, в котором была запись вида info@somesite.ru virtuser_501
    затёр её, сохранил файл, но в логах всё равно пишется что отсылается абоненту virtuser_501somesite.ru. Надо etc/mail/virtusertable.db обновить? Как?

  12. Спасибо. Обновил virtusertable.db.
    Теперь новая ситуация 🙂 Попробовал отправить письмо на info@somesite.ru с обычного yandex-го ящика — в логах появляется такое:
    [QUOTE]
    May 17 17:56:33 server1 postfix/smtpd[19508]: NOQUEUE: reject: RCPT from forward9p.cmail.yandex.net[87.250.241.194]: 550 5.1.1 : Recipient address rejected: User unknown in local recipient table; from= to= proto=ESMTP helo=
    [/QUOTE]
    Периодически также мелькает unknown user: «info»
    Как можно создать этого неизвестного юзера в локальной таблице реципиентов?

  13. Исправил. Теперь письма на info@somesite.ru отправляются, по крайней мере в логах такое
    May 18 12:51:38 f postfix/local[10672]: 33D173A24537: to=, relay=local, delay=0.97, delays=0.93/0/0/0.04, dsn=2.0.0, status=sent (delivered to command: /usr/bin/procmail)
    и ответных сообщений о недоставке не приходит. Но почему-то писем не видно в интерфейсе SquirellMail.

    Я так понимаю, что письма должен доставлять procmail, но почему-то нет файла его настроек, файла etc/procmailrc. Может быть из-за этого письма не видны во входящих. Как поступить в этой ситуации? Создать типовой procmailrc и дело с концом? 🙂

  14. Вы знаете, письма в файле var/mail/info есть, видимо squirellmail неправильно настроен. С чего бы начать проверки?

  15. Хостер поменял почтовый клиент на RoundCube, я пересоздал ящик [email]info@somesite.ru[/email] через ISP панель с перенаправлением писем на резервный_ящик@bk.ru.

    Если с внешнего личного мэиловского ящика(customer@inbox.ru) писать на доменную почту сайта(info@somesite.ru), то письма приходят в резервный_ящик@bk.ru, а значит и на [email]info@somesite.ru[/email].

    Попробовал оформить заказ с сайта — уведомления по прежнему приходят только на ящик заказчика(в логе это [email]customer@inbox.ru[/email]), но не на [email]info@somesite.ru[/email] и резервный_ящик@bk.ru.

    Вот какой почтовый лог генерит один заказ на сайте:
    [SPOILER][QUOTE]
    May 21 09:02:33 f postfix/pickup[23370]: 985DC3A2484D: uid=500 from=
    May 21 09:02:33 f postfix/cleanup[24768]: 985DC3A2484D: message-id=
    May 21 09:02:36 f postfix/qmgr[21364]: 985DC3A2484D: from=, size=1322, nrcpt=1 (queue active)
    May 21 09:02:36 f postfix/pickup[23370]: 2F0B03A25195: uid=500 from=
    May 21 09:02:36 f postfix/cleanup[24782]: 2F4283A25197: message-id=
    May 21 09:02:36 f postfix/cleanup[24716]: 2F0B03A25195: message-id=
    May 21 09:02:36 f postfix/qmgr[21364]: 2F4283A25197: from=, size=1459, nrcpt=1 (queue active)
    May 21 09:02:36 f postfix/local[24772]: 985DC3A2484D: to=, orig_to=, relay=local, delay=2.6, delays=2.6/0/0/0.04, dsn=2.0.0, status=sent (forwarded as 2F4283A25197)
    May 21 09:02:36 f postfix/qmgr[21364]: 985DC3A2484D: removed
    May 21 09:02:36 f postfix/qmgr[21364]: 2F0B03A25195: from=, size=1421, nrcpt=1 (queue active)
    May 21 09:02:36 f postfix/smtp[24835]: 2F4283A25197: to=, orig_to=, relay=mxs.mail.ru[217.69.139.150]:25, delay=0.56, delays=0.04/0.07/0.19/0.27, dsn=5.7.1, status=bounced (host mxs.mail.ru[217.69.139.150] said: 550 5.7.1 This message was not accepted due to domain owner DMARC policy (RFC 7489) [url]https://help.mail.ru/mail-help/postmaster/dmarc[/url] (in reply to end of DATA command))
    May 21 09:02:36 f postfix/cleanup[24768]: C15CA3A2484D: message-id=
    May 21 09:02:36 f postfix/qmgr[21364]: C15CA3A2484D: from=, size=3653, nrcpt=1 (queue active)
    May 21 09:02:36 f postfix/bounce[24781]: 2F4283A25197: sender non-delivery notification: C15CA3A2484D
    May 21 09:02:36 f postfix/qmgr[21364]: 2F4283A25197: removed
    May 21 09:02:38 f postfix/smtp[24835]: C15CA3A2484D: to=, relay=mxs.mail.ru[94.100.180.150]:25, delay=1.5, delays=0.03/0/0.34/1.2, dsn=2.0.0, status=sent (250 OK id=1b3zzh-0005bE-5u)
    May 21 09:02:38 f postfix/qmgr[21364]: C15CA3A2484D: removed
    May 21 09:02:39 f postfix/smtp[24836]: 2F0B03A25195: to=, relay=mxs.mail.ru[94.100.180.150]:25, delay=5.9, delays=2.7/0.02/0.58/2.7, dsn=2.0.0, status=sent (250 OK id=1b3zzi-0006de-5y)
    May 21 09:02:39 f postfix/qmgr[21364]: 2F0B03A25195: removed
    [/QUOTE][/SPOILER]
    Интересует ответ серверов mail.ru
    status=bounced (host mxs.mail.ru[217.69.139.150] said: 550 5.7.1 This message was not accepted due to domain owner DMARC policy (RFC 7489) [url]https://help.mail.ru/mail-help/postmaster/dmarc[/url] (in reply to end of DATA command)), когда в параметре from значится [email]customer@inbox.ru[/email], а в to и orig_to соответственно резервный_ящик@bk.ru и [email]info@somesite.ru[/email].
    Такой ответ возвращается из-за того, что программа сайта пытается послать письмо от имени стороннего почтового ящика [email]customer@inbox.ru[/email], а не от [email]info@somesite.ru[/email]?

    1. Похоже два варианта:
      1. Проверить куда и что скрипт на сайте отправляет.
      2. Что за ящик в postmaster прописан.

      И ещё одна тонкость: раньше делали так, что формы обратной связи отправляли через свой почтовик от имени стороннего сервера (почта заполнившего форму), сейчас так делать нельзя. Почти все хостеры, да и по дефолту в настройки серверов, зашита проверка. Нужно отправлять от имени своего домена, а почту вставлять просто в тело письма.

Комментарии запрещены.