Настройка почтовой системы. Агент доставки почты Dovecot

  1. Основные термины
  2. Введение
  3. Структура таблиц в базе данных
  4. Агент доставки почты Dovecot
    1. Установка
    2. Настройка
    3. Запуск и проверка конфигурации
  5. Агент пересылки почты Exim
    1. Установка
    2. Настройка
    3. Запуск и проверка конфигурации
  6. Веб интерфейс Roundcube
    1. Установка
    2. Настройка
    3. Запуск и проверка конфигурации
  7. Заключение
  8. Список литературы
  9. Комментарии

3. Агент доставки почты Dovecot

Dovecot - это свободный IMAP и POP3 сервер для Unix/Linux систем, при разработке которого безопасности уделяется много внимания. Также хорошими достоинствами данного сервера являются: быстрота, простота установки и малое потребление памяти. Основные особенности:

  • поддержка форматов почтовых ящиков mbox и Maildir;
  • высокое быстродействие благодаря индексации содержимого почтовых ящиков;
  • полное соответствие стандартам IMAP;
  • возможность работы с почтовыми язиками и их индексами с нескольких компьютеров, что позволяет хранить данные на кластерных файловых системах и NFS;
  • возможность расширения функционала с помощью плагинов;
  • поддержка Sieve;
  • поддержка различных хранилищ аутентификационной информации и режимов аутентификации;
  • Postfix и Exim могут проводить аутентификацию пользователей через Dovecot;
  • простота миграции с большинства других IMAP и POP3 серверов.

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

3.1 Установка

На момент написания статьи в портах доступно две версии Dovecot: 1.2.17 и 2.1.10. Я буду устанавливать вторую версию.

# cd /usr/ports/mail/dovecot2
# make install clean

К параметрам сборки (которые были выбраны по умолчанию) я добавил поддержку СУБД PostgreSQL. Для поддержки языка Sieve необходимо установить соответствующий плагин для Dovecot, поэтому ставим еще один порт.

# cd /usr/ports/mail/dovecot2-pigeonhole
# make install clean

Параметры сборки для этого порта я оставил как есть.

3.2 Настройка

Конфигурационные файлы Dovecot хранятся в папке /usr/local/etc/dovecot (если в директории пусто, то примеры конфигурационных файлов лежат здесь — /usr/local/share/doc/dovecot/example-config). Во второй версии главный конфигурационный файл был разбит на несколько файлов, каждый из которых отвечает за определенный функционал. Большинство опций из первой версии присутствуют и во второй, поэтому не окажется лишним полный перевод конфигурационного файла Dovecot первой версии — ссылка. Структура директории с конфигурационными файлами Dovecot имеет следующий вид:

  • dovecot.conf — конфигурационный файл Dovecot;
  • dovecot-ldap.conf.ext — настройки для LDAP базы данных пользователей;
  • conf.d/10-auth.conf — параметры процесса авторизации;
  • conf.d/10-director.conf — параметры Dovecot Director;
  • conf.d/10-logging.conf — ведение логов;
  • conf.d/10-mail.conf — расположение почтовых ящиков и параметры пространства имен;
  • conf.d/10-master.conf — сетевые параметры и ограничения для процессов;
  • conf.d/10-ssl.conf — параметры SSL;
    conf.d/15-lda.conf — параметры LDA;
  • conf.d/20-imap.conf — настройки процесса IMAP;
  • conf.d/20-lmtp.conf — настройки процесса LMTP;
  • conf.d/20-managesieve.conf — настройки процесса ManageSieve;
  • conf.d/20-pop3.conf — настройки процесса POP3;
  • conf.d/90-acl.conf — списки доступа к почтовым ящикам;
  • conf.d/90-plugin.conf — параметры для плагинов;
  • conf.d/90-quota.conf — настройки квот;
  • conf.d/90-sieve.conf — параметры интерпритатора Sieve;
  • conf.d/auth-*.conf.ext — параметры различных баз данных пользователей;

Итак, переходим к правке конфигурационных файлов. Файл dovecot.conf:

## Конфигурационный файл Dovecot

# Инструкцию по быстрому старту смотреть здесь:
# http://wiki2.dovecot.org/QuickConfiguration

# Команда "dovecot -n" выводит список измененных параметров. Используйте 
# эту возможность, вместо копирования содержимого файла, при обращении
# в списках рассылки.

# Все, что расположено после символа "#" считается комментарием. Пробелы
# и символы табуляции игнорируются. Значение параметра, в котором
# есть пробелы поместите в кавычки, чтобы он интерпритировался должным 
# образом, например key = "# char and trailing whitespace  "

# Значения по умолчанию представленные в данном файле не обязательно
# раскомментировать. Не обязательны секции (например, namespaces {})
# или настройки плагинов, здесь они приведены для примера. Пути так же
# заданы в качестве примера, значения по умолчанию в данном случае
# были заданы при компиляции ( --prefix=/usr/local
# --sysconfdir=/usr/local/etc --localstatedir=/var )

# С какими протоколами работать?
#protocols = imap pop3 lmtp
protocols = imap pop3

# Список, разделенный запятыми, IP адресов или имен хостов, с которых
# будут обрабатываться подключения. "*" - принимать подключения со всех
# интерфейсов по протоколу IPv4. "[::]" - принимать подключения со всех
# интерфейсов по протоколу IPv6. Укажите "*, [::]", чтобы принимать
# подключения по любому протоколу.
# Если вы хотите изменить стандартный порт для сервиса, то правте
# файл conf.d/master.conf.
listen = *

# Директория, в которой работает Dovecot.
base_dir = /var/run/dovecot/

# Приветственное сообщение.
login_greeting = POP3/IMAP server ready.

# Список сетей, разделенный пробелами, которым разрешен доступ.
# Клиентам с этих адресов разрешено переписывать IP адресы
# и порты (для проверок авторизации и аутентификации).
# Параметр disable_plaintext_auth игнорируется для этих сетей.
# Например, здесь можно указать адреса ваших IMAP-прокси серверов.
#login_trusted_networks =

# Список сокетов проверки прав доступа входа, разделенный пробелами (например, tcpwrap)
#login_access_sockets =

# Использовать более информативный заголовок процесса (отображается
# в команде ps). На данный момент отображаются только имя пользователя
# и IP адрес. Полезно, если вы хотите видеть кого на самом деле обслуживает
# IMAP процесс.
verbose_proctitle = no

# Прибивать все подключения, когда завершается главный процесс Dovecot.
# При "no" подключенные клиенты продолжат работу, даже если главный
# процесс будет завершен (может быть полезно при обновлении, например когда
# была выпущена новая версия с исправленными косяками в безопасности).
# Однако, когда главный процесс будет завершен, то процессы обрабатывающие
# запросы от клиентов не смогут писать в лог файлы.
shutdown_clients = yes

# Если не ноль, то посылать выполнять команды через соединение к серверу doveadm
# (то есть выполнять их на сервере doveadm), вместо выполнения этих команд
# самим процессом.
#doveadm_worker_count = 0
# Unix сокет или хост, на котором работает сервер doveadm.
#doveadm_socket_path = doveadm-server

# Список переменных окружения, разделенный пробелами, которые задаются
# перед запуском Dovecot и передаются всем дочерним процессам. Также вы можете
# задавать здесь переменные окружения, используя пару ключ=значение.
#import_environment = TZ

##
## Настройки dictionary server
##

# Словарь может использоваться некоторыми плагинами, для сохранения
# значений типа ключ=значение. К таким плагинам можно отнести: quota,
# expire и acl. Словарь может использоваться через сервер или напрямую.
# Следующий блок dict ассоциирует имена словарей и URI, когда используется
# сервер. URI имеет следующий формат "proxy::<name>".

dict {
 #quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
 #expire = sqlite:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
}

# Остальные параметры задаются в файлах в папке conf.d, которые
# подключаются ниже. Имена конфигурационных файлов заданы так,
# чтобы конф. файлы подключались в определенном порядке.
!include conf.d/*.conf

# Попробовать включить файл. Если файл не будет найдет, то это просто
# будет проигнорировано.
!include_try local.conf

Файл dovecot-sql.conf.ext:

# Этот файл открывается с правами пользователя root, поэтому
# он должен принадлежать пользователю root и иметь права
# доступа 0600.
#
# http://wiki2.dovecot.org/AuthDatabase/SQL
#
# Для модуля sql passdb вам нужна база данных с таблицей, содержащая
# как минимум поля "имя пользователя" и "пароль". Если вы хотите
# использовать синтакс user@domain, то вам понадобится отдельное
# поле для имени домена.
#
# Если все ваши пользователи имеют одинаковые uid/gid и одинаковую
# общую часть вначале пути (наример, /var/mail, /usr/home), то вы можете
# использовать модуль static userdb для генерации остального пути к
# домашней директории из имени пользователя и домена. В этом случае
# вам не понадобятся поля home, uid, gid в таблице в базе данных.
#
# Если у вас есть необходимость использовать модуль sql userdb, то
# вам придется создать поля home, uid, и gid. Вот пример таблицы:
#
# CREATE TABLE users (
#     username VARCHAR(128) NOT NULL,
#     domain VARCHAR(128) NOT NULL,
#     password VARCHAR(64) NOT NULL,
#     home VARCHAR(255) NOT NULL,
#     uid INTEGER NOT NULL,
#     gid INTEGER NOT NULL,
#     active CHAR(1) DEFAULT 'Y' NOT NULL
# );

# Используемая база данных: mysql, pgsql, sqlite
driver = pgsql

# Подключение к базе данных. Специфичные настройки для драйвера.
#
# HA / round-robin load-balancing is supported by giving multiple host
# settings, like: host=sql1.host.org host=sql2.host.org
#
# pgsql:
#   Смотрите в документацию PostgreSQL по функции PQconnectdb
#   допустимые параметры. Используйте maxconns=n (по умолчанию 5)
#   для ограничения количества подключений Dovecot к базе данных. 
#
# mysql:
#   Имена основных параметров аналогичны PostgreSQL:
#     host, port, user, password, dbname
#
#   Также доступны следующие параметры:
#     client_flags        - смотрите документацию по MySQL
#     ssl_ca, ssl_ca_path - задайте одну или две опции, чтобы включить SSL
#     ssl_cert, ssl_key   - для отправки сертификата клиента на сервер
#     ssl_cipher          - минимальная безопасность шифра (по умолчанию: HIGH)
#     option_file         - читать параметры из файла (указанного здесь) для клиента
#                            MySQL, вместо файла по умолчанию - my.cnf.
#     option_group        - читать параметры из определенной группы (по умолчанию: client)
# 
#   Вы можете указать в параметре host путь к Unix сокету: host=/var/run/mysql.sock
#   Учтите, что на данный момент нельзя использовать пробелы в параметрах.
#   
# sqlite:
#   Путь к файлу базы данных.
#
# Примеры:
#   connect = host=192.168.1.1 dbname=users
#   connect = host=sql.example.com dbname=virtual user=virtual password=blarg
#   connect = /etc/dovecot/authdb.sqlite
#
connect = host=192.168.7.253 dbname=vmail user=vmail password=1234

# Формат хранения паролей по умолчанию.
#
# Список поддерживаемых схем смотрите здесь:
# http://wiki2.dovecot.org/Authentication/PasswordSchemes
#
default_pass_scheme = MD5

# Запрос passdb, который возвращает пароль. Он может вернуть следующие поля:
#   password - пароль пользователя. Это поле всегда должно присутствовать.
#   user - возвращается в формате user@domain.
#   username и domain - другой путь представления поля "user".
#
# Поле "user" должно быть регистронезависимым, чтобы избежать
# создания двух директорий (почтовых ящиков), если вдруг пользователь
# предоставит учетные данные по разному: "name" и "nAme". Если имя пользователя
# и имя домена хрантся в разных колонках, то вы можете вернуть колонки
# "username" и "domain" вместо одной "user".
#
# Также запрос может вернуть другие поля, которые имеют свое назначение,
# смотрите список таких полей здесь:
# http://wiki2.dovecot.org/PasswordDatabase/ExtraFields
#
# Подстановки, используемые чаще всего: (смотрите полный список подстановок
# здесь - http://wiki2.dovecot.org/Variables):
#   %u = entire user@domain
#   %n = user part of user@domain
#   %d = domain part of user@domain
#
# Учтите, что подстановки могут использоваться только в SQL запросе. Если
# запрос возвращает любую из этих подстановок, то ничего не изменяется.
# Иначе было бы невозможно задавать имя пользователя, в котором
# присутствовал бы символ '%'.
#
# Пример:
#   password_query = SELECT userid AS user, pw AS password \
#     FROM users WHERE userid = '%u' AND active = 'Y'
#
password_query = \
 SELECT "users_tb"."username" AS "username", \
        "domains_tb"."domainname" AS "domain", \
        "users_tb"."passwd" AS "password" \
 FROM "users_tb" \
   INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
   WHERE "users_tb"."username" = '%n' AND \
     "domains_tb"."domainname" = '%d' AND \
     "users_tb"."active" = 'true' AND \
     "domains_tb"."active" = 'true'


# Запрос, который возвращает информацию о пользователе. Он может вернуть:
#   uid - System UID (overrides mail_uid setting)
#   gid - System GID (overrides mail_gid setting)
#   home - Home directory
#   mail - Mail location (overrides mail_location setting)
#
# Ни одно из этих полей не является обязательным. Если вы используете
# везде одинаковые UID и GID, и различными у вас остаются только
# home или mail, то вам лучше использовать userdb static.
# Полный список возможных полей смотрите здесь:
# http://wiki2.dovecot.org/UserDatabase/ExtraFields
#
# Примеры:
#   user_query = SELECT home, uid, gid FROM users WHERE userid = '%u'
#   user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = '%u'
#   user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u'
#
user_query = \
 SELECT "users_tb"."uid" AS "uid", "users_tb"."gid" AS "gid", \
        ("users_tb"."homedir" || '/%d/%n') AS "home", \
        ('*:storage=' || "users_tb"."quota" || 'k') AS "quota_rule" \
 FROM "users_tb" \
   INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
   WHERE "users_tb"."username" = '%n' AND \
     "domains_tb"."domainname" = '%d' AND \
     "users_tb"."active" = 'true' AND \
     "domains_tb"."active" = 'true'

# Если вы не хотите использовать два запроса (passdb + userdb), то вы можете
# использовать userdb prefetch вместо userdb sql. В этом случае вы должны
# сделать так, чтобы запрос в password_query возвращал поля userdb
# с префиксом "userdb_". Например:
#password_query = \
#  SELECT userid AS user, password, \
#    home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
#  FROM users WHERE userid = '%u'

# Запрос для получения списка всех пользователей.
#iterate_query = SELECT username AS user FROM users

Файл conf.d/10-auth.conf:

##
## Процесс авторизации
##

# Отключить метод аутентификации LOGIN и другие методы с открытым текстом,
# если клиент подключен не через защищенное соединение SSL/TLS. Только
# учтите, что для локальных подключений это ограничение не применяется.
disable_plaintext_auth = no

# Размер кэша в килобайтах. 0 значит, что кэш выключен. Учтите, что bsdauth,
# PAM и vpopmail требуют, чтобы параметр cache_key был задан, чтобы
# использовать кэширование.
auth_cache_size = 0

# Время жизни кэша в секундах. После истечения времени кэшированные
# данные не используются, но если БД отвалилась, то остается использовать
# только их. Dovecot также пытается автоматически узнать об изменении
# пароля у пользователя: если предыдущая аутентификация была успешной,
# но текущая потерпела неудачу, то кэш не будет использован. Сейчас это
# работает только для аутентификации с открытым текстом.
#auth_cache_ttl = 1 hour

# Время жизни для неудачных попыток (пользователь не найден,
# неверный пароль). 0 значит выключить кэширование.
#auth_cache_negative_ttl = 1 hour

# Space separated list of realms for SASL authentication mechanisms that need
# them. You can leave it empty if you don't want to support multiple realms.
# Many clients simply use the first one listed here, so keep the default realm
# first.
#auth_realms =

# realm/domain по умолчанию, если тот явно не задан. Это используется
# и для SASL realms, и для добавления @domain к имени пользователя
# при авторизации открытым текстом.
#auth_default_realm =

# Список разрешенных символов в имене пользователя. Если полученное
# имя пользователя имеет символы не из списка, то пользователь
# автоматом получает отлуп. Это простая проверка позволяет слать
# лесом ботов, ну и чтобы не получить проблем с экранированием данных
# при запросах к SQL/LDAP. Если вы хотите разрешить любые символы, то
# оставьте это поле пустым.
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

# Преобразование имени пользователя перед поиском в БД. Значение
# содержит серию замен (исходный -> нужный). Например, "#@/@"
# значит, что символы '#' и '/' будут преобразованы в '@'.
#auth_username_translation =

# Формат имени пользователя перед просмотром в БД. Вы можете
# использовать здесь стандартные значения, например, %Lu
# преобразует символы в нижний регистр, %n - отбросить домен, если
# он задан, или "%n-AT-%d" - заменить символ '@' на '-AT-'. Это
# преобразование выполняется после auth_username_translation.
auth_username_format = %Lu

# If you want to allow master users to log in by specifying the master
# username within the normal username string (ie. not using SASL mechanism's
# support for it), you can specify the separator character here. The format
# is then <username><separator><master username>. UW-IMAP uses "*" as the
# separator, so that could be a good choice.
#auth_master_user_separator =

# Имя анонимного пользователя, используемое с механизмом
# ANONYMOUS SASL.
#auth_anonymous_username = anonymous

# Максимальное количество работающих процессов аутентификации.
# Эти процессы создаются и уничтожаются автоматически.
auth_worker_max_count = 30

# Имя хоста используемое в GSSAPI. По умолчанию берется из системы.
# Значение "$ALL" разрешает использовать любые записи keytab.
# Host name to use in GSSAPI principal names. The default is to use the
# name returned by gethostname(). Use "$ALL" to allow all keytab entries.
#auth_gssapi_hostname =

# Kerberos keytab для работы с GSSAPI. Если не указан, то
# используется системное значение (обычно /etc/krb5.keytab).
#auth_krb5_keytab =

# Авторизация NTLM и GSS-SPNEGO через демона winbind и ntlm_auth
# из пакета Samba. <doc/wiki/Authentication/Mechanisms/Winbind.txt>
auth_use_winbind = no

# Путь до тулзы ntlm_auth из пакета Samba.
#auth_winbind_helper_path = /usr/bin/ntlm_auth

# Количество секунд выжидаемое перед повторной попыткой аутентификации.
auth_failure_delay = 2 secs

# Отказать в аутентификации, если у клиента неверный SSL сертификат.
auth_ssl_require_client_cert = no

# Взять имя пользователя из SSL сертификата (который предоставил клиент).
# Будет использована функция X509_NAME_get_text_by_NID(), которая
# возвращает значение поля CommonName. 
auth_ssl_username_from_cert = no

# Список, разделенный пробелами, разрешенных методов аутентификации:
#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
#   gss-spnego
# Учитывайте значение параметра disable_plaintext_auth.
auth_mechanisms = plain login

##
## Параметры базы данных пользователей
##

#
# БД паролей, используемая для проверки пользователей (и ничего более).
# Вы можете настроить несколько БД паролей (passdbs) и
# пользователей (userdbs). Это полезно, если вы хотите сделать доступ
# системным пользователям и виртуальным одновременно, чтобы
# не пришлось дублировать системных в базе виртуальных.
# <doc/wiki/PasswordDatabase.txt>
#
# БД пользователей определяет, где хранится почта и какому
# пользователю/группе она принадлежит. При конфигурации
# single-UID используйте "static".
#
# <doc/wiki/UserDatabase.txt>

#!include auth-deny.conf.ext
#!include auth-master.conf.ext

#!include auth-system.conf.ext
!include auth-sql.conf.ext
#!include auth-ldap.conf.ext
#!include auth-passwdfile.conf.ext
#!include auth-checkpassword.conf.ext
#!include auth-vpopmail.conf.ext
#!include auth-static.conf.ext

Файл conf.d/10-logging.conf:

##
## Расположение лог файлов.
##

# Файл, в который записываются сообщения об ошибках.
# Укажите "syslog", чтобы слать все в syslog.
# Укажите /dev/stderr, чтобы слать все в  stderr.
log_path = /var/log/dovecot/mainlog

# Лог файл, в который выводятся информационные сообщения.
# Если не задано, то используется параметр log_path.
#info_log_path =

# Лог файл, в который выводятся отладочные сообщения.
# Если не задано, то используется параметр log_path.
#debug_log_path =

# Раздел syslog для логов.
#syslog_facility = mail

##
## Ведение логов и отладка.
##

# Писать в лог о неудачных попытках входа и их причину.
auth_verbose = yes

# В случае, если пароль неверен, выводить в лог пароль.
# Возможные значения: no, plain и sha1. Значение sha1 может быть полезно
# для выявления перебора паролей
auth_verbose_passwords = no

# Выводить более информативные сообщения в лог. Так же пишутся
# запросы SQL.
#auth_debug = no

# В случае несовпадения паролей писать в лог пароли и используемую
# схему авторизации. Полезно для отладки. Перед включением
# включите auth_debug.
#auth_debug_passwords = no

# Включить вывод отладочных сообщений. Это может вам определить,
# почему Dovecot не может найти ваши письма.
#mail_debug = no

# Выводить инфу про SSL в сообщениях об ошибках.
#verbose_ssl = no

# Плагин mail_log предоставляет более гибкое управление ведением логов.
plugin {
 # Какие события писать в лог. Еще можно указать: flag_change append
 #mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
 # Возможные поля: uid, box, msgid, from, subject, size, vsize, flags
 # size and vsize are available only for expunge and copy events.
 #mail_log_fields = uid box msgid size
}

##
## Формат лог сообщений.
##

# Префикс для сообщений, формат смотреть в мане по strftime(3).
#log_timestamp = "%b %d %H:%M:%S "

# Список, разделенный пробелами того, что вы хотите писать.
# Элементы, которые имеют не пустое значение будут объединяться
# вместе в выходной строке с помощью запятой.
#login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c

# Формат лога подключений. %$ заменяется на login_log_format_elements,
# %s заменяется на данные.
#login_log_format = %$: %s

# Префикс для выводимых сообщений в лог файл. Смотрите
# <doc/wiki/Variables.txt>, чтобы знать - какие значения здесь
# возможны.
#mail_log_prefix = "%s(%u): "

# Формат лог сообщений доставщика писем. Вы можете использовать следующие значения:
#  %$ - статус доставки (e.g. "saved to INBOX")
#  %m - Message-ID
#  %s - тема
#  %f - от кого
#  %p - физический размер
#  %w - виртуальный размер
#deliver_log_format = msgid=%m: %$

Файл conf.d/10-mail.conf:

##
## Пути к ящикам и пространства имен
##

# Расположение почтовых ящиков. По умолчанию эта переменная не задана,
# поэтому Dovecot пытается найти почтовые ящики автоматически.
# Это не будет работать, если пользователь не имеет почтового ящика,
# поэтому лучше задать этот параметр.
#
# Если вы используете mbox, то одного пути к файлам почтового ящика
# (например, /var/mail/%u) не будет достаточно. Так же вы должны
# предоставить Dovecot,у, где будут храниться другие почтовые ящики.
# Это называется "root mail directory (корневая директория почты)" и она должна
# быть задана первой в параметре mail_location.
#
#  Так же вы можете использовать следующие переменные:
#
#   %u - имя пользователя
#   %n - имя польльзователя, только без домена
#   %d - имя домена (пусто, если домен не указан)
#   %h - домашняя директория
#
# Полный список смотрите здесь - <doc/wiki/Variables.txt>. Примеры:
#
#   mail_location = maildir:~/Maildir
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# <doc/wiki/MailLocation.txt>
#
mail_location = maildir:~/Maildir

# Если вы хотите задать несколько местоположений почтовых ящиков или
# хотите изменить пространства имен, вы можете сделать это определяя
# секции пространств имен.
#
# Вы можете создать приватные, разделяемые и общие пространства имен.
# Приватные пространства имен используются для личных писем пользователй.
# К разделяемым пространствам могут иметь доступ другие пользователи.
# Общие пространства разделяется между почтовыми ящиками, которые
# управляются админами. Если вы создаете разделяемые или общие 
# пространства, то вам понадобится ACL плагин (для управляения правами
# доступа), в противном случае пользователи будут иметь доступ ко всем
# разделяемым почтовым ящикам, только если у них есть такая возможность
# на уровне прав доступа файловой системы.
#
# Запомните: Если вы добавляете какие-либо пространства имен, то пространства
# имен по умолчанию должны быть добавлены обязательно, то есть значение
# mail_location ничего не значит, пока в пространстве имен не задан параметр
# location. По умолчанию пространство имен не имеет префикса.
#namespace {
 # Тип пространства имен: private, shared или public
 #type = private

 # Используйте здесь обратный слэш в роли разделителя. Вы должны
 # использовать такой разделитель для всех пространств имен или
 # могут возникнуть проблемы с некоторыми клиентами.
 # Зависит от формата пользовательского ящика.
 #separator =

 # Для доступа к пространству имен требуется указать префикс. Он должен
 # быть разным для каждого пространства имен. Например, "Public/".
 #prefix =

 # Физическое местоположение почтового ящика. Формат такой же как и
 # у параметра mail_location. Если не задан, то значение берется
 # из mail_location.
 #location =

 # Может быть только один ящик для приема сообщений и этот параметр
 # определяет у какого пространства имен будет этот ящик.
 #inbox = no

 # If namespace is hidden, it's not advertised to clients via NAMESPACE
 # extension. You'll most likely also want to set list=no. This is mostly
 # useful when converting from another server with different namespaces which
 # you want to deprecate but still keep working. For example you can create
 # hidden namespaces with prefixes "~/mail/", "~%u/mail/" and "mail/".
 #hidden = no

 # Show the mailboxes under this namespace with LIST command. This makes the
 # namespace visible for clients that don't support NAMESPACE extension.
 # "children" value lists child mailboxes, but hides the namespace prefix.
 #list = yes

 # Namespace handles its own subscriptions. If set to "no", the parent
 # namespace handles them (empty prefix should always have this as "yes")
 #subscriptions = yes
#}

# Пример конфигурации разделяемого пространства имен
#namespace {
 #type = shared
 #separator = /

 # Почтовые ящики отображаются так - "shared/user@domain/"
 # %%n, %%d и %%u преобразуются в конечного пользователя.
 #prefix = shared/%%u/

 # Местонахождение писем для других почтовых ящиков. Учтите,
 # что %variables и ~/ преобразуются в данные, связанные
 # с подключенным пользователем. %%n, %%d, %%u и %%h
 # преобразуются в данные, связанные с конечным пользователем.
 #location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u

 # Использовать пространство имен по умолчанию для подписчиков.
 #subscriptions = no

 # Показывать только пространство имен shared/, если выводится
 # список разделяемых почтовых ящиков.
 #list = children
#}

# Системные пользователь и группа, которые используются для доступа
# к почтовым ящикам. Если вы используюте различных пользователей
# и различные группы, то используя колонки uid или gid из БД пользователей,
# можно переопределить эти значения. Вы можете использовать здесь
# имена или числовые идентификаторы. <doc/wiki/UserIds.txt>
mail_uid = mailnull
mail_gid = mailnull

# Группа, используемая для привилигированных операций. На данный момент
# это используется только с INBOX, когда не удается его создание или
# не получается блокировка (dotlock). Обычно используется группа "mail" для
# доступа к /var/mail.
mail_privileged_group = mail

# Предоставить доступ этим группам к процессу, обрабатывающему письма.
# В основном это используется для разрешения доступа к разделяемым
# пространствам имен. Учтите, что это может быть опасно, если пользователи
# могут создавать символические ссылки (например, если здесь указана
# группа "mail", то ln -s /var/mail ~/mail/var позволит удалять пользователю
# чужие почтовые ящики, или ln -s /secret/shared/box ~/mail/mybox позволит
# читать их).
#mail_access_groups =

# Предоставить полный доступ к ФС клиентам. В этом случае не происходит
# каких-либо проверок доступа, только проверки на уровне прав доступа ФС.
# Это работает с Maildir и mbox, разрешая указывать префикс к имени
# ящика, например, /path/ или ~/user/.
mail_full_filesystem_access = no

##
## Процесс, работающий с письмами
##

# Не использовать системный вызов mmap(). Такое поведение
# может потребоваться, если индексы хранятся на разделяемой
# ФС (например, NFS или кластерная ФС).
mmap_disable = no

# Использовать флаг O_EXCL, когда создаются файлы блокировки (dotlock).
# NFS поддерживает O_EXCL, начиная с версии 3, так что на сегодняший
# день данный параметр не создаст каких-либо проблем.
dotlock_use_excl = yes

# Когда использовать системные вызовыfsync() или fdatasync():
#   optimized (по умолчанию): при необходимости, чтобы не потерять важные данные
#   always: полезна, например для NFS, где запись откладывается (задерживается)
#   never: вообще не использовать (лучшая производительность, но любой сбой
#     может привести к потери данных)
mail_fsync = optimized

# Для хранения писем используется NFS. Установите этот параметр в 'yes',
# чтобы Dovecot при необходимости сбрасывал кэши NFS. Если вы
# используете локальную ФС для хранения, то изменение этого параметра
# не требуется.
mail_nfs_storage = no

# Индексы тоже хранятся на NFS. Этот параметр требует
# mmap_disable=yes и fsync_disable=no.
#mail_nfs_index = no

# Метод блокировки для индексов. Возможные значения fcntl, flock и dotlock.
# В методе блокировки dotlock используются некоторые трюки, 
# что может увеличить нагрузку на подсистему ввода/вывода диска.
# Пользователям NFS следует знать: что flock в данном случае не работает,
# не забывайте изменять mmap_disable.
lock_method = fcntl

# Директория, в которой LDA/LMTP временно сохраняет входящие сообщения
# размером более 128 Кб.
mail_temp_dir = /var/tmp

# Допустимые дапазоны UID для пользователей, по умолчанию от 500 и выше.
# То есть никто не сможет зайти на сервер с идентификатором ниже/выше
# указанного. Учтите, что руту доступ запрещен на уровне кода.
first_valid_uid = 26
#last_valid_uid = 0

# Тоже самое, только для групп. Если у пользователя основная группа
# с идентификатором, выходящим из данного диапазона, то в доступе
# такому пользователю будет отказано.
first_valid_gid = 26
#last_valid_gid = 0

# Максимальная длина для имени ключевого слова письма.
# Может пригодится при создании новых ключевых слов.
#mail_max_keyword_length = 50

# Список директорий, разделенный двоеточиями, в которые можно 
# будет chroot,иться процессу (например, если указать здесь /var/mail,
# то возможен будет chroot в поддиректории). Этот параметр не влияет
# на login_chroot, mail_chroot or auth chroot. Если параметр не задан,
# то "/./" в домашних директориях будет игнорироваться.
# Осторожно: Никогда не указывайте здесь директории, к которым
# имеют доступ локальные пользователи. Этим правилом можно
# пренибреч, только если у пользователей нет доступа к шелу.
# <doc/wiki/Chrooting.txt>
#valid_chroot_dirs =

# Основная директория для chroot,а процесса. Этот параметр может быть
# изменен для определенных пользователей, указав в пути к 
# домашней директории /./ (например, /home/./user chroot в /home).
# Следует знать, что в основном chroot процесса не требуется.
# Dovecot не позволит пользователям получить доступ к файлам
# за пределами домашней директории в любом случае. 
# <doc/wiki/Chrooting.txt>
#mail_chroot =

# Путь к UNIX сокету сервера аутентификации.
# Сокет используется imap (for shared users) и lda.
auth_socket_path = /var/run/dovecot/auth-userdb

# Директория, в которой находятся плагины.
mail_plugin_dir = /usr/local/lib/dovecot

# Список плагинов, разделенный пробелами, которые должны
# быть загружены. Плагины специфичные для IMAP, LDA  и т.п.
# включаются в других (собственных) файлах конфигурации.
mail_plugins = $mail_plugins quota

##
## Оптимизация работы с почтовыми ящиками
##

# Минимальное количество писем в почтовом ящике перед обновлением
# файла кеша. Благодаря этому параметру Dovecot будет делать меньше 
# операций записи на диск, но количество операций чтения возрастет.
#mail_cache_min_mail_count = 0

# Если получена команда IDLE, то почтовый ящик будет периодически
# проверяться на предмет получения новых писем или других изменений.
# Этот параметр определяет минимальное количество секунд перед
# проверкой. Dovecot может использовать dnotify, inotify и kqueue, чтобы
# узнать об изменениях.
#mailbox_idle_check_interval = 30 secs

# Сохранять текст письма с CR+LF в конце вместо LF. Это может уменьшить
# нанагрузку на проц при работе с некоторыми письмами, особенно если
# используется системный вызов sendfile(). Но увеличиться нагрузка
# на подсистему ввода/вывода, поэтому прироста в производительности
# может и не быть, а может быть она вообще снизится. Так же следует знать,
# что использование такой возможности может вызвать проблемы с другим
# програмным обеспечением, работающем в ящиках.
#mail_save_crlf = no

##
## Параметры Maildir
##

# По умолчанию для команды LIST выводится все записи в почтовом ящике,
# начинающиеся с точки. Включение этой опции заставляет Dovecot возвразать
# только список директорий.  Для каждого объекта в почтовом ящике
# вызывается системный вызов stat(), что нагружает подсистему ввода/вывода.
#maildir_stat_dirs = no

# При копировании письма создавать жесткую ссылку, если это возможно.
# В таком случае производительность возрастет без каких-либо последствий.
maildir_copy_with_hardlinks = yes

# Если Dovecot единственной MUA, который имеет доступ к почтовым ящикам,
# то возможно сканировать директорию cur/, только когда изменен mtime
# или когда не удается найти письма.
#maildir_very_dirty_syncs = no

##
## Параметры mbox
##

# Системный вызов, используемый для блокировок при просмотре mbox.
# Доступно четыре вызова:
#    dotlock: создавать файл <mailbox>.lock. Это старый способ, но безопасный
#      для NFS. Если вы используете директорию /var/mail, то пользователи
#      должны иметь права на запись в нее.
#    dotlock_try: тоже самое, что и dotlock, но если блокировка не удастся,
#      из-за прав доступа или недостаточного количества места на диске, то
#      то просто проигнорировать это.
#    fcntl: использовать, если возможно. Работает с NFS, если работает 
#      демон lockd.
#    flock: данный вызов есть не во всех системах. Не работает с NFS.
#    lockf: данный вызов есть не во всех системах. Не работает с NFS.
# Вы можете использовать несколько методов, если только из-за этого
# не возникнет проблем с другим софтом (MTA/MUA), то есть другой софт
# должен поддерживать данные методы. Некоторые ОС не позволяют 
# использовать разные блокировки одновременно.
#mbox_read_locks = fcntl
#mbox_write_locks = dotlock fcntl

# Максимальное кол-во секунд выжидаемое для заблокированного файла
# перед отменой.
#mbox_lock_timeout = 5 mins

# Пересоздать блокировку на файл, если почтовый ящик не был изменен
# в течении этого времени (указывать в секундах).
#mbox_dotlock_change_timeout = 2 mins

# Когда содержимое mbox изменяется, необходимо полностью перечитать 
# его. Если mbox очень большой, то это может занять много времени. Так
# как изменение чаще всего происходит из-за прихода нового письма, то
# было бы гораздо прочитать только новые письма. Если этот параметр
# включен, то Dovecot делает это, но при необходимости перечитывает mbox.
# Параметр следует отключить, если другие MUA могут изменить флаги
# сообщний, о чем Dovecot соответственно не будет знать. Так же следует
# знать, что сброс кэшей выполняется с командами SELECT, EXAMINE,
# EXPUNGE и CHECK.
#mbox_dirty_syncs = yes

# Аналогично mbox_dirty_syncs, но не будет осуществляться сброс кэшей,
# даже если выполняются команды SELECT, EXAMINE, EXPUNGE и CHECK.
# Если этот параметр включен, то параметр mbox_dirty_syncs игнорируется.
#mbox_very_dirty_syncs = no

# Задерживать запись заголовков mbox, до тех пор пока происходит сброс
# кэшей (команды EXPUNGE и CHECK, после чего файл закрывается).
# Такое поведение может оказаться полезным при использовании протокола
# POP3, когда пользователи пытаются удалить все письма. С другой стороны,
# плохо, что другие MUA не видят изменений в ящике.
#mbox_lazy_writes = yes

# Не писать индекс, пока ящик mbox не наберет заданный здесь размер в
# килобайтах. Если индекс уже был создан, то он будет использоваться, но
# не будет обновляться, если размер ящика меньше заданного.
#mbox_min_index_size = 0

##
## Параметры mdbox
##

# # Максимальный размер файла dbox, перед ротацией.
#mdbox_rotate_size = 2M

# Максимальное время жизни dbox файла перед ротацией. Обычно задается
# в днях. Дни считаются с полуночи, поэтому 1d = сегодня, 2d = вчера и т.д.
# Если 0, то такая проверка отключена.
#mdbox_rotate_interval = 1d

# При создании новых файлов mdbox резервировать место для них
# размером в mdbox_rotate_size. Этот функционал работает только на Linux
# и на определенных файловых системах (ext4, xfs).
#mdbox_preallocate_space = no

##
## Параметры для прикрепляемых файлов (вложений).
##

# sdbox и mdbox могут сохранять вложения во внешние файлы.
# На данный момент другие форматы почтовых ящиков не поддерживают
# данный функционал.
# sdbox and mdbox support saving mail attachments to external files, which
# also allows single instance storage for them. Other backends don't support
# this for now.

# Предупреждение: Этот функционал до конца не отлажен, поэтому
# используйте его на свой страх и риск.

# Директории, в которой будут сохраняться вложения. Если не задано, то
# данный функционал отключен.
#mail_attachment_dir =

# Вложения которые меньше указанного здесь размера не будут сохранены
# во внешние файлы. Возможно написать плагин, который будет определять
# по каким-то другим критериям сохранять файл во внешнее хранилище
# или нет.
#mail_attachment_min_size = 128k

# Backend фаловой системы, который используется для сохранения вложений:
#  posix : No SiS done by Dovecot (but this might help FS's own deduplication)
#  sis posix : SiS with immediate byte-by-byte comparison during saving
#  sis-queue posix : SiS with delayed comparison and deduplication
#mail_attachment_fs = sis posix

# Хэш функция, используемая для генерации имен файлов вложений.
# Вы можете указать здесь обычный текст и следующие переменные: %{md4},
# %{md5}, %{sha1}, %{sha256}, %{sha512}, %{size}. Результат переменных
# может быть ограничен, например так %{sha256:80} - вернет первые 80 бит.
mail_attachment_hash = %{sha1}

Файл conf.d/10-master.conf:

default_process_limit = 100
default_client_limit = 1000

# Лимит VSZ (virtual memory size) для процессов по умолчанию. Такая
# плюшка предназначена, чтобы отловить и прибить процессы, которые
# пытаются слопать всю память.
#default_vsz_limit = 256M

# Пользователь, под которым работает процесс авторизации пользователй.
# Этот пользователь должен иметь самые минимальные права в системе.
default_login_user = dovenull

# Пользователь, под которым работают непривелигерованные процессы.
# Это должен быть другой пользователь (не такой же, как в default_login_user),
# чтобы пользователь default_login_user не мог оказать никакого влияния
# на другие процессы Dovecot,а.
default_internal_user = dovecot

service imap-login {
 inet_listener imap {
   port = 143
 }
 inet_listener imaps {
   port = 993
   ssl = yes
 }

 # Количество активных подключений, по превышению которого будет создан
 # новый процесс. Обычно используются значения 0 (без ограничений) или 1. 
 # Подход со значением 1 является более безопасным, но медленным
 # по сравнению со значением 0. <doc/wiki/LoginProcess.txt>
 service_count = 1

 # Количество процессов, ждущих подключений.
 process_min_avail = 3

 # Если вы установили service_count=0, то памяти процессу нужно выделить больше.
 vsz_limit = 64M
}

service pop3-login {
 inet_listener pop3 {
   port = 110
 }
 inet_listener pop3s {
   port = 995
   ssl = yes
 }
}

service lmtp {
 unix_listener lmtp {
   #mode = 0666
 }

 # Параметры сетевого сокета
 #inet_listener lmtp {
   # Avoid making LMTP visible for the entire internet
   #address =
   #port = 
 #}
}

service imap {
 # Большая часть памяти уходит для mmap()ing файлов. Для очень больших вложений
 # памяти нужно выделить больше.
 vsz_limit = 256M

 # Максимальное количество процессов обрабатывающих IMAP подключения.
 process_limit = 128
}

service pop3 {
 # Максимальное количество процессов обрабатывающих POP3 подключения.
 process_limit = 256
}

service auth {
 # auth_socket_path указыват расположение Unix сокета. Он может
 # использоваться dovecot-lda, doveadm, процессами imap process и т.д.
 # По умолчанию только пользователь root имеет к нему доступ, причем
 # только права на чтение, но вам может потребоваться изменить права
 # доступа к Unix сокету. Пользоваели, которые имеют доступ к сокету
 # могут получить список всех пользователей и получить любые данные,
 # возвращаемые запросами к базе данных пользователй.
 unix_listener auth-userdb {
   mode = 0600
   user = mailnull
   group = wheel
 }

 unix_listener auth-client {
   mode = 0600
   user = smmsp
   group = wheel
 }

 # Postfix smtp-auth
 #unix_listener /var/spool/postfix/private/auth {
 #  mode = 0666
 #}


 # Пользователь, под которым работает процесс авторизации.
 user = $default_internal_user
}

service auth-worker {
 # По умолчанию данный процесс (auth worker) запускается под рутом,
 # чтобы иметь возможность доступа к файлу /etc/shadow. Если вам это
 # не нужно, то можно запускать его под пользователем $default_internal_user.
 user = $default_internal_user
}

service dict {
 # Если используется dict proxy, то процессы, обрабатывающие почту,
 # должны иметь доступ к сокету dict proxy.
 # Например: mode=0660, group=vmail and global mail_access_groups=vmail
 unix_listener dict {
   #mode = 0600
   #user = 
   #group = 
 }
}

Файл conf.d/10-ssl.conf:

##
## Параметры SSL
##

# Использовать SSL/TLS: yes, no, required. <doc/wiki/SSL.txt>
ssl = yes

# Сертификат и приватный ключ X.509 SSL/TLS. Файлы открываются перед тем,
# как будут сброшены привелегии root, поэтому сохраняйте файл не доступным
# для всех, кроме пользователя root. В дистрибутив включен скрипт (doc/mkcert.sh),
# который облегчит вам создание собственных подписанных сертификатов.
ssl_cert = </usr/local/etc/exim/exim.crt
ssl_key = </usr/local/etc/exim/exim.pem

# Если файл-ключ защищен паролем, то укажите этот пароль здесь.
# Так же пароль можно задать с помощью ключа -p. Since this file is often
# world-readable, you may want to place this setting instead to a different
# root owned 0600 file by using ssl_key_password = <path>.
#ssl_key_password =

# Файл, содержащий правильные центры сертификации. Задайте, только
# если вы собираетесь использовать ssl_verify_client_cert=yes.
# The file should contain the CA certificate(s) followed by the matching
# CRL(s). (e.g. ssl_ca = </etc/ssl/certs/ca.pem)
#ssl_ca =

# Проверять сертификат пользователя. Если вы хотите сделать это
# обязательным, то установите параметр ssl_require_client_cert=yes
# в секции авторизации.
ssl_verify_client_cert = no

# Какое поле сертификата использовать в качестве имени пользователя.
# Обычно используют commonName и x500UniqueIdentifier.Вам также
# потребуется задать задать параметр ssl_username_from_cert=yes.
#ssl_cert_username_field = commonName

# Как часто регенирировать файл параметров SSL. При генерации
# интенсивно используется CPU. Значение задается в часах,
# если указать 0, то данная фишка будет отключена.
#ssl_parameters_regenerate = 168

# Доступные шифры SSL
ssl_cipher_list = ALL:!LOW:!SSLv2:!ADH:!RC4:!MD5:!EXP:!aNULL:!eNULL:!NULL

Файл conf.d/15-lda.conf:

##
## Параметры LDA (также используются для LMTP)
##

# Адрес, используемый для отправки отклоненных писем.
# По умолчанию postmaster@example.com.
postmaster_address = mailer-daemon@info-x.org

# Имя хоста, используемое в некоторых частях письма
# (например, в Message-Id). По умолчанию берется из системы.
hostname = mx.info-x.org

# Если пользователь превысил квоту, то вернуть ошибку о временном
# сбое вместо отправки отлупа.
quota_full_tempfail = no

# Бинарник sendmail,а для отправки отлупов.
#sendmail_path = /usr/sbin/sendmail

# Если параметр задан, то отправлять письма через, указанный здесь
# SMTP host[:port], вместо использования утилиты sendmail.
submission_host = localhost:25

# Указывать следующую тему в отлупах. Вы можете использовать
# некоторые значения как в параметре rejection_reason ниже.
#rejection_subject = Rejected: %s

# Сообщение об отлупах. Вы можете использовать следующие значения:
#  %n = CRLF, %r = reason, %s = original subject, %t = recipient
#rejection_reason = Your message to <%t> was automatically rejected:%n%r

# Символ, помещаемый между локальной частью (local-part) и подробным
# email адресом (detail in email address).
#recipient_delimiter = +

# Header where the original recipient address (SMTP's RCPT TO: address) is taken
# from if not available elsewhere. With dovecot-lda -a parameter overrides this. 
# A commonly used header for this is X-Original-To.
#lda_original_recipient_header =

# Если происходит доставка в несуществующую папку (в которой хранится
# почтовый ящик), то создать ее?
lda_mailbox_autocreate = yes

# Should automatically created mailboxes be also automatically subscribed?
lda_mailbox_autosubscribe = no

protocol lda {
 # Список подключаемых плагинов, разделенный запятыми
 # (по умолчанию значение глобальной переменной mail_plugins).
 mail_plugins = $mail_plugins sieve

 log_path =
 info_log_path =
 syslog_facility = mail
}

Файл conf.d/20-imap.conf:

##
## Параметры IMAP
##

protocol imap {
 # Максимальная длина команды IMAP в байтах. Некоторые клиенты посылают
 # слишком длинные команды при работе с очень большими ящиками, поэтому
 # вам может понадобиться отказывать таким клиентам с сообщением
 # "Too long argument" или "IMAP command line too large" в таком случае.
 #imap_max_line_length = 64k

 # Максимальное кол-во подключений для пользователя с одного IP адреса.
 # Учтите, что в имени пользователя учитывается регистр букв.
 mail_max_userip_connections = 5

 # Список подключаемых плагинов, разделенный запятыми
 # (по умолчанию значение глобальной переменной mail_plugins).
 mail_plugins = $mail_plugins imap_quota

 # Формат логов:
 #  %i - общее кол-во байт полученных от клиента
 #  %o - общее кол-во байт отправленных клиенту
 imap_logout_format = bytes=%i/%o

 # Заменить ответ IMAP CAPABILITY на указанный здесь.
 # If the value begins with '+', add the given capabilities on top
 # of the defaults (e.g. +XFOO XBAR).
 #imap_capability =

 # Сколько секунд ждать ответа от клиента "OK Still here",
 # когда тот ничего не делает.
 imap_idle_notify_interval = 2 mins

 # Идентификационные данные, отправляемые клиенту. Используйте *,
 # чтобы Dovecot использовал значение по умолчанию. Следующие
 # данные имеют значение по умолчанию: name, version, os, os-version, 
 # support-url, support-email.
 #imap_id_send =

 # Какие идентификационные данные писать в лог. * -  значит все.
 #imap_id_log =

 # Хаки для некоторых быжных клиентов:
 #   delay-newmail:
 #     Отправлять (EXISTS/RECENT) уведомления о новых сообщениях,
 #     только когда получены команды NOOP и CHECK. В противном
 #     случае некоторые клиенты игнорируют эту инфу, например 
 #     OSX Mail (<v2.1). Outlook Express еще корявее, без этого хака
 #     может показывать пользователю сообщение об ошибке
 #     "Message no longer in server". Учтите, что OE6 может так же
 #     криво работать, если синхронизация установлена в "Headers Only".
 #     
 #   tb-extra-mailbox-sep:
 #     В mbox ящик может содержать или письма, или папки, что-то одно
 #     из них. Thunderbird разделяет их, вынуждая сервер принимать
 #     суффикс '/' в именах ящиков при работе в списках рассылки.
 #
 #   tb-lsub-flags:
 #     Show \Noselect flags for LSUB replies with LAYOUT=fs (e.g. mbox).
 #     This makes Thunderbird realize they aren't selectable and show them
 #     greyed out, instead of only later giving "not selectable" popup error.
 # Элементы списка разделяются пробелами.
 #imap_client_workarounds = 
}

Файл conf.d/20-managesieve.conf:

##
## Параметры ManageSieve
##

# Раскомментируйте, чтобы включить managesieve.
protocols = $protocols sieve

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

 #inet_listener sieve_deprecated {
 #  port = 2000
 #}

 # Количество активных подключений, по превышению которого будет создан
 # новый процесс. Обычно используются значения 0 (без ограничений) или 1. 
 # Подход со значением 1 является более безопасным, но медленным
 # по сравнению со значением 0. <doc/wiki/LoginProcess.txt>
 service_count = 1

 # Количество процессов, ждущих подключений.
 #process_min_avail = 0

 # Если вы установили service_count=0, то памяти процессу нужно выделить больше.
 vsz_limit = 64M
}

service managesieve {
 # Максимальное количество процессов обрабатывающих подключения.
 #process_count = 0
}

protocol sieve {
 # Максимальная длина команды ManageSieve в байтах. ManageSieve обычно не
 # использует длинных команд, поэтому этот параметр изменять не требуется.
 #managesieve_max_line_length = 65536

 # Максимальное кол-во подключений для пользователя с одного IP адреса.
 # Учтите, что в имени пользователя учитывается регистр букв.
 mail_max_userip_connections = 5

 # Список подключаемых плагинов, разделенный запятыми
 # Не пытайтесь загрузить сюда плагины предназначенные для IMAP.
 #mail_plugins =

 # Формат логов:
 #  %i - общее кол-во байт полученных от клиента
 #  %o - общее кол-во байт отправленных клиенту
 managesieve_logout_format = bytes=%i/%o

 # Некоторые клиенты ManageSieve разработаны конкретно под CMU's timesieved,
 # поэтому могут некоректно работать с реализацией Sieve от Dovecot. В качестве
 # обходного пути здесь вы можете указать версию ManageSieve, показываемую
 # клиентам.
 # Например: 'Cyrus timsieved v2.2.13' 
 #managesieve_implementation_string = Dovecot Pigeonhole
 managesieve_implementation_string = Cyrus timsieved v2.2.13

 # Explicitly specify the SIEVE and NOTIFY capability reported by the server before
 # login. If left unassigned these will be reported dynamically according to what
 # the Sieve interpreter supports by default (after login this may differ depending
 # on the user).
 #managesieve_sieve_capability = 
 #managesieve_notify_capability =

 # Максимальное количество попыток компиляций скрипта Sieve, который
 # отправляет клиент.
 managesieve_max_compile_errors = 5

 # Редактируйте файл 90-sieve.conf для настройки квот и ограничений времени выполнения
 # скриптов Sieve.
}

Файл conf.d/20-pop3.conf:

##
## Параметры POP3
##

protocol pop3 {
 # Не выставлять флаги (надавний или прочитанно) на письма
 # в сессии POP3. Это может поребоваться для уменьшения
 # нагрузки на подсистему ввода/вывода диска. При работе
 # с хранилищем maildir не будут перемещаться файлы из
 # директории new/ в директорию cur/, а с mbox не будет записываться
 # Status-header.
 #pop3_no_flag_updates = no

 # Поддержка команды LAST, которая была описана в старых спеках POP3,
 # но удалена в новых. Некоторые клиенты все еще ее используеют.
 # При включенной опциивыполнение команды RSET приведет к сбросу
 # флага \Seen (прочитано) во всех сообщениях.
 #pop3_enable_last = no

 # Если у письма есть заголовок X-UIDL, то использовать его UIDL.
 #pop3_reuse_xuidl = no

 # Блочить ящик на время POP3 сессии.
 pop3_lock_session = yes

 # POP3 requires message sizes to be listed as if they had CR+LF linefeeds.
 # Many POP3 servers violate this by returning the sizes with LF linefeeds,
 # because it's faster to get. When this setting is enabled, Dovecot still
 # tries to do the right thing first, but if that requires opening the
 # message, it fallbacks to the easier (but incorrect) size.
 #pop3_fast_size_lookups = no

 # Использовать POP3 UIDL (уникальный идентификатор письма).
 # Вы можете использовать следующие значения, вместе с модификаторами
 # описанными в <doc/wiki/Variables.txt> (например, %Uf будет значить,
 # что имя файла будет в верхнем регистре).
 #
 #  %v - Mailbox's IMAP UIDVALIDITY
 #  %u - Mail's IMAP UID
 #  %m - хэш MD5 заголовков ящика в hex (только для mbox)
 #  %f - имя файла (только maildir)
 #  %g - Mail's GUID
 #
 # Если вы хотите ,чтобы UIDL был совместим с другими POP3 серверами,
 # то используйте следующее:
 #  UW's ipop3d         : %08Xv%08Xu
 #  Courier             : %f or %v-%u (both might be used simultaneosly)
 #  Cyrus (<= 2.1.3)    : %u
 #  Cyrus (>= 2.1.4)    : %v.%u
 #  Dovecot v0.99.x     : %v.%u
 #  tpop3d              : %Mf
 #
 # Учтите, что Outlook 2003 криво работает с форматом %v.%u, который
 # является значением по умолчанию  для Dovecot, так что если вы
 # настраиваете новый сервер, то хорошим решением будет изменить
 # данный параметр. Формат %08Xu%08Xv является самым удачным.
 #
 #pop3_uidl_format = %08Xu%08Xv

 # Сохранять UIDLs посланные POP3 клиентам, таким образом
 # pop3_uidl_format не будет изменять их. На данный момент работает
 # только с Maildir.
 #pop3_save_uidl = no

 # Формат логов POP3:
 #  %i - общее кол-во байт полученное от клиента
 #  %o - общее кол-во байт отправленное клиенту
 #  %t - количество команд TOP
 #  %p - кол-во байт, отправленное клиенту при вып. команды TOP
 #  %r - число команд RETR
 #  %b - кол-во байт, отправленное клиенту при вып. команды RETR
 #  %d - кол-во удаленных сообщений
 #  %m - кол-во сообщений (перед удалением)
 #  %s - размер ящика в байтах (перед удалением)
 #  %u - старый/новый хэш UIDL. Может помочь в поиске сообшений (или проблем),
 #    если UIDLs неожиданно изменился
 #pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s

 # Максимальное кол-во подключений для пользователя с одного IP адреса.
 # Учтите, что в имени пользователя учитывается регистр букв.
 mail_max_userip_connections = 5

 # Список подключаемых плагинов, разделенный запятыми
 # (по умолчанию значение глобальной переменной mail_plugins).
 #mail_plugins = $mail_plugins

 # Хаки для некоторых быжных клиентов:
 #   outlook-no-nuls:
 #     Outlook и Outlook Express отупляются, если письмо содержит
 #     символы NUL. С этим хаком такие символы будут заменены на
 #     символ 0x80.
 #   oe-ns-eoh:
 #     Outlook Express и Netscape Mail тупят, если пропущено окончание
 #     строки в заголовках. С этим хаком это дело поправимое.
 #
 # Элементы списка должны быть разделены пробелами.
 #pop3_client_workarounds = 
}

Файл conf.d/90-quota.conf:

##
## Настройка квот.
##

# Не забывайте подключить плагин quota в mail_plugins для включения функционала квот.
# <doc/wiki/Quota.txt>

##
## Настройка ограничений
##

# Квота задается с помощью параметра "quota_rule", указывается непосредственно
# в нем или в userdb. Возможно задавать размеры для папок в ящике:
#   quota_rule = *:storage=1GB
#   quota_rule2 = Trash:storage=+100M
# Пользователь имеет квоту в 1Гб, но для корзины выделено доп. 100Мб.

plugin {
 quota_rule = *:storage=10M
 quota_rule2 = Trash:storage=+50M
}

##
## Предупреждения о достижении пределов квот
##

# Возможно запускать исполняемый файл, когда пользователь исчерпал лимит.
# Квоты могут иметь разные ограничения. Файл будет запущен, только
# для первой сработавшей квоты, поэтому помещайте команды в порядке
# убывания ограничений. Команды запускаются через сервис скриптов
# через Unix сокет (quota-warning ниже).
# Учтите, что символ '%' должен экранироваться - %%, иначе он будет заменен
# на пустое значение.

plugin {
 #quota_warning = storage=95%% quota-warning 95 %u
 #quota_warning2 = storage=80%% quota-warning 80 %u
}

# Пример сервиса quota-warning. Права доступа к Unix сокеты должны быть
# выставлены правильно, чтобы процесс (обрабатывающие почту) мог
# открыть его. В примере ниже подразумевается, что процесс (обрабатывающий
# почту) работает с правами пользователя vmail. Если вы укажите mode=0666, то
# все системные пользователи смогут генерировать предупреждения о
# достижении лимитов квот кому угодно.
#service quota-warning {
#  executable = script /usr/local/bin/quota-warning.sh
#  user = dovecot
#  unix_listener quota-warning {
#    user = vmail
#  }
#}

##
## Храние данных о квотах
##

# Поддерживается несколько методов хранения квот:
#   dirsize: поиск всех файлов в ящике и подсчет общего размера.
#            Очень медленно работает с Maildir. Может нагрузить CPU и
#            подсистему I/O диска.
#   dict: хранить данные в словаре (например, SQL)
#   maildir: Maildir++ quota
#   fs: использовать системные квоты

plugin {
 #quota = dirsize:User quota
 quota = maildir:User quota
 #quota = dict:User quota::proxy::quota
 #quota = fs:User quota
}

# Возможны и такие конфигурации: каждый пользователь имеею квоту
# в 100Мб и есть одна разделяемая квота в 1Гб для домена.
plugin {
 #quota = dict:user::proxy::quota
 #quota2 = dict:domain:%d:proxy::quota_domain
 #quota_rule = *:storage=102400
 #quota2_rule = *:storage=1048576
}

Файл conf.d/90-sieve.conf:

##
## Параметры для интерпритатора Sieve
##

# Не забывайте включить плагин Sieve в файлах 15-lda.conf и 20-lmtp.conf,
# используя переменную mail_plugins.

plugin {
 # Путь к Sieve скрипту пользователя.
 sieve = ~/.dovecot.sieve

 # Путь к глобальному Sieve скрипту, который будет запущен только, если
 # у пользователя нет собственного Sieve скрипта. Данный скрипт необходимо
 # будет самостоятельно скомпилировать утилитой sievec.
 #sieve_global_path = /var/lib/dovecot/sieve/default.sieve

 # Directory for :personal include scripts for the include extension. 
 sieve_dir = ~/sieve

 # Directory for :global include scripts for the include extension. 
 #sieve_global_dir =

 # Какие расширения языка Sieve доступны пользователям. По умолчанию
 # доступны все поддерживаемые расширения, за исключением запрещенных
 # или расширений, находящихся на этапе разработки. Некоторым системным
 # администраторам может понадобиться запретить некоторые расширения или
 # разрешить расширения, которые по умолчанию не включены. Используя
 # '+' и '-' вы можете изменить поддержку тех или иных расширений
 # относительно стандартных настроек. Например, `sieve_extensions = +imapflags'
 # дополнительно к расширениям по уолчанию, включит запрещенное
 # расширение imapflags.
 #sieve_extensions = +notify +imapflags

 # The separator that is expected between the :user and :detail 
 # address parts introduced by the subaddress extension. This may 
 # also be a sequence of characters (e.g. '--'). The current 
 # implementation looks for the separator from the left of the 
 # localpart and uses the first one encountered. The :user part is 
 # left of the separator and the :detail part is right. This setting
 # is also used by Dovecot's LMTP service.
 #recipient_delimiter = +

 # Максимальный размер скрипта Sieve. Компилятор будет отшибать любой
 # скрипт, размер которого больше указанного здесь предела.
 sieve_max_script_size = 1M

 # Максимальное количество команд в одном скрипте.
 sieve_max_actions = 32

 # Максимальное количество переадресаций в одном скрипте.
 sieve_max_redirects = 8

 # Максимальное количество скриптов Sieve, которое может иметь пользователь.
 # (Currently only relevant for ManageSieve)
 sieve_quota_max_scripts = 30

 # Максимальный сумарный размер скриптов для одного пользователя.
 # (Currently only relevant for ManageSieve) 
 #sieve_quota_max_storage = 0
}

Файл conf.d/auth-sql.conf.ext:

# Аутентификация для пользователей SQL. Файл подключается в 10-auth.conf.
#
# <doc/wiki/AuthDatabase.SQL.txt>

passdb {
 driver = sql

 # Путь до конфигурационного файла SQL, смотрите example-config/dovecot-sql.conf.ext
 args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
}

# БД пользователей "prefetch" используется для сохранения информации
# полученной из passdb, то есть отпадает необходимость в повторном
# просмотре userdb. Такое возможно сделать при работе с хранилищем
# SQL и LDAP. <doc/wiki/UserDatabase.Prefetch.txt>
#userdb {
#  driver = prefetch
#}

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

# Если у вас нет каких-либо специфичных параметров пользователей, то вы
# можете использовать вместо user_query (userdb sql) userdb static. Например:
# <doc/wiki/UserDatabase.Static.txt>
#userdb {
 #driver = static
 #args = uid=vmail gid=vmail home=/var/vmail/%u
#}

3.3 Запуск и проверка конфигурации

Для автоматического запуска Dovecot во время старта системы необходимо добавить следующую строчку в /etc/rc.conf:

# echo 'dovecot_enable="YES"' >> /etc/rc.conf

Теперь можно запустить сервис:

# service dovecot start
# sockstat -4 -l | grep 
root     dovecot    42594 15 tcp4   *:4190                *:*
root     dovecot    42594 24 tcp4   *:110                 *:*
root     dovecot    42594 25 tcp4   *:995                 *:*
root     dovecot    42594 32 tcp4   *:143                 *:*
root     dovecot    42594 33 tcp4   *:993                 *:*

Если сервис не запустился, то смотрите логи и ищите проблему. Теперь проверим работоспособность сервиса (достаточно будет проверить работоспособность сервиса по одному протоколу, например POP3), для этого подключимся telnet,ом к серверу и сымитируем обычную сессию пользователя. Не забываем, что перед проверкой необходимо создать почтовый ящик в базе данных.

# telnet server.name 110
+OK POP3/IMAP server ready.
USER user@domain
+OK
PASS userpass
+OK Logged in.
STAT
+OK 228 66786803
QUIT
+OK Logging out.

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

 

Назад | Начало | Вперед

Яндекс.Метрика