Связка exim и dovecot с веб интерфейсом postfixadmin (FreeBSD)

Автор: lissyara.

Началось всё с того, что подсказали мне MUA с богатыми возможностями, но абсолютно неоправданно забытый в нашей стране - dovecot. Что поразило сразу - конфиг в 36кб размером. Не у многих MTA такой большой конфиг. Для начала пробежался быренько по конфигу - что сразу порадовало - масса настроек, море комментов, и, в-частности, на глаза попалось решение давнишней моей проблемы - при работе по imap почему-то становились недоступны новые мессаги. Тут было объяснение и решение. Решил перевести весь конфиг. Заколебался, но перевёл. Кстати, узнал много полезного :)

В итоге, по мере перевода конфига, родилась идея создания связки вынесенной в заголовок статьи, ибо лучшего MTA, чем exim - я не знаю. До кучи решил привернуть к этому админку от постфикса - postfixadmin, т.к. сам постфикс мне не очень нравится, хотя на одном из серверов он у меня до сих пор стоит, но вот его админка - самая лучшая из того, что я видел (каюсь, видел немного :) - но итога не меняет - из того, что видел - лучшая). Итого реально связка получается такая: exim+dovecot+postfixadmin. Её и будем ставить. Начнём с конца, ибо коммунисты не ищут лёгких путей! :)

Конфигурация тестовой машины и виртуальных доменов. Машина эта, 2x500 P-III, с 512 мегами ECC памяти и двумя U160 SCSI дисками висящими на встроенном в маму контроллере (что, конечно же, косячно - ибо он всего 40Mb/s, но тем не менее 30-31 мег в секунду снять с них удаётся). Диски не в массиве, один разбит на разделы второй одним шматком монтировался в /usr.

Ставим postfixadmin, предварительно обновив порты. Если MySQL, apache, PHP4 или что-то из модулей не стоит - всё это он притащит за собой. Опции - пожалуй всё по дефолту, тока при установке PHP посмотрите, стоит ли крестик на модуле для apache - а то последнее время, по дефолту, он снят - видимо пытаются всех перегнать на 5-й PHP, тока я вот смысла в этом не вижу - 4-й то ещё толком не знаю :).

/usr/home/lissyara/>cd /usr/ports/

/usr/ports/>make search name='postfixadmin'

Port: postfixadmin-2.1.0_1

Path: /usr/ports/mail/postfixadmin

Info: PHP frontend to postfix and mySQL

Maint: rob@debank.tv

B-deps:

R-deps: mysql-client-4.1.19 php4-4.4.2_2 php4-mysql-4.4.2_2

WWW: http://www.high5.net/postfixadmin

/usr/ports/>make && make install && make clean

Если у вас уже стояла связка apache+php+mysql то можете переходить к следующему абзацу. Если нет, то теперь надо определиться, на каком хосте будет стоять MySQL - на этом же, или на другом, ибо поставился только клиент, а не сервер. Если на этом то ставим из портов на нём, если на другом, то на другом. По дефолту клиент поставлся от MySQL 4.1, соответсвенно и сервер надо ставить такой же. Если хотите другой - то надо заранее поставить сервер с клиентом нужной версии и прописать в /etc/make.conf такую строку:

# пример для версии MySQL 5.0

DEFAULT_MYSQL_VER=50

Итак, ставим MySQL нужной версии:

/usr/home/lissyara/>cd /usr/ports/databases/mysql41-server/

/usr/ports/databases/mysql41-server/>make && make install && make clean

===> Vulnerability check disabled, database not found

You may use the following build options:

WITH_CHARSET=charset Define the primary built-in charset (latin1).

WITH_XCHARSET=list Define other built-in charsets (may be 'all').

WITH_COLLATION=collate Define default collation (latin1_swedish_ci).

WITH_OPENSSL=yes Enable secure connections.

WITH_LINUXTHREADS=yes Use the linuxthreads pthread library.

WITH_PROC_SCOPE_PTH=yes Use process scope threads

(try it if you use libpthread).

BUILD_OPTIMIZED=yes Enable compiler optimizations

(use it if you need speed).

BUILD_STATIC=yes Build a static version of mysqld.

(use it if you need even more speed).

WITHOUT_INNODB=yes Disable support for InnoDB table handler.

WITH_NDB=yes Enable support for NDB Cluster.

Если есть необходимость в каких-то опциях, то их можно задать из командной строки, как аргументы запуска команд make и make install, но это не есть правильно, ибо при обновлении при помощи программы portupgrade это потеряется (сам влетел, собрал с кодировкой и коллатион cp1251, а после обновления клиента получил знаки вопроса вместо русских букв), правильно - добавить в файл /etс/make.conf примерно такую секцию:

PORTSDIR?= /usr/ports

# для сервера

.if ${.CURDIR} == ${PORTSDIR}/databases/mysql41-server

BUILD_OPTIMIZED=yes

BUILD_STATIC=yes

.endif

# для клиента

.if ${.CURDIR} == ${PORTSDIR}/databases/mysql41-client

BUILD_OPTIMIZED=yes

BUILD_STATIC=yes

.endif

Ну и соответственно в ней добавить нужные опции сборки. После сборки меняем пассворд рута, добавляем нужного пользователя и создаём таблицы в БД по прилагаемым дампам (вообще можно создать родные от postfixadmin, по дампу идущему в комплекте с ним, но там юзер другой... мне это не понравилось :))

Итак, будем запускать всё это хозяйство:

/usr/home/lissyara/>echo 'apache_enable="YES"' >> /etc/rc.conf

/usr/home/lissyara/>echo 'mysql_enable="YES"' >> /etc/rc.conf

/usr/home/lissyara/>/usr/local/etc/rc.d/mysql-server start

Starting mysql.

/usr/home/lissyara/>/usr/local/etc/rc.d/apache.sh start

Starting apache.

/usr/home/lissyara/>

Вообще, рекомендую поставить phpMyAdmin из портов, будет чуть попроще с БД ковыряться. И создаём таблицы в БД по прилагаемому дампу:

--

-- БД: `exim`

--

USE mysql;

INSERT INTO `user` (`Host`, `User`, `Password`)

VALUES ('localhost','exim',password('exim'));

INSERT INTO `db` (`Host`, `Db`, `User`, `Select_priv`)

VALUES ('localhost','exim','exim','Y');

FLUSH PRIVILEGES;

GRANT USAGE ON exim.* TO exim@localhost;

GRANT SELECT, INSERT, DELETE, UPDATE ON exim.* TO exim@localhost;

CREATE DATABASE `exim`;

USE `exim`;

-- --------------------------------------------------------

--

-- Структура таблицы `admin`

--

CREATE TABLE `admin` (

`username` varchar(255) NOT NULL default '',

`password` varchar(255) NOT NULL default '',

`created` datetime NOT NULL default '0000-00-00 00:00:00',

`modified` datetime NOT NULL default '0000-00-00 00:00:00',

`active` tinyint(1) NOT NULL default '1',

PRIMARY KEY (`username`),

KEY `username` (`username`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Admins';

-- --------------------------------------------------------

--

-- Структура таблицы `alias`

--

CREATE TABLE `alias` (

`address` varchar(255) NOT NULL default '',

`goto` text NOT NULL,

`domain` varchar(255) NOT NULL default '',

`created` datetime NOT NULL default '0000-00-00 00:00:00',

`modified` datetime NOT NULL default '0000-00-00 00:00:00',

`active` tinyint(1) NOT NULL default '1',

PRIMARY KEY (`address`),

KEY `address` (`address`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Aliases';

-- --------------------------------------------------------

--

-- Структура таблицы `domain`

--

CREATE TABLE `domain` (

`domain` varchar(255) NOT NULL default '',

`description` varchar(255) NOT NULL default '',

`aliases` int(10) NOT NULL default '0',

`mailboxes` int(10) NOT NULL default '0',

`maxquota` int(10) NOT NULL default '0',

`transport` varchar(255) default NULL,

`backupmx` tinyint(1) NOT NULL default '0',

`created` datetime NOT NULL default '0000-00-00 00:00:00',

`modified` datetime NOT NULL default '0000-00-00 00:00:00',

`active` tinyint(1) NOT NULL default '1',

PRIMARY KEY (`domain`),

KEY `domain` (`domain`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Domains';

-- --------------------------------------------------------

--

-- Структура таблицы `domain_admins`

--

CREATE TABLE `domain_admins` (

`username` varchar(255) NOT NULL default '',

`domain` varchar(255) NOT NULL default '',

`created` datetime NOT NULL default '0000-00-00 00:00:00',

`active` tinyint(1) NOT NULL default '1',

KEY `username` (`username`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Domain Admins';

-- --------------------------------------------------------

--

-- Структура таблицы `log`

--

CREATE TABLE `log` (

`timestamp` datetime NOT NULL default '0000-00-00 00:00:00',

`username` varchar(255) NOT NULL default '',

`domain` varchar(255) NOT NULL default '',

`action` varchar(255) NOT NULL default '',

`data` varchar(255) NOT NULL default '',

KEY `timestamp` (`timestamp`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Log';

-- --------------------------------------------------------

--

-- Структура таблицы `mailbox`

--

CREATE TABLE `mailbox` (

`username` varchar(255) NOT NULL default '',

`password` varchar(255) NOT NULL default '',

`name` varchar(255) NOT NULL default '',

`maildir` varchar(255) NOT NULL default '',

`quota` int(10) NOT NULL default '0',

`domain` varchar(255) NOT NULL default '',

`created` datetime NOT NULL default '0000-00-00 00:00:00',

`modified` datetime NOT NULL default '0000-00-00 00:00:00',

`active` tinyint(1) NOT NULL default '1',

PRIMARY KEY (`username`),

KEY `username` (`username`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Mailboxes';

-- --------------------------------------------------------

--

-- Структура таблицы `vacation`

--

CREATE TABLE `vacation` (

`email` varchar(255) NOT NULL default '',

`subject` varchar(255) NOT NULL default '',

`body` text NOT NULL,

`cache` text NOT NULL,

`domain` varchar(255) NOT NULL default '',

`created` datetime NOT NULL default '0000-00-00 00:00:00',

`active` tinyint(1) NOT NULL default '1',

PRIMARY KEY (`email`),

KEY `email` (`email`)

) TYPE=MyISAM COMMENT='Exim and dovecot Admin - Virtual Vacation';

Вообще настройки самого postfixadmin - минимально отличаются от стандартных - пароль сделан в открытом виде, да и всё (в файле config.inc.php). Ему и недосуг что админит он вовсе и не постфикс :). Также советую запаролить его, с помощью .htaccess например... После создания БД, таблиц в ней, юзера можно ставить dovecot:

/usr/home/lissyara/>cd /usr/ports/

/usr/ports/>make search name='dovecot'

Port: dovecot-1.0.b8

Path: /usr/ports/mail/dovecot

Info: Secure and compact IMAP and POP3 servers

Maint: robin@isometry.net

B-deps: libiconv-1.9.2_2

R-deps: libiconv-1.9.2_2

WWW: http://www.dovecot.org/

/usr/ports/>cd /usr/ports/mail/dovecot

/usr/ports/mail/dovecot/>make && make install && make clean

Лезет синенькое окошко, где выбираем то, что нам нужно.

Options for dovecot 1.0.b8

[ ] KQUEUE kqueue(2) support

[ ] SASL2 SASL2 support

[ ] GSSAPI GSSAPI support

[ ] VPOPMAIL VPopMail support

[ ] LDAP OpenLDAP support

[ ] PGSQL PostgreSQL support

[X] MYSQL MySQL support

[ ] SQLITE SQLite support

После установки топаем рихтовать конфиг:

/usr/home/lissyara/>cd /usr/local/etc/

/usr/local/etc/>ll | grep dove

-r--r--r-- 1 root wheel 36601 24 май 13:55 dovecot-example.conf

/usr/local/etc/>cp dovecot-example.conf dovecot.conf

До такого состояния:

#!/bin/sh

# Конфиг dovecot. Начат 2006-05-26 в 16:15

# сразу предупреждаю - перевод дался реально очень тяжело,

# у автора своеобразная манера писать комменты, прям как у меня :)

# посему прошу неточности не в комментах к статье выкладывать, а

# на форуме http://forum.lissyara.su/viewforum.php?f=8

# Директория где храняться данные на время выполнения

# (временная чтоль, тогда почему не /tmp?)

base_dir = /var/run/dovecot/

# Протоколы по которым обслужиаем клиентов:

# imap imaps pop3 pop3s

protocols = imap pop3

# IP или имя хоста на котором будем слушать

# На данный момент не поддерживается задание нескольких адресов,

# единственный вариант - указать звёздочку (*) чтобы слушать все

# адреса ([::] - для IPv6)

# Для задания специфических портов для некоторых сервисов то это

# надо конфигурить в секции протоколов, примерно так:

# protocol imap {

# listen = *:10143

# ssl_listen = *:10943

# ..

# }

# protocol pop3 {

# listen = *:10100

# ..

# }

listen = *

# IP или имя хоста где ждём подключения по SSL.

# По дефолту - не задано.

#ssl_listen =

# Отключить поддержку SSL/TLS (yes/no - соответсвенно включено/отключено).

ssl_disable = yes

# PEM кодированый X.509 SSL/TLS сертификат и секретный ключ. Они открываются

# до понижения рутовых привилегий, поэтому сохраните ключевой файл

# с доступом тока для root. Включенный скрипт doc/mkcert.sh может быть

# использован для генерации самоподписанного сертификата, тока не

# забудте обновить домены в dovecot-openssl.cnf

#ssl_cert_file = /etc/ssl/certs/dovecot.pem

#ssl_key_file = /etc/ssl/private/dovecot.pem

# Если ключевой файл защищён паролем, то его надо написать тут. Как

# альтернатива - запуск dovecot с параметром '-p'.

#ssl_key_password =

# Файл содержащий авторити (центры подписывающие сертификаты). обычно не нужен.

#ssl_ca_file =

# Запрос клиента на посыл (?) сертификата.

#ssl_verify_client_cert = no

# Как часто регенерить файл с параметрами SSL. Это весьма нагружающий CPU

# процесс. Значение - в часах, 0 отключает регенерацию файла вообще.

#ssl_parameters_regenerate = 168

# Цифры используемые в SSL

#ssl_cipher_list = ALL:!LOW

# Отключить команду LOGIN и все другие plaintext аутентификации если

# SSL/TLS не используется. (совместимо с LOGINDISABLED). Отметтьте, что

# 127.*.*.* и IPv6 ::1 адреса считаются безопасными, и установки этого пункта

# не влияют на соединение с них.

disable_plaintext_auth = no

# Убивать все IMAP и POP3 процессы при остановке главного процесса dovecot

# Если поставить "no" то можно обновлять (видимо - реконфигурить) dovecot

# без принудительного закрытия открытых клиентских подключений (может быть

# проблемой - если обновление из-за безопасности).

# Надо учесть, что после того как убит мастер-процесс, клиентские процессы

# не могут писать в лог (так что, происходящее, останется неизвестным).

shutdown_clients = yes

# Использовать указанный тут файл вместо syslog(). Может быть заюзан

# /dev/stderr для логгинга. (Только /dev/stderr!)

#log_path =

# Для информационных сообщений юзайте этот файл, вместо дефолтового

#info_log_path =

# Префикс для каждой линии записываемой в syslog. Коды % прредставлены

# в формате strftime(3).

log_timestamp = "%b %d %H:%M:%S "

# Средства (немогу подобрать адекватный перевод для слова "facility", в

# таких фразах) syslog используемые при ведении логов через syslog.

# Если по каким-то причинам не хочется использовать стандартное "mail",

# можно использовать local0...local7.

syslog_facility = mail

## Секция "Про лОгины" :)

##

# Директория где аутентификационный процесс размещает UNIX сокеты

# которые требудтся для процесса логина. Сокеты создаются от суперпользователя,

# поэтому можно не беспокоится насчёт прав. При старте dovecot всё

# содержимое этой директории удаляется.

login_dir = /var/run/dovecot/login

# `chroot`ить процесс аутентификации и авторизации в login_dir.

# Очень неплохая идея - ибо этот процесс работает от рута.

# http://wiki.dovecot.org/Rootless

login_chroot = yes

# Юзер использующийся для процесса логина. При установке из

# портов создаётся новый юзер - dovecot, причём не создав его не

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

# В конце-концов мне видней нужен ли мне такой юзер и какого я буду

# использовать для этого процесса.

# Этому юзеру не нужен доступ к почте, он занимается тока

# контролем доступа к авторизации пользователя.

# http://wiki.dovecot.org/UserIds

login_user = dovecot

# Максимальный размер процесса, в мегабайтах. Если Вы не используете

# login_process_per_connection, то вероятно необходимо увеличить

# это значение.

login_process_size = 64

# Каждый логин должен быть обработан своим собственным процессом ('yes'),

# или один процесс может обрабатывать несколько соединений ('no'). 'yes' более

# секьюрно, особенно если включено SSL/TLS. 'no' быстрее работает, ибо нет

# необходимости создавать процесс на каждое соединение.

login_process_per_connection = yes

# Число запускаемых процессов логина. Если 'login_process_per_connection'

# равно 'yes', то это число свободных процессов ожидающих подключения

# пользователей.

login_processes_count = 3

# Максимальное число запускаемых процессов авторизации. Точное число процессов

# обычно находится в 'login_processes_count', но когда много юзеров одновременно

# запускают процесс авторизации может быть запущено больше процессов. Для

# предотвращения 'fork-bombing' проверка производится раз в секунду,

# необходимо ли создать новые процессы - если все используются, то их число

# удваивается, до тех пор, пока не будет достигнут предел указанный тут.

# Эта опция работает только в случае если 'login_process_per_use' = 'yes'.

login_max_processes_count = 64

# Максимальное число соединений разрешённых в сосоянии 'логина'. Когда

# достигается указанный тут лимит, самые старые связи разрываются. Если

# 'login_process_per_connection' = 'no', то это число соединений процесса,

# таким образом максимальное число одновременно залогиненых юзеров равно

# 'login_processes_count' * 'max_logging_users'.

login_max_logging_users = 128

# Приветственное сообщение для клиентов.

login_greeting = dovecot MUA ready

# Разделённый пробелами лист элементов, которые будут записаны в лог. Непустые

# элементы будут объединены через запятую.

login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c

# Формат лога аутентификации. %$ содержит цепочку login_log_format_elements,

# %s содержит данные которые будут залогированы.

login_log_format = %$: %s

## Процесс почты

## (настройки раздачи почты клиентам)

# Максимальное число запущенных mail процессов. Когда этот лимит достигнут,

# новые юзеры обламываются :)

#max_mail_processes = 1024

# Показывать больше отладочной информации (заголвков процессов?). В настоящее

# время показывается имя пользователя и IP адрес. Это может быть полезно

# для того, чтобы увидеть кто фактически использует процессы IMAP

# (общие майлбоксы, или если один uid используется несколькими аккаунтами).

verbose_proctitle = yes

# Показывать уровень протокола ошибок SSL.

#verbose_ssl = no

# Действительный диапазон UID для пользователей, дефолт от 500 и выше. Это

# необходимо для того, чтобы пользователи не смогли залогиниться как

# демоны или какие-либо системные пользователи. Запрет для логина `root`а

# жёстко забит в код `dovecot`а и не может быть разрешён даже если

# установить 'first_valid_uid' = 0.

first_valid_uid = 25

#last_valid_uid = 0

# Диапазон GID для юзеров, по дефолту не root или wheel. Юзерам имеющим

# недействительный GID как ID первичной группы вход запрёщён. Если пользователь

# входит в дополнительную группу с недействительным GID то эти группы

# не заданы (непонимаю эту фразу... Либо разрешено либо запрещено... х.з.)

first_valid_gid = 0

#last_valid_gid = 0

# Разрешить доступ для для дополнительных групп процессов обработки почты.

# Обычно, разрешается группа "mail" для доступа к /var/mail чтобы

# создавать блокировки

mail_extra_groups = mail

# Список директорий, с разделителями вида ':', в которых разрешается

#`chroot`инг для процессов обpаботки почты (т.е. /var/mail разрешает

# за`chroot`ить, до кучи, и /var/mail/foo/bar).

# Эти установки не затрагивают 'login_chroot' или 'auth_chroot' переменные.

# АХТУНГ: никогда не добавляйте директории где локальные пользователи

# имеют право что-то менять, иначе могут подсунуть эксплоит и получить рута.

# Обычно так делается если пользователи не имеют шелл-доступа.

#valid_chroot_dirs =

# Дефолтовая `chroot` директория для процесса обработки почты. Это

# может быть перекрыто настройками пользователя (из БД пользователей)

# давая /./ в домашней директории пользователя.

# (т.е. /home/./user chroot`ится в /home). Необходимо отметить что реальной

# необходимости чрутить пользователей нету - т.к. dovecot не разрешит юзерам

# получить доступ к файлам вне их домашней директории.

#mail_chroot =

# Включить отладку для процесса обработки почты. Это может помочь понять,

# почему dovecot не может найти вашу почту (дословно переведено :))

#mail_debug = yes

# Переменные окуружения MAIL для использования в случаях, когда явно они

# не заданы. Если оставить их незаданными то dovecot попробует установить

# их автоматически (описано в doc/mail-storages.txt). Есть несколько

# специальных переменных которыми можно пользоваться:

#

# %u - имя пользователя

# %n - `юзерская` часть в user@domain, тоже самое что и %u

# если имя домена не задано

# %d - `доменная` часть в user@domain, пустая, если домен не задан

# %h - домашняя директория

#

# Полный список этих переменных можно посмотреть в

# /usr/local/share/doc/dovecot/doc/variables.txt

#

# Пара примеров:

# default_mail_env = maildir:/var/mail/%1u/%u/Maildir

# default_mail_env = mbox:~/mail/:INBOX=/var/mail/%u

# default_mail_env = mbox:/var/mail/%d/%n/:INDEX=/var/indexes/%d/%n

# default_mail_env = mbox:/var/mail/%u

# Учтите, что формат этой директории должен совпадать с тем,

# который достанет exim из БД (что касается его формата в БД - это

# регулируется в конфиге postfixadmin), такчто либо думаем, как указывать,

# либо юзаем переменную %h - хомяк.

# Мне? больше нравиться такой вариант:

#default_mail_env = maildir:/var/mail/exim/%d/%n

# А в postfixadmin по дефолту такой:

default_mail_env = maildir:/var/mail/exim/%n@%d

# А можно и так (наверно даже правильней так, если прокатит - но я не

# попробовал - забыл, потому - это чистая теория:

#default_mail_env = maildir:/var/mail/exim/%h

# Если хотите установить несколько местоположений почтового ящика

# (тока нах это надо?) или хотите изменить NAMESPACE (это расширение

# описано в RFC 2342, оно позволяет одноимённой командой определить,

# какие пространства имён задействованы на сервере),

# то это можно сделать в следующих секциях:

#

# Можно иметь частные, раздёлённые и публичные пространства имён.

# Единственное различие между ними то, как dovecot объявляет их клиенту.

# Разделённые namespaces предназначены для пользовательских почтовых

# ящиков разделённых с другими пользователями, а публичные пространства

# имён для более глобально доступных почтовых ящиков (мне тяжело даются

# эти определения, поскольку я привык что один ядик - один юзер).

#

# ПОМНИТЕ: Если добавляете какой-либо namespaces, то дефолтовый namespace

# должен быть явно добавлен. т.е. default_mail_env не делает ничего, если

# если не задан namespace без указания местоположения. Дефолтовый

# namespace представляет собой namespace с пустой приставкой.

#namespace private {

# Разделитель (сепаратор) в иерархии директорий. Желательно

# использовать одинаковый во всём пространстве namespaces, иначе

# некоторых клиентов начинает плющщить. '/' - хороший выбор.

#separator = /

# Префикс требуемый для получения доступа к этому пространству имён.

# Должно быть разным во всех namespaces. Например "Public/".

#prefix =

# Физическое расположение почтового ящика. Формат точно такой же как у

# 'default_mail_env', являющейся дефолтовой для него.

#location =

# Может быть тока один INBOX, и тут определяется какой.

#inbox = yes

# Если namespace скрыто, это не показывается клиентам через NAMESPACE

# и не показывается в ответах списка (LIST). Это полезно при

# конвертировании с другого сервера с другим namespaces который

# убрать (?) но всё ещё работаете с ним. Например, вы можете создать

# скрытый namespaces с префиксом "~/mail/", "~%u/mail/" и "mail/".

#hidden = yes

#}

# Лист полей, разделённых пробелами для первоначального сохранения

# в файл кэша. На данный момент разрешены следующие поля:

#

# flags, date.sent, date.received, size.virtual, size.physical

# mime.parts, imap.body, imap.bodystructure

#

# Разные IMAP-клиенты работают по разному, и извлекают выгоду из различных

# кэшируемых областей. Некоторые клиенты не умеют ими пользоваться вообще.

# Излишнее кэширование приводит к бесполезным операциям дискового

# ввода-вывода.

#

# Dovecot пытается автоматически выяснить что хочет клиент и сохраняет

# тока это. Однако первые несколько заходов клиента ещё не известно чё

# клиент хочет, и кэширование не оптимально. Если известны потребности

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

# клиенты, фактически, не будут их использовать, то в итоге Dovecot

# удалит их.

#

# Вообще, лучше тут ничё не трогать. Ибо то, на чём можно выиграть,

# обычно, непримечательно, и думаешь на это в последнюю очередь.

#mail_cache_fields =

# Разделённый пробелами список полей которые Dovecot никогда не должен

# сохранять в кэше. Пригодится в случае если надо съэкономить место

# на диске в ущерб скорости работы.

#mail_never_cache_fields =

# Минимальное число почтовых сообщений в ящике до обновления кэш-файла

# Позволяет оптимизировать поведение Dovecot в работе с диском, засчёт

# уменьшения операций записи, но увеличения числа операций чтения.

#mail_cache_min_mail_count = 0

# Когда выполняется команда IDLE, почтовый ящик проверяется время от

# времени, чтобы обнаружить новые письма, или ещё какие изменения.

# Эта опция отвечает за минимальное время между проверками. Однако

# Dovecot может использовать `dnotify` и `inotify` в линухах чтобы

# ответить немедленно после изменения.

#mailbox_idle_check_interval = 30

# Разрешить клиентам полный доступ к файловой системе. В этом случае,

# не выполняется никаких проверок доступа, тока штатные проверки ОС

# UID/GID пользователя который работает. Это работает и с майлбокс и с

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

# типа '/path/to/mbox/' или '~user/'. (Нах, такое щассье...)

#mail_full_filesystem_access = no

# Максимальная разрешённая длинна для 'mail keyword name' (Директории, чтоль?)

# Проверяется тока при создении нового (нвой директории? надо проверить.)

#mail_max_keyword_length = 50

# Сохранять почту с CR+LF вместо LF (добавляется перевод каретки). Это

# уменьшает загрузку CPU при отдаче почты клиентам, но немного увеличиват

# размер размеры файлов, и соответственно дисковый ввод-вывод (При большом

# объёме почты цифра может оказаться достаточно существенной). Также,

# если другие программы шаряться по почтовым ящикам, то могут быть

# проблемы c неверной обработкой дополнительного CRs.

#mail_save_crlf = no

# Использовать mmap() вместо read() для чтения почтовых файлов. read()

# вродебы немного быстрей работает под Linux/x86 и лучше для NFS, поэтому

# так и стоит по дефолту. Необходимо заметить, что OpenBSD 3.3 и более

# старые не работают напрямую с mail_read_mmaped = yes.

#mail_read_mmaped = no

# Не использовать mmap() вообще. Такое требуется в случае, если индексы

# хранятся на расшаренной файловой системе (NFS или ещё какая).

#mmap_disable = no

# Не write() в mmaped файлы. Бывает необходимо для операционных систем

# которые используют для них свой кэш, например OpenBSD.

#mmap_no_write = no

# Метод блокировки индексных файлов. Альтернативы fcntl, flock и dotlock.

# Dotlocking юзает трюки, которые могут привети к большему дисковому

# вводу/выводу чем другие методы блокировки. Заметтьте, если юзаете NFS

# не забудте также изменить и значение mmap_disable setting!

#lock_method = fcntl

# По дефолту команда LIST возвращает все записи в maildir начинающиеся

# с точки. Включение этой опции заставляет dovecot возвращять тока

# директории. Это делает stat() для каждого вхождения, и вызывает больше

# дискового ввода-вывода.

# (Для систем устанавливающих dirent->d_type, эта опция свободна и так

# всегда, независимо от того, что тут установлено.)

#maildir_stat_dirs = no

# Копировать почту в другие директории используя "жёсткие ссылки". Это

# намного быстрее чем реальное копирование файла. Это проблематично

# лишь в случае, если что-то (программа, например, какая-то) изменяет

# файлы в одной директории, но необходимо чтобы во всех других они

# они остались неизменными. На данный момент неизвестен MUA, который

# изменял бы файлы непосредственно. Протокол IMAP также требует чтобы

# файлы не изменялись.

# Если нужен прирост производительности - включите эту опцию.

#maildir_copy_with_hardlinks = no

# Какой метод блокировки почтового ящика использовать. Доступны четыре вида

# блокировок:

# dotlock: создаётся <mailbox>.lock файл. Это самый старый и самый

# безопасный метод для NFS. Если хотите использовать

# директорию /var/mail/ то надо дать юзерам доступ

# к этой директории.

# fcntl : Используйте это, по возможности. Работает и с NFS если

# используется демон lockd.

# flock : Возможно существует не во всех системах. не работает с NFS.

# lockf : Возможно существует не во всех системах. не работает с NFS.

#

# Вы можете использовать неодин метод блокировки; если так и делаете,

# то надо их тут объявить, и избежать тупиковой ситуации (deadlocks),

# если несколько методов блокировки использует и другой MTAs/MUAs.

# Некоторые ОС не позволяют одновременное использование некоторых блокировок.

#mbox_read_locks = fcntl

#mbox_write_locks = dotlock fcntl

# Максимальное время ожидания блокировки перед прерыванием (отменой).

#mbox_lock_timeout = 300

# Если существует `dotlock` (блокировчный файл) но майлбокс никогда

# не модифицировлся, удалять блокировку через указанное время

#mbox_dotlock_change_timeout = 120

# Когда майлбокс неожиданно изменяется, то его необходимо полностью

# прочитать, чтобы найти все изменения. Если майлбокс большой, то на это

# может уйти много времени. Ввиду того, что чаще всего изменения - это

# новая почта, то быстрей всего было бы прочитать тока новые мессаги.

# Если разрешена эта опция ('yes') то dovecot так и делает, если что

# перечитывая весь mbox-файл, если происходит что-то неожиданное.

# Единственная причина поставить 'no' - если другой 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

# Задержка записи хеадеров майлбокса до полной синхронизации записей

# (команды EXPUNGE and CHECK когда закрывается майлбокс). Особенно

# полезно для POP3, - там клиенты часто удаляют всю почту. Обратная

# сторона медали - это то, что изменения не сразу видны другому MUA.

#mbox_lazy_writes = yes

# Если размер майлбокса меньше, чем указанное тут значение (kB), не

# создавать индексные файлы. Если файл индекса существует, то он

# продолжает читаться но не обновляется (тока какой тогда смысл?)

#mbox_min_index_size = 0

# Максимальный размер файла dbox (в kB) с которым работает ротации.

#dbox_rotate_size = 2048

# Минимальный размер файла dbox (в kB) до ротации

# (перекрывается dbox_rotate_days)

#dbox_rotate_min_size = 16

# Максимальный возраст dbox файла в днях до ротации. День всегда начинается

# с полуночи, т.о. 1 = сегодня, 2 = вчера, и т.д. 0 = нет проверок.

#dbox_rotate_days = 0

# umask (маска считается из этого числа - вычитается оно из максимума 777,

# результат - и есть маска для файла) для файлов почты и директорий.

umask = 0077

# Удалить все привилегии перед выполнением процесса обработки почты.

# Это, в основном, предназначено для отладки, в противном случае вы не

# получите core dumps. Есть небольшой риск безопасности при использовании

# единственного UID для нескольких пользователей, поскольку они могли бы

# ptrace() процессы других пользователей.

#mail_drop_priv_before_exec = no

# Установить максимальный размер процесса (в Mb). Большинство памяти

# уходит на mmap()ing файлов, таким образом не должно быть проблем, даже

# если установить это число достаточно большим.

#mail_process_size = 256

# Префикс логов для майл-процессов. Смотрите полный лист переменных

# в файле doc/variables.txt

#mail_log_prefix = "%Us(%u): "

## Спесифисеские настройки IMAP

##

protocol imap {

# Местоположение исполняемого файла авторизации.

#login_executable = /usr/local/libexec/dovecot/imap-login

# Местоположение исполняемого файла IMAP. Изменение этого позволит

# выполнить другие программы до запуска процесса imap.

#

# Это записало бы сырые логи (rawlogs) в ~/dovecot.rawlog/ директорию:

# mail_executable = /usr/local/libexec/dovecot/rawlog

# /usr/local/libexec/dovecot/imap

#

# Это добавило бы gdb в процесс imap и писало бы обратную трассировку

# в файлы /tmp/gdbhelper.*

# mail_executable = /usr/local/libexec/dovecot/gdbhelper

# /usr/local/libexec/dovecot/imap

#

#mail_executable = /usr/local/libexec/dovecot/imap

# Максимальная длинна команды (командной линии) IMAP, в байтах. Некоторые

# клиенты генерят очень длинные команды при работе с большими

# почтовыми ящиками. Если в ответе сервера Вы получите

# "Too long argument" или "IMAP command line too large" то это

# это значение необходимо будет увеличить.

#imap_max_line_length = 65536

# Поддержка динамически загружаемых плагинов. mail_plugins - список

# плугинов разделённый пробелами

# mail_plugins = quota trash

# mail_plugin_dir = /usr/local/lib/dovecot

# Посылать возможности IMAP в приветственном сообщении. Это избавляет

# клиентов от необходимости запрашивать это в команде CAPABILITY, таким

# образом экономится один запрос. Однако многие клиенты не понимают этого,

# и всё равно делают запрос CAPABILITY всегда.

#login_greeting_capability = no

# Обработка клиентских ошибок:

# delay-newmail:

# Посылать EXISTS/RECENT уведомления о новой почте только в качестве

# ответа на NOOP и CHECK команды. Некоторые почтовые клиенты

# игнорирубт их, например OSX Mail. Outlook Express вообще плющит,

# и он может показать сообщение об ошибке "Message no longer in server".

# Заметтьте, что шестой оутглюк (OE6) всё ещё выдаёт ошибку если

# синхронизация стоит "Headers Only" (тока заголовки).

# outlook-idle:

# Outlook и Outlook Express никогда не прерывают команду IDLE, и если

# почты небыло полчаса Dovecot закрывает соединение. В общем, это

# правильно, но оутглюк не восстанавливает соединение самостоятельно,

# и в итоге не видно - пришла ли новая почта.

# netscape-eoh:

# Netscape 4.x вылетает если заколовки сообщения не заканчиваются

# пустой линией "end of headers". Обычно, она есть во всех сообщениях,

# но тем не менее производится проверка, и линия добавляется, если

# её нету. Это сделано только для команды FETCH BODY[HEADER.FIELDS..]

# Кстати, согласно RFC этого делать не надо :)

# tb-extra-mailbox-sep:

# При типе хранилища 'mbox' (майлбокс), почтовый ящик может содержать

# либо почту, либо субмайлбоксы (подпапки, короче) - но не то и

# другое одновременно. Thunderbird разделяет их, вынуждая сервер

# принять '/' в имени майлбокса за название почтового ящика.

# Лист, разделённый пробелами. (не забудте убрать перевод строки,

# экранированный '/' - dovecot его не поймёт... а жаль...)

imap_client_workarounds = delay-newmail outlook-idle

netscape-eoh tb-extra-mailbox-sep

}

## Специфические настройки POP3

##

protocol pop3 {

# Местоположение исполняемого файла pop3-авторизации.

#login_executable = /usr/local/libexec/dovecot/pop3-login

# Местоположение исполняемого файла POP3.

#mail_executable = /usr/local/libexec/dovecot/pop3

# Не пробовать выявить сообщения, старые или просмотренные при

# помощи POP3 сессий. Это нужно чтобы уменьшить дисковый ввод/вывод.

# При работе с 'maildir' это не перемещает файлы из 'new/' в 'cur/'

# c 'mbox' не пишутся статусные заголовки.

#pop3_no_flag_updates = no

# Поддержка команды LAST с существующими старыми POP3 спеками, но

# удалёной в новых сборках. Некоторые клиенты всё ещё используют это.

# Включение этой опции заставляет команду RSET очистить все 'Seen'

# флаги сообщений.

#pop3_enable_last = no

# Если почтовое сообщение имеет хеадер 'X-UIDL', то использовать

# его в качестве почтового 'UIDL'.

#pop3_reuse_xuidl = no

# Оставлять почтовый ящик залоченым во время POP3 сессии.

#pop3_lock_session = no

# Используемый формат POP3 UIDL. Можно использовать следующие переменные:

#

# %v - Mailbox UIDVALIDITY

# %u - Mail UID

# %m - Сумма MD5 для всех заголовков почтового ящика в hex (тока для mbox)

# %f - filename (maildir only)

#

# Ждя совместимости UIDL с другими POP3 серверами, используйте:

# UW's ipop3d : %08Xv%08Xu

# Courier version 0 : %f

# Courier version 1 : %u

# Courier version 2 : %v-%u

# Cyrus (<= 2.1.3) : %u

# Cyrus (>= 2.1.4) : %v.%u

# Older Dovecots : %v.%u

#

# Отметтьте, что у Outlook 2003 проблемы с форматом %v.%u который

# являлся дефолтовым форматом Dovecot, такчто при пересборке лучше это

# учесть. %08Xu%08Xv - надо предварительно сохранить.

#

# Отметтьте, в настоящее время это должно быть установлено явно, т.к.

# прежния установки по-умолчанию были не самыми лучшими, но и изменить

# их было нельзя, не переустанавливая приложение.

# Во всех новых инсталляциях будет %08Xu%08Xv

#

pop3_uidl_format = %08Xu%08Xv

# POP3 формат строки логоута:

# %t - число TOP команд

# %p - число байт посланных клиенту в результате команды TOP

# %r - число команд RETR

# %b - число байт посланных клиенту в результате команды RETR

# %d - число удалённых сообщений

# %m - число сообщений (до удаления)

# %s - размер майлбокса в мегабайтах (до удаления (сообщений, видимо :)))

#pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s

# Поддержка динамически загружаемых плагинов. mail_plugins - список

# плагинов для загрузки, разделённый пробелами

#mail_plugins =

#mail_plugin_dir = /usr/local/lib/dovecot/pop3

# Обработка некоторых клиентских ошибок:

# outlook-no-nuls:

# Outlook и Outlook Express зависают, если сообщение содержит NUL

# символы. Эта установка заменяет их на символы 0x80.

# oe-ns-eoh:

# Outlook Express и Netscape Mail прерываются, если потеряна линия

# конца заголоков. эта опция шлёт её, если она потеряна.

# Список, разделённый пробелами.

pop3_client_workarounds = outlook-no-nuls oe-ns-eoh

}

# своя доставка dovecot - delivery

protocol lda {

# Куда слать письма про превышение квоты

postmaster_address = support@lissyara.su

# путь к сокету

auth_socket_path = /var/run/dovecot/auth-master

}

##

## Процессы аутентификации

##

# Расположение исполняемого файла

#auth_executable = /usr/local/libexec/dovecot/dovecot-auth

# Установить максимальный размер процесса, в мегабайтах.

#auth_process_size = 256

# Кэш аутентификации, в килобайтах. 0 - отключено.

# Заметтьте, что bsdauth, PAM и vpopmail требуют чтобы cache_key был

# задан для использования кэширования. Также надо заметить, что сейчас

# кэш авторизации не очень хорошо пашет, если используется много

# passdbs (баз данных паролей?) с теми же самыми (одинаковыми?) именами в них.

#auth_cache_size = 0

# Время жизни, в секундах, для кэшированных данных. По истечании этого

# времени записи из кэша не используются, как исключение - если тока

# БД вернёт внутреннюю ошибку.

#auth_cache_ttl = 3600

# Разделённый пробелами лист элементов идентификаторов аутентификационных

# механизмов SASL, которые необходимы (я сам эту фразу нифига не понял :))).

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

# идентификаторов. Многие клиенты используют лишь первый, из перечисленных

# тут, поэтому ставьте дефолтовый первым.

#auth_realms =

# Дефолтовый realm/domain для использования если домен явно не задан. Это

# используется и для SASL и для добавления @domain к имени пользователя

# в плайнтекст логинах.

#auth_default_realm =

# Список разрешённых символов в имени пользователя. Если в username содержатся

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

# Это - просто дополнительная проверка того, что пользователь не сможет заюзать

# потенциальную брешь в защите, при работе с базами SQL/LDAP. Если хотите

# разрешить все символы, то оставьте это поле пустым.

#auth_username_chars =

#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

# Автозамена символов в имени пользователя, прежде чем по нему будет

# выполнен поиск в базе данных. Значение содержит ряд - что -> во что

# будет преобразовано. Например "#@/@" означает, что '#' и '/' будут

# преобразованы в '@'.

#auth_username_translation =

# Форматирование имени пользователя, до поиска по нему в БД. Тут можно

# использовать стандартные переменные, типа %Lu сделает все буквы маленькими,

# %n удалит домен, если он задан, или "%n-AT-%d" заменит '@' на "-AT-".

# Это делается после того, как auth_username_translation произвело изменения.

#auth_username_format =

# Если нужно разрешить вход главным пользователям (master users) по

# специфическому имени пользователя (master username) (т.е. не юзая

# поддержку SASL для этого) то вы можете определить символ радлелителя в

# этом пункте. Формат, в таком случае:<username><separator><master username>.

# UW-IMAP использует "*" в качестве разделителя, и это хороший выбор.

#auth_master_user_separator =

# Имя пользователя для логина при помощи механизма ANONYMOUS SASL

#auth_anonymous_username = anonymous

# Много отладочных логов. Полезго для определения, почему

# авторизация не пашет.

#auth_verbose = no

# Более подробный лог для отладки.

# Показываются квери к SQL.

#auth_debug = yes

# В случае несовпадения пароля записать пароль в лог, и используемую схему,

# таким образом проблема может быть отлажена. Регулируется auth_debug = yes.

#auth_debug_passwords = no

# Максимальное число работающих процессов авторизации. Они используются для

# выполнения блокирования passdb и userdb запростов (т.е. MySQL и PAM).

# Они автоматически создаются и убиваются по мере надобности.

#auth_worker_max_count = 30

# Kerberos keytab для использования механизма GSSAPI. Будет использовать

# системное значение по умолчанию (обычно, /etc/krb5.keytab) если не задано.

#auth_krb5_keytab =

auth default {

# Список требуемых механизмов аутентификации, разделённый пробелами

# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi

mechanisms = plain

# Добавлено для работы deliver от dovecot

socket listen {

master {

path = /var/run/dovecot/auth-master

mode = 0600

user = mailnull

#group = mail

}

}

#

# База данных паролей используемая для проверки пароля пользователя.

# (и только для этого). Можно использовать несколько баз данных паролей

# и пользователей. Это нужно, например, если используются одновременно и

# системные пользователи (/etc/passwd) и виртуальные, чтобы не дублировать

# системных в виртуальную БД.

#

# http://wiki.dovecot.org/Authentication

#

# Добавляя master=yes в passdb вы делаете passdb списком "master users",

# кто может войти под чьим-либо ещё именем. Если не используется PAM,

# вы, вероятно, хотите, чтобы юзер искался в passdb если она реально

# существует. Это можно сделать, добавив pass=yes в главную passdb

#

# http://wiki.dovecot.org/MasterPassword

# Юзеры могут быть временно заблокированы, если добавить БД паролей с

# deny=yes. Если юзер будет найден в этой ДБ то аутентификация будет неудачной.

# Эта БД должна определяться до других, чтобы она была проверена первой.

# Например:

#passdb passwd-file {

# Файл содержащий имена пользователей, по одному на строку:

#args = /etc/dovecot.deny

#deny = yes

#}

# PAM аутентификация. Предпочтена, сейчас, на большинстве систем.

# Отметтьте, что PAM может лишь проверить, верен ли пароль, но не может

# использоваться в качестве userdb. Если вы не хотите использовать отдельную

# пользовательскую БД (обычно passwd), вы можете использовать статическую

# userdb.

# ПОМНИТЕ: Вам нужен файл '/etc/pam.d/dovecot' созданном для PAM

# аутентификации, чтобы это работало.

#passdb pam {

# [session=yes] [cache_key=<key>] [<service name>]

#

# session=yes делает Dovecot открытым(?) и немедленно закрывает сессию PAM.

# Некоторые PAM плугины требуют этого для работы, например pam_mkhomedir.

#

# cache_key может использоваться для кэширования аутентификационных данных

# PAM (auth_cache_size должен быть задан). По дефолту это не допускается,

# потому как модули PAM могут сделать все проверки, кроме проверки пароля,

# типа проверки IP адреса. Dovecot не может узнать об этих проверках без

# посторонней помощи. cache_key - просто список переменных который

# соответствует данным кэшируемым для использования.

# Примеры:

# %u - Имя пользователя должно совпадать. Обычно достаточно только этого.

# %u%r - Имя пользователя и удалённый IP адрес должны совпадать.

# %u%s - Имя пользователя и сервис (т.е. IMAP, POP3) должны совпадать.

#

# Если имя сервиса "*", используется имя сервиса для обслуживания, например

# pop3 или imap (/etc/pam.d/pop3, /etc/pam.d/imap).

#

# Примеры:

# args = session=yes *

# args = cache_key=%u dovecot

#args = dovecot

#}

# /etc/passwd или similar, используется getpwnam()

# В настоящее время, во многих системах, используется Name Service Switch,

# сконфигуренное в /etc/nsswitch.conf.

#passdb passwd {

#}

# /etc/passwd или similar, используется getpwnam(). Сейчас PAM.

#passdb shadow {

#}

# BSD аутентификация. Используется, по крайней мере, в OpenBSD.

#passdb bsdauth {

# [cache_key=<key>] - Смотрите cache_key в PAM для понимания.

#args =

#}

# passwd-подобный файл с указанным местоположением

#passdb passwd-file {

# путь к passwd-файлу

#args =

#}

# checkpassword исполняемая аутентификация

# ОТМЕТЬТЕ: Вероятно, вы захотите использовать вместе с "userdb prefetch".

#passdb checkpassword {

# Путь к бинарнику checkpassword

#args =

#}

# SQL database

passdb sql {

# Путь к конфигурационному файлу SQL, велено смотреть дополнительную

# инфу в файле doc/dovecot-sql.conf, тока такого файла нету :))) - не

# инсталлится. В исходниках он есть. Там и смотрим.

args = /usr/local/etc/dovecot-sql.conf

}

# LDAP database

#passdb ldap {

# путь для конфигурационного файла LDAP, примеры в doc/dovecot-ldap.conf

#args =

#}

# vpopmail аутентификация

#passdb vpopmail {

# [cache_key=<key>] - Смотреть cache_key в PAM, для понимания.

#args =

#}

#

# БД пользователей, определяющая где расположена почта, и какие IDs

# групп и пользователей имеют к ней доступ. Для single-UID

# конфигурации используйте "static".

#

# http://wiki.dovecot.org/Authentication

# http://wiki.dovecot.org/VirtualUsers

#

# /etc/passwd или similar, используется getpwnam().

# В настоящее время, во многих системах, используется Name Service Switch,

# сконфигуренное в /etc/nsswitch.conf.

#userdb passwd {

#}

# passwd-подобный файл с указанием местоположения

#userdb passwd-file {

# путь к passwd-файлу

#args =

#}

# Статические настройки, сгенерённые из шаблона

#userdb static {

# Шаблон для параметров настройки. CМожет вернуть что-то, что userdb

# обычно возвращает, т.е.: uid, gid, home, mail, nice

#

# Пара примеров:

#

# args = uid=500 gid=500 home=/var/mail/%u

# args = uid=500 gid=500 home=/home/%u mail=mbox:/home/%u/mail nice=10

#

#args =

#}

# SQL database

userdb sql {

# Путь к конфигурационному файлу SQL, велено смотреть дополнительную

# инфу в файле doc/dovecot-sql.conf, тока такого файла нету :))) - не

# инсталлится. В исходниках он есть. Там и смотрим.

args = /usr/local/etc/dovecot-sql.conf

}

# LDAP database

#userdb ldap {

# путь для конфигурационного файла LDAP, примеры в doc/dovecot-ldap.conf

#args =

#}

# vpopmail

#userdb vpopmail {

#}

# "prefetch" (типа упреждающего чтения, чтоли :)) пользовательской БД,

# что passdb уже достал всю необходимую информацию, и нет необходимости

# делать ещё один поиск (запрос) в БД. Это работает и с SQL и с LDAP БД,

# смотрите примеры их (для этих БД) конфигурационных файлов как это сделать.

# http://wiki.dovecot.org/AuthSpecials

#userdb prefetch {

#}

# Юзер от которого будет работать процесс. Этому юзеру нужен лишь доступ

# к БД паролей. Только shadow и pam аутентификации реально нужны права рута,

# работать, остальным можно подсунуть любого пользователя.

# Заметтьте, что этому пользователю не нужен доступ к почте.

# Этот юзер был задан выше (который по почте должен шариться :)).

user = root

# Директория где chroot`ится процесс. Многие аутентификации не работают,

# если установить эту опцию, и вообще не имеет смысла это делать если для

# аутентификации используется пользователь root.

# Отметтьте, что valid_chroot_dirs не нужен для этой опции.

#chroot =

# Число создаваемых аутентификационных процессов

#count = 1

# Требовать действительный клиентский SSL сертификат, или

# аутентификация будет неудачной.

#ssl_require_client_cert = no

# Извлечь (взять) юзернэйм из клиентского SSL сертификата, ипользуя

# X509_NAME_oneline() который использует тему Distinguished Name.

#ssl_username_from_cert = no

}

# Возможно экспортировать интерфейс аутентификации в другие программы,

# например, сервер SMTP который поддерживает Dovecot. Клиентский сокет

# обрабатывает фактическую аутентификацию, - вы можете передать ему имя

# пользователя и пароль и он вернёт OK или отказ. Таким образом можно

# довольно безопасно кому угодно обращаться к нему. Мастер сокет используется:

# a) для запроса, если клиент был успешно аутентифицирован

# b) для поиска в userdb.

# Слушающие сокеты будут созданы мастер-процессом Dovecot с использованием

# настроек из этого авторизационнго раздела

#auth default_with_listener {

# mechanisms = plain

# passdb pam {

# }

# userdb passwd {

# }

# socket listen {

# master {

# path = /var/run/dovecot/auth-master

# # АХТУНГ: Предоставление недоверенным юзерам доступа к мастер-сокету

# # влечёт риск в безопасности, поэтому не давайте им слишком широкие

# # (большие) полномочия!

# #mode = 0600

# # Деволтовые user/group от кого запускается dovecot-auth (root)

# #user =

# #group =

# }

# client {

# path = /var/run/dovecot/auth-client

# mode = 0660

# }

# }

#}

# Предполагается, что сокеты уже запущены, мастер-процесс Dovecot

# тока обрабатывает попытки соединится с ними. Им не нужны никакие

# настройки, кроме как путь до мастер-сокета, поскольку конфигурация сделана

# в другом месте.

# Отметьте, клиентские сокеты должны существовать в login_dir.

#auth external {

# socket connect {

# master {

# path = /var/run/dovecot/auth-master

# }

# }

#}

plugin {

# Тут можно задать некторые дополнительные переменные окружения для

# майл-процессов. В основном это предназначено для параметров плагинов.

# Расширение %variable сделано для всех значений.

# Quota плагин. Много чё поддерживается:

# dirsize: Находит и сумирует все файлы в майл-директории

# dict: Сохранение квоты в словаре (т.е. SQL)

# maildir: Maildir++ квота

# fs: Поддержка квоты в ФС только-для-чтения (а как это?)

#quota = maildir

# ACL плагин. Конец vfile читает ACLs из "dovecot-acl" файла, в почтовой

# директории. Также можно задать произвольный путь к глобальному каталогу ACL

# где лежат ACL для применения на почтовые ящики всех пользователей.

# Глобальный каталог ACL содержит один файл для каждого почтового ящика,

# т.е. INBOX или sub.mailbox.

#acl = vfile:/etc/dovecot-acls

# Convert плугин. Если установлено, задаёт исходный путь, преобразованный

# к месту нахождения (default_mail_env).

#convert_mail = mbox:%h/mail

}

# P.S. 2006-05-29, 17:05 Заколебался... 963 строки...

После чего в этой же директории создаём файл dovecot-sql.conf с таким содержанием:

#!/bin/sh

# Для модуля sql passdb, вам необходима БД с таблицей, где содержатся поля,

# как минимум с userid и password. Если необходимо юзать синтаксис типа

# user@domain, вы должны иметь и поле domain (нелогично как-то...)

#

# Если все пользователи имеют одинаковый uig/gid, и меют предсказуемый

# домашний каталог, то можно использовать статический userdb модуль для

# создания домашних директорий, основанных на userid и domain. В этом случае

# поля home, uid, или gid не нужны в БД.

#

# Если вы предпочтёте использовать модуль sql userdb, то надо добавить

# поля home, uid, и gid. Пример таблицы:

#

# CREATE TABLE users (

# userid 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 = mysql

# Строка соединения с БД. Специфична для каждого драйвера.

#

# pgsql:

# Для доступных соединений смотрите документацию PostgreSQL,

# PQconnectdb функцию libpq.

#

# mysql:

# Основные операции эмулируют названия опций PostgreSQL:

# host, port, user, password, dbname

#

# Но также добавлены новые параметры настрйки:

# client_flags - Смотрите мануал по MySQL

# ssl_ca, ssl_ca_path - Один, или оба пункта, чтобы разрешить SSL

# ssl_cert, ssl_key - Для отсыла клиентской части сертификата на сервер

# ssl_cipher - Минимально разрешённая безопасность

# шифра(default: HIGH)

#

# Вы можете соединитсья с UNIX сокетом с использованием его в переменной

# host: 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=localhost dbname=exim user=exim password=exim

# Дефолтовая схема для пароля.

#

# Список поддерживаемых тем: http://wiki.dovecot.org/Authentication

#

default_pass_scheme = PLAIN

# Запрос на получение пароля.

#

# Этот запрос должен вернуть только одну строку с колонками "user" и

# "password". Колонка "user" нужна для того чтобы удостовериться, что

# достали то что надо :)

# Запрос может вернуть и другие поля, имеющие специальное значение.

# Подробности смотрите тут: http://wiki.dovecot.org/AuthSpecials

#

# Обычно используемые подстановки (переменные), полный список:

# http://wiki.dovecot.org/Variables

# %u = имя пользователя (userid)

# %n = Юзерская часть из user@domain

# %d = Доменная часть из user@domain

#

# Заметтьте, что они могут использоваться как входные данные к запросу

# SQL. Если вывод запроса - любая из этих замен, они не трогаются. Иначе

# былобы трудно иметь эквивалентные имена, содержащие символ '%'.

#

# Примеры:

# password_query = SELECT `password` FROM `users` WHERE

# `userid` = '%n' AND `domain` = '%d'

# password_query = SELECT `pw` AS `password` FROM `users`

# WHERE `userid` = '%u' AND `active` = 'Y'

# (не забудте убрать перевод строки, экранированный '/')

password_query = SELECT `username` as `user`, `password` FROM

`mailbox` WHERE `username` = '%n@%d' AND `active`='1'

# Запрос на извлечение инфы пользователя.

#

# Запрос может вернуть лишь одну строку. Колонки, что вернёт запрос:

# home - Домашняя директория

# mail - переменная(-нные) окуружения MAIL

# system_user - Имя системного пользователя (чтобы получать

# группы пользователя из /etc/group)

# uid - системный UID

# gid - системный GID

#

# Обязательно поле 'home' или 'mail'. 'uid' и 'gid' обязательны. Если

# запрос вернёт более одного ряда, или будут отсутствовать поля, то

# логин автоматически будет неудачным.

#

# Примеры

# user_query = SELECT `home`, `uid`, `gid` FROM `users` WHERE

# `userid` = '%n' AND `domain` = '%d'

# user_query = SELECT `dir` AS `home`, `user` AS `uid`, `group`

# AS `gid` FROM `users` where `userid` = '%u'

# user_query = SELECT `home`, 26 AS `uid`, 26 AS `gid`

# FROM `users` WHERE `userid` = '%u'

#

# (не забудте убрать перевод строки, экранированный '/')

user_query = SELECT `maildir` AS `home`, 26 AS `uid`, 26 AS `gid`

FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'

# Если вы хотите обойтись одним запросом к БД, вместо двух

# (passdb + userdb), то можете использовать "userdb prefetch"

# в конфиге dovecot.conf. В этом случае надо будет выбрать всё

# одним запросом, и к полям второго запроса (про хомяк и прочее)

# надо будет добавить приставку "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'

И пробуем запустить его:

/usr/home/lissyara/>echo 'dovecot_enable="YES"' >> /etc/rc.conf

/usr/home/lissyara/>/usr/local/etc/rc.d/dovecot start

Starting dovecot.

Можно добавлять в админке пользователей, и пробовать зайти. Конечно, почтой ещё и не пахнет, но папочки посоздавать можно :)

Затем добавляем кое-какие строчки в /etc/make.conf для сборки и дальнейшей пересборки экзима с нужными нам параметрами:

# для exim (если уже задавалась PORTSDIR ранее, то второй раз её задавать не надо)

PORTSDIR?= /usr/ports

.if ${.CURDIR} == ${PORTSDIR}/mail/exim

WITH_MYSQL= yes

LOG_FILE_PATH?= syslog

WITH_CONTENT_SCAN= yes

WITH_DEFAULT_CHARSET?= koi8-r

WITHOUT_IPV6= yes

.endif

И устанавливаем exim:

/usr/home/lissyara/>cd /usr/ports/mail/exim

/usr/ports/mail/exim/>make && make install && make clean

После установки проверяем сендмайловую строку в /etc/rc.conf, должно быть так:

sendmail_enable="NONE"

Также надо подправить файл /etc/mail/mailer.conf до такого состояния:

sendmail /usr/local/sbin/exim

send-mail /usr/local/sbin/exim

mailq /usr/local/sbin/exim -bp

newaliases /usr/local/sbin/exim -bi

hoststat /usr/local/sbin/exim

purgestat /usr/local/sbin/exim

После чего приводим конфиг exim к такому виду:

#!/bin/sh

# моя конфига экзма. Будь проклят тот день,

# когда мне пришла в голову мысль подписать

# русские поясния ко всем пунктам! :) Хоть и

# делал я это в первую очередь для себя -

# чтоб лучше понять его, но работа эта оказалась

# слишком масштабная и неблагодарная...

# Имя хоста. Используется в EHLO.

# Фигурирует в других пунктах, если они не заданы -

# типа qualify_domain и прочих..

# Если тут ничё не установлено (строка закомметрована)

# то используется то, что вернёт функция uname()

primary_hostname = mx.lissyara.su

# Вводим данные для подключения к MySQL серверу.

# словечко `hide`, вначале, означает, что при

# вызове проверки конфига командой

# exim -bV config_file эти данные не будут отображаться.

# Если без него - то будут показаны... Формат записи:

# хост/имя_бд/пользователь/пароль

hide mysql_servers = localhost/exim/exim/exim

# Делаем список локальных доменов. Далее этот

# список будет фигурировать в виде +local_domains

# В данном случае домены выбираются из БД MySQL. Также

# можно их просто перечислить через двоеточие. Есть интересная

# возможность, можно указать юзер@[хост] - lissyara@[222.222.4.5]

domainlist local_domains = ${lookup mysql{SELECT `domain`

FROM `domain` WHERE

`domain`='${domain}' AND

`active`='1'}}

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

# Далее этот список будет в виде +relay_to_domains

# Можно использовать символы подстановки, типа:

# .... = *.my.domen.su : !spam.my.domen.su : first.su

# тогда пропускается всё, что похоже на *.my.domen.su, но

# от spam.my.domen.su релеится почта не будет.

domainlist relay_to_domains = ${lookup mysql{SELECT `domain`

FROM `domain` WHERE

`domain`='${domain}' AND

`active`='1'}}

# Составляем список хостов с которых разрешён неавторизованый

# релей. Обычно в нём находятся локальные сети, и локалхост...

# ЛокалХост в двух видах был внесён сознательно - пару раз

# сталкивался с кривым файлом /etc/hosts - результатом было

# непонимание `localhost` но пониманием 127.0.0.1/8

hostlist relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16

# Вводим названия acl`ов для проверки почты. (В общем-то, это

# необязательно, если вы делаете открытый релей, или хотите

# принимать вообще всю почту с любого хоста для любых

# получателей... Тока потом не жалуйтесь что у Вас спам

# и провайдер выкатывает немеряный счёт :))

acl_smtp_rcpt = acl_check_rcpt

acl_smtp_data = acl_check_data

# Прикручиваем антивирус - при условии, что exim собран

# с его поддержкой. В качестве антивиря юзаем ClamAV,

# ибо - ПО должно быть свободным! :)

# Итак, указываем местоположение сокета clamd.

av_scanner = clamd:/var/run/clamav/clamd

# Адрес куда слать на проверку спама (SpamAssasin), но я

# это не юзаю. Не так много у меня спама...

# spamd_address = 127.0.0.1 783

# Имя домена добавляемое для локальных отправителей (реальных

# юзеров системы) т.е. почта отправляемая от root, будет от

# root@домен_указанный_здесь. Если пункт незадан, то используется

# имя хоста из `primary_hostname`. Логичней было бы написать здесь

# lissyara.su, но мне удобней иначе:

qualify_domain = mx.lissyara.su

# Имя хоста для ситуации, обратной предыдущей, - это имя домена

# добавляемое к почте для системных юзеров, ну и вообще для почты

# пришедшей на адрес типа `root`, `lissyara`, & etc... Если этот

# пункт незадан то используется значение полученное из

# предыдущего пункта - `qualify_domain`

qualify_recipient = mx.lissyara.su

# А это как раз кусок вышеописанного анахронизма - про почту в

# виде user@[222.222.222.222] - принимать её или нет. По дефолту

# (когда строка закомментирована) значение - false. Если захотите

# поставить true то надо будет добавить в список доменов

# комбинацию @[] - она означает `все локальные адреса`

allow_domain_literals = false

# Пользователь от которого работает exim

exim_user = mailnull

# группа в кторой работает exim

exim_group = mail

# запрещаем работу доставки под юзером root - в целях безопасности

never_users = root

# Проверяем соответствие прямой и обратной зон для всех хостов.

# Тока зачем это нужно - даже и незнаю... Спам на этом не режется...

# Зато возможны проблемы - если сервер зоны скажет `сервер файлед`

# то почту от этого хоста Вы не получите :)

#host_lookup = *

# Тоже анахронизм (на самом деле, не такой уж анахронизм, но все давно

# забили на ident и закрыли файрволлом tcp:113...) Это проверка - Ваш

# хост спрашивает у удалённого, с которого было подключение, а кто

# собстно ко мне подключился на такой-то порт? Если на удалённом хосте

# работает identd - он может ответить (а может и не ответить - как

# настроить), скажет UID пользователя от которого установлено

# соединение, тип ОС, и имя пользователя. Теперь, понимаете, почему

# у всех оно зарублено и файрволлами позакрыто? :) Это же палево :)

# Тока на мой взгляд, если на сервере всё настроено правильно -

# то вовсе это и не страшно.

# Короче - если хостс поставить * то будет проверять все. Таймаут -

# если поставить 0 то не будет ждать ответа ни от кого. По

# вышеописанным причинам - отключаем

#rfc1413_hosts = *

rfc1413_query_timeout = 0s

# По дефолту, экзим отфутболивает все `неквалифицированные` адреса,

# состоящие тока из локальной части. Для того чтобы разрешить такие письма

# определённых хостов используются эти директивы:

# для `неквалифицированных` отправителей

sender_unqualified_hosts = +relay_from_hosts

# для `неквалифицированных` получателей

recipient_unqualified_hosts = +relay_from_hosts

# Интересный пункт, тока я не вполне понимаю его логику.

# Позволяет выполнять что-то типа - пришло сообщение на

# локальный ящик user%test.su@lissyara.su и

# переправляет его на user@test.su. Делается это для

# перечисленного списка доменов (* - все):

# percent_hack_domains = *

# Если сообщение было недоставлено, то генерится соощение

# об ошибке. Если сообщение об ошибке не удалось доставить

# то оно замораживается на указанный в этом пункте срок,

# после чего снова попытка доставить его. При очередной

# неудаче - сообщение удаляется.

ignore_bounce_errors_after = 45m

# Замороженные сообщения, находящиеся в очереди, дольше

# указанного времени удаляются и генерится сообщение

# об ошибке (при условии, что это не было недоставленное

# сообщение об ошибке :))

timeout_frozen_after = 15d

# собсно на этом штатный конфиг кончился, но

# меня-то это не устраивает... Поэтому пошли пункты,

# почёрпнутые из других источников.

# список адресов, через запятую, на которые засылаются

# сообщения о замороженных сообщениях (о замороженых

# уведомлениях о заморозке, сообщения не генерятся. - я

# надеюсь эта строка понятна :))

#freeze_tell = admin@lissyara.su

# Список хостов, почта от которых принимается, несмотря

# на ошибки в HELO/EHLO (тут указана моя подсеть)

helo_accept_junk_hosts = 192.168.0.0/16

# Через какое время повторять попытку доставки

# замороженного сообщения

auto_thaw = 1h

# Приветствие сервера

smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

# Максимальное число одновременных подключений по

# SMTP. Рассчитывать надо исходя из нагрузки на сервер

smtp_accept_max = 50

# максимальное число сообщений принимаемое за одно соединение

# от удалённого сервера (или пользователя). C числом 25

# я имел проблемы тока один раз - когда у меня три дня лежал

# инет и после его подъёма попёрли мессаги. Но у меня не так

# много почты - всего 30 пользователей.

smtp_accept_max_per_connection = 25

# чё-то про логи и борьбу с флудом - я так понимаю -

# максимальное число сообщений записываемых в логи

smtp_connect_backlog = 30

# максимальное число коннектов с одного хоста

smtp_accept_max_per_host = 20

# Ход ладьёй - для увеличения производительности,

# директория `spool` внутри, разбивается на

# директории - это ускоряет обработку

split_spool_directory = true

# Если у сообщения много адресатов на удалённых хостах,

# то запускатеся до указанного числа максимально число

# параллельных процессов доставки

remote_max_parallel = 15

# при генерации сообщения об ошибке прикладывать

# не всё сообщение, а кусок (от начала) указанного

# размера (иногда полезно и целиком - в таком случае

# просто закомментируйте эту строку)

return_size_limit = 70k

# размер сообщения. У меня стоит относительно большой

# размер (`относительно` - потому, что на большинстве

# хостов оно ограничено 2-5-10мб, либо стоит анлим.)

message_size_limit = 64M

# разрешаем неположенные символы в HELO (столкнулся

# с этим случайно - имя фирмы состояло из двух слов

# и какой-то раздолбай домен обозвал my_firme_name

# прям с подчёркиваниями... Виндовые клиенты при

# соединении радостно рапортовали о себе

# `vasya.my_firme_name` ну а экзим их футболил :))

helo_allow_chars = _

# Принудительная синхронизация. Если отправитель

# торопится подавать команды, не дождавшись ответа,

# то он посылается далеко и надолго :) Немного,

# спам режется.

smtp_enforce_sync = true

# Выбираем, что мы будем логировать

# + - писать в логи,

# - - Не писать в логи.

# +all_parents - все входящие?

# +connection_reject - разорваные соединения

# +incoming_interface - интерфейс (реально - IP)

# +lost_incoming_connections - потеряные входящие

# соединения

# +received_sender - отправитель

# +received_recipients - получатель

# +smtp_confirmation - подтверждения SMTP?

# +smtp_syntax_error - ошибки синтаксиса SMTP

# +smtp_protocol_error - ошибки протокола SMTP

# -queue_run - работа очереди (замороженные мессаги)

log_selector =

+all_parents

+connection_reject

+incoming_interface

+lost_incoming_connection

+received_sender

+received_recipients

+smtp_confirmation

+smtp_syntax_error

+smtp_protocol_error

-queue_run

# Убираем собственную временную метку exim`a из логов, её ставит

# сам syslogd - нефига дублировать

syslog_timestamp = no

### конфигурация ACL для входящей почты

begin acl

# Эти правила срабатывают для каждого получателя

acl_check_rcpt:

# принимать сообщения которые пришли с локалхоста,

# не по TCP/IP

accept hosts = :

# Запрещаем письма содержащие в локальной части

# символы @; %; !; /; |. Учтите, если у вас было

# `percent_hack_domains` то % надо убрать.

# Проверяются локальные домены

deny message = "incorrect symbol in address"

domains = +local_domains

local_parts = ^[.] : ^.*[@%!/|]

# Проверяем недопустимые символы для

# нелокальных получателей:

deny message = "incorrect symbol in address"

domains = !+local_domains

local_parts = ^[./|] : ^.*[@%!] : ^.*/\.\./

# Принимаем почту для постмастеров локальных доменов без

# проверки отправителя (я закомментировал, т.к. это -

# основной источник спама с мой ящик).

accept local_parts = postmaster

domains = +local_domains

# Запрещщаем, если невозможно проверить отправителя

# (отсутствует в списке локальных пользователей)

# У себя я это закоментил, по причине, что некоторые

# железяки (принтеры, & etc) и программы (Касперский, DrWEB)

# умеют слать почту, в случае проблем но не умеют ставить

# нужного отправителя. Такие письма эта проверка не пускает.

# require verify = sender

# Запрещщаем тех, кто не обменивается приветственными

# сообщениями (HELO/EHLO)

deny message = "HELO/EHLO require by SMTP RFC"

condition = ${if eq{$sender_helo_name}{}{yes}{no}}

# Принимаем сообщения от тех, кто аутентифицировался:

# Вообще, большинство конфигов в рунете - это один и тот же

# конфиг написанный Ginger, в котором этот пункт расположен

# внизу. Но при таком расположении рубятся клиенты с adsl,

# ppp, и прочие зарезанные на последующих проверках. Но это

# жа неправильно! Этом мои пользователи из дома! Потому

# я это правило расположил до проверок.

accept authenticated = *

# Рубаем нах, тех, кто подставляет свой IP в HELO

deny message = "Your IP in HELO - access denied!"

hosts = * : !+relay_from_hosts : !81-196.lissyara.su

condition = ${if eq{$sender_helo_name}

{$sender_host_address}{true}{false}}

# Рубаем тех, кто в HELO пихает мой IP (2500 мудаков за месяц!)

deny condition = ${if eq{$sender_helo_name}

{$interface_address}{yes}{no}}

hosts = !127.0.0.1 : !localhost : *

message = "main IP in your HELO! Access denied!"

# Рубаем тех, кто в HELO пихает только цифры

# (не бывает хостов ТОЛЬКО из цифр)

deny condition = ${if match{$sender_helo_name}

{N^d+$N}{yes}{no}}

hosts = !127.0.0.1 : !localhost : *

message = "can not be only number in HELO!"

# Рубаем тех, кто не пишет отправителя

# deny condition = ${if eq{$sender_address}{}{yes}{no}}

# hosts = !127.0.0.1 : !localhost : *

# message = "А какого HELO пустое?! Не по RFC..."

## Рубаем тех, кто не пишет отправителя (пробел)

# deny condition = ${if match{$sender_address}{N^s+$N}{yes}{no}}

# hosts = !127.0.0.1 : !localhost : *

# message = "А какого HELO пустое (тока пробелы)?! Не по RFC..."

# Рубаем тех, кто не пишет отправителя

# deny condition = ${if eq{$sender_address}{}{yes}{no}}

# hosts = !127.0.0.1 : !localhost : *

# message = "Where sender of this mail?!"

# Рубаем хосты типа *adsl*; *dialup*; *pool*;....

# Нормальные люди с таких не пишут. Если будут

# проблемы - уберёте проблемный пункт (у меня клиенты

# имеют запись типа asdl-1233.zone.su - я ADSL убрал...)

deny message = "your hostname is bad (adsl, poll, ppp & etc)."

condition = ${if match{$sender_host_name}

{adsl|dialup|pool|peer|dhcp}

{yes}{no}}

# Задержка. (это такой метод борьбы со спамом,

# основанный на принципе его рассылки) На этом рубается

# почти весь спам. Единственно - метод неприменим на

# реально загруженных MTA - т.к. в результате ему

# приходится держать много открытых соединений.

# но на офисе в сотню-две человек - шикарный метод.

#

# более сложный вариант, смотрите в статье по exim и

# курьер имап. Т.к. там метод боле умный (просто правил

# больше :), то можно и на более загруженные сервера ставить)

warn

# ставим дефолтовую задержку в 20 секунд

set acl_m0 = 30s

warn

# ставим задержку в 0 секунд своим хостам и

# дружественным сетям (соседняя контора :))

hosts = +relay_from_hosts:213.234.195.224/28:80.253.9.18/32

set acl_m0 = 0s

warn

# пишем в логи задержку (если оно вам надо)

logwrite = Delay $acl_m0 for $sender_host_name

[$sender_host_address] with HELO=$sender_helo_name. Mail

from $sender_address to $local_part@$domain.

delay = $acl_m0

# Проверка получателя в локальных доменах.

# Если не проходит, то проверяется следующий ACL,

# и если непрошёл и там - deny

accept domains = +local_domains

endpass

message = "In my mailserver not stored this user"

verify = recipient

# Проверяем получателя в релейных доменах

# Опять-таки если не проходит -> следующий ACL,

# и если непрошёл и там - deny

accept domains = +relay_to_domains

endpass

message = "main server not know how relay to this address"

verify = recipient

# Рубаем тех, кто в блэк-листах. Серваки перебираются

# сверху вниз, если не хост не найден на первом, то

# запрашивается второй, и т.д. Если не найден ни в одном

# из списка - то почта пропускается.

deny message = "you in blacklist - $dnslist_domain $dnslist_text"

dnslists = opm.blitzed.org :

cbl.abuseat.org :

bl.csma.biz :

dynablock.njabl.org

# Разрешаем почту от доменов в списке relay_from_hosts

accept hosts = +relay_from_hosts

# Если неподошло ни одно правило - чувак явно ищет

# открытый релей. Пшёл прочь. :)

deny message = "Homo hominus lupus est"

# Тут идут ACL проверяющие содержимое (тело) письма.

# Без них будут пропускаться все сообщения.

acl_check_data:

# Проверяем письмо на вирусы

deny malware = *

message = "In e-mail found VIRUS - $malware_name"

# Если есть необходимость - тут проверки на спам

# Пропускаем остальное

accept

# чё делаем с почтой

begin routers

# Поиск маршрута к хосту в DNS. Если маршрут не найден в DNS -

# то это `унроутабле аддресс`. Не проверяются локальные

# домены, 0.0.0.0 и 127.0.0.0/8

dnslookup:

driver = dnslookup

domains = ! +local_domains

transport = remote_smtp

ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8

no_more

# смотрим альясы

system_aliases:

driver = redirect

allow_fail

allow_defer

data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE

`address`='${quote_mysql:$local_part@$domain}' OR

`address`='${quote_mysql:@$domain}'}}

# Всё что осталось - это локальные адресаты.

# Доставляем почту в dovecot

dovecot_user:

driver = accept

condition = ${lookup mysql{SELECT `goto` FROM

`alias` WHERE

`address`='${quote_mysql:$local_part@$domain}' OR

`address`='${quote_mysql:@$domain}'}{yes}{no}}

transport = dovecot_delivery

# начинаются транспорты - как доставляем почту

begin transports

# Доставка на удалённые хосты - по SMTP

remote_smtp:

driver = smtp

# Доставка локальным адресатам - в dovecot

# Надо заметить что тут использовалась ранее прямая доставка

# в директорию, но щас с портами стал-таки устанавливаться deliver

# программа dovecot занимающаяся доставкой мессаг.

# Соответственно юзаем его.

dovecot_delivery:

driver = pipe

command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain

message_prefix =

message_suffix =

delivery_date_add

envelope_to_add

return_path_add

log_output

user = mailnull

# Имя программы

address_pipe:

driver = pipe

return_output

# Транспорт для автоответов

address_reply:

driver = autoreply

# Начинаются повторы недоставленных писем.

begin retry

# Этот кусок я не трогал. Думаю разработчики лучше знают,

# какие тут должны быть цифирьки. Если же вы это знаете

# лучше их - меняйте. Хотя... А какого, если Вы такой

# умный, читаете этот мануал? Может ну, их, цифирьки, а? :)

# Address or Domain Error Retries

# ----------------- ----- -------

* * F,2h,15m; G,16h,1h,1.5; F,4d,6h

# преобразование адресов. У меня такого нету.

begin rewrite

# Секция авторизации при отправке писем. Ввиду того,

# что почтовых клиентов много, и все всё делают

# по-своему, то и механизмов авторизации три...

begin authenticators

# А вот по какому методу авторизуется оутглюк - я уже и

# не помню... Хотя в своё время долго ковырялся,

# пока настроил... Толь plain, толь login...

auth_plain:

driver = plaintext

public_name = PLAIN

server_condition = ${lookup mysql{SELECT `username` FROM

`mailbox` WHERE `username` =

'${quote_mysql:$auth2}' AND `password` =

'${quote_mysql:$auth3}'}{yes}{no}}

server_prompts = :

server_set_id = $auth2

# Вроде по этому оутглюк, а по предыдущему нетскейп.

auth_login:

driver = plaintext

public_name = LOGIN

server_condition = ${lookup mysql{SELECT `username` FROM

`mailbox` WHERE `username` =

'${quote_mysql:$auth1}' AND `password` =

'${quote_mysql:$auth2}'}{yes}{no}}

server_prompts = Username:: : Password::

server_set_id = $auth1

# А так авторизуется "Летучая Мышь" - TheBat!

auth_cram_md5:

driver = cram_md5

public_name = CRAM-MD5

server_secret = ${lookup mysql{SELECT `password` FROM

`mailbox` WHERE `username`

= '${quote_mysql:$auth1}'}{$value}fail}

server_set_id = $auth2

# Фсё. Конфиг кончился. Два дня убил.

# &copy; lissyara 2006-02-25, 01:19

По окончании конфигурения экзима ставим ClamAV (вообще-то exim уже можно запускать ибо почта идущая с локалхоста на вирусы не проверяется и потому прекрасно будет уходить и раскладываться в директории. Но - снуружи ничё не отправить)

/usr/home/lissyara/>cd /usr/ports/security/clamav

/usr/ports/security/clamav/>make install && make clean

Все опции я оставил по-дефолту (не выбрал ни одной - ибо по-умолчанию они все пустые)/ После установки добавляем строку в /etc/rc.conf и запускаем exim, предварительно прибив sendmail, также запускаем и обновляем clamav:

/usr/home/lissyara/>echo 'exim_enable="YES"' >> /etc/rc.conf

/usr/home/lissyara/>killall -9 sendmail

/usr/home/lissyara/>killall -9 sendmail

No matching processes were found

/usr/home/lissyara/>

/usr/home/lissyara/>/usr/local/etc/rc.d/exim.sh start

Starting exim.

/usr/home/lissyara/>echo 'clamav_clamd_enable="YES"' >> /etc/rc.conf

/usr/home/lissyara/>/usr/local/etc/rc.d/clamav-clamd start

Starting clamav_clamd.

LibClamAV Warning: **************************************************

LibClamAV Warning: *** The virus database is older than 7 days. ***

LibClamAV Warning: *** Please update it IMMEDIATELY! ***

LibClamAV Warning: **************************************************

/usr/home/lissyara/>freshclam

freshclam: Команда не найдена.

/usr/home/lissyara/>rehash

/usr/home/lissyara/>freshclam

ClamAV update process started at Wed May 31 10:20:58 2006

main.cvd is up to date (version: 38, sigs: 51206, f-level: 7, builder: tkojm)

Downloading daily.cvd [*]

daily.cvd updated (version: 1500, sigs: 5826, f-level: 8, builder: arnaud)

Database updated (57032 signatures) from database.clamav.net (IP: 213.219.245.4)

Clamd successfully notified about the update.

/usr/home/lissyara/>

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

May 31 11:02:56 bsd-6-1 exim[26788]: 2006-05-31 11:02:56 exim 4.62 daemon started: pid=26788, -q30m, listening for SMTP on port 25 (IPv4)

May 31 11:03:05 bsd-6-1 dovecot: IMAP(lissyara@test-1.su): Disconnected in IDLE

May 31 11:03:05 bsd-6-1 dovecot: imap-login: Login: user=<lissyara@test-1.su>, method=PLAIN, rip=192.168.20.141, lip=192.168.20.100

May 31 11:03:20 bsd-6-1 exim[26792]: 2006-05-31 11:03:20 1FlKjg-0006y8-7w <= lissyara@test-1.su H=(lissyara) [192.168.20.141] I=[192.168.20.100]:25 P=esmtpa A=auth_login:lissyara@test-1.su S=755 id=001701c68480$3d744c30$8d08a8c0@derzhava.ru from <lissyara@test-1.su> for liss@test-1.su

May 31 11:03:20 bsd-6-1 dovecot: imap-login: Login: user=<lissyara@test-1.su>, method=PLAIN, rip=192.168.20.141, lip=192.168.20.100

May 31 11:03:20 bsd-6-1 exim[26793]: 2006-05-31 11:03:20 1FlKjg-0006y8-7w => liss <liss@test-1.su> R=dovecot_user T=dovecot_delivery

May 31 11:03:20 bsd-6-1 exim[26793]: 2006-05-31 11:03:20 1FlKjg-0006y8-7w Completed

May 31 11:03:20 bsd-6-1 dovecot: IMAP(lissyara@test-1.su): Disconnected: Logged out

Всё нормально. Почта ходит.

Выводы: Сам dovecot мне оччень понравился, есть только два НО.

1. С ним в комплекте должна идти утилита delivery - она занимается доставкой почты в ящики пользователей. Её нет... Почему - непонятно. Поэтому пришлось раскладывать самим экзимом.

2. Trash (Корзина, или удалённые) - не работает... Написано что оно в тестовм режиме, да к тому же похоже что под формат mailbox а я юзаю maildir....

P.S. Разобрался с плагином trash - смысл такой - если у юзера приходит сообщение и получается оверквота - то удаляются мессаги из указанных в конфиге директорий, в указанном порядке. Выглядит примерно так:

/usr/local/etc/dovecot.conf

plugin {

trash = /usr/local/etc/dovecot-trash.conf

}

/usr/local/etc/dovecot-trash.conf

1 Spam

2 Trash

3 Sent

Т.е. вначале удаляются из папки Spam, потом из Trash и т.д.

Короче, на мой взгляд, абсолютно бесполезная фича... Лучшеб нормальную папку "Удалённые" привернули, которая на стороне сервера, а не клиента...

P.S.2 Вылезли такие грабли - на новых MySQL (я на 5-м столкнулся) бывает что после установки такая ругань в логах:

Jul 5 00:09:21 lissyara dovecot: auth-worker(default): mysql: Connect failed to localhost (dovecot): Доступ закры

т для пользователя 'exim'@'localhost' (был использован пароль: ДА) - waiting for 1 seconds before retry

Причём ругань абсолютно необоснованная - пароль и пользователь верные. Лечится таким, примерно запросом:

SET PASSWORD FOR 'exim'@'localhost' = OLD_PASSWORD('exim');

Соответственно в нём подставить свои данные...

Обновлено: 12.03.2015