Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> Почтовый сервер по шагам ч.1

Почтовый сервер по шагам ч.1

Автор: KontraBass.


В инете достаточно статей про настройку почтовых серверов, но большинство из них типа: вот такой у меня конфиг!, переписывайте и будет вам счастье. Я надеюсь состряпать статью, следуя которой, любой сможет сказать что он делает, зачем, и какой конфиг за это отвечает. Это логическое продолжение - улучшение "Dovecot по шагам" (переименованную в "Возможности Dovecot" на этом же сайте).

Тех задание: почтовый сервер для организации — один основной домен и некоторое количество второстепенных, из разряда а это типа наши конкуренты с ценами выше, а это клон наших конкурентов, а это... Ящиков в них по 2-3, но получать письма надо. Я выбрал путь с хранением адреса целиком, вместе с доменной частью, в sql таблице, это позволяет добиться уникальности в пределах одного домена и повторяемости адресов из разных доменов (sales@domain1, sales@domain2).
Почему mysql а не LDAP, так у меня сложилось, нет по лдапу хороших знаний :(
Почтовый клиент - ориентируемся на Thunderbird. Отличный выбор - кроссплатформенный, простой, с логичным и простым интерфейсом (все камни в M$ :) ).

Система - Freedsd 10.1 х64

Имя возьмем внутренней сети
hostname="mail.tstdomain.local"

Диск не менее 10Г — для сборки потребуется место. Под почту - отдельный диск. Разметку системного диска рекомендовать сложно, неплохо бы /var (да и /var/log) -отдельные партиции.
язык по умолчанию

не ставим ничего, не games не src

из сервисов — sshd   ntpd
Получим порты:

portsnap fetsh && portsnap extract

создадим вспомогательную папочку для работы
mkdir /root/workmail

Шаг 1 - MYSQL/MARIADB

cd /usr/ports/databases/mariadb100-server/
make install && make clean

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

Поставим в автозагрузку
echo 'mysql_enable="YES"' >> /etc/rc.conf

смотрим где должен находиться  конфигурационный файл  MySQL
less /usr/local/etc/rc.d/mysql-server

ищем строки

: ${mysql_dbdir="/var/db/mysql"}
: ${mysql_optfile="${mysql_dbdir}/my.cnf"} 

получается  должен быть здесь /var/db/mysql/my.cnf

Создаем конфигурационный файл, скопировав из примеров
cp /usr/local/share/mysql/my-small.cnf /var/db/mysql/my.cnf

Подредактируем некоторые параметры в my.cnf

/var/db/mysql/my.cnf
# Я хочу использовать связанные между собой таблицы, поэтому нуждаюсь в
# поддержке таблиц InnoDb.

# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /var/db/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/db/mysql
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 16M
innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

Запускаем MySQL
/usr/local/etc/rc.d/mysql-server start
Starting mysql.

/usr/local/etc/rc.d/mysql-server status
mysql is running as pid 40233

создадим следующий файлик:

/root/workmail/secure.sql
# use this:  mysql < secure.sql
# удалим тестовую базу
drop database test; 
use mysql; 
# подчистим за ней
delete from db where db='test'; 
delete from db where db='test\_%'; 
# удалим пустого пользователя
delete from user where user=''; 
# можно задать пароль для root
# я пока не буду этого делать, для удобства настройки
# update user set password=password('password') where user='root';
flush privileges;

Все эти команды можно выполнить и так в сеансе клиента mysql.
Заливаем это в mysql

Таблицы MYSQL

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

Напишем файл с командами создающими базу с пользователями /root/workmail/mkmaildb.sql

Теория такова: создадим таблицу с, почти минимальным, количеством полей. Подсмотреть рекомендуемые типы и максимальную длину значений в столбцах можно, к примеру здесь /usr/local/share/doc/dovecot/example-config/dovecot-sql.conf.ext.

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

Home тоже UNIQUE для предотвращения указания разным учетным записям одной папки сохранения почты. Внимание на то, с какими home создаются пользователи  test@testdomain.ru  и test@newdomain.ru. С такой конфигурацией ошибки исключены. Ящиков в не основных доменах не много, и писать domain_user для них несложно, а исключить ошибки с большим количеством ящиков  важно.


Попутно создаем пользователя mailreader, даем ему только права select на всю базу mail. В конце файла этому пользователю задается пароль. Сразу вносим некоторые записи в базу. Этого достаточно чтобы завести почтовую систему.

/root/workmail/mkmaildb.sql
# use this:  mysql < mkmaildb.sql

# если что-то пойдет не так - база создастся не полностью/с ошибками, 
# запустить повторно с исправлениями
drop database if exists mail;

# Создадим базу данных
create database mail 
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 

# переключимся на нее
use mail; 

# создадим таблицу содержащую имена доменов, которые мы обслуживаем
create table domains( 
domain char(32) NOT NULL UNIQUE 
); 
# внесем в нее начальные значения
insert into domains value ( 'tstdomain.ru' ); 
insert into domains value ( 'abcdomain.ru' ); 

# создадим таблицу с пользователями
create table users ( 
email VARCHAR(32) NOT NULL UNIQUE PRIMARY KEY, 
home VARCHAR(16) NOT NULL UNIQUE, 
password VARCHAR(64) NOT NULL
) ENGINE = InnoDB; 

# введем неких стартовых пользователей
insert into users value ('mailadmin@tstdomain.ru','mailadmin','111'); 
insert into users value ('test@tstdomain.ru','test','111'); 
insert into users value ('test@abcdomain.ru','abctdomain_test','111'); 

# создадим пользователя и предоставим ему права выборки (чтения) из 
# всех таблиц в базе mail
grant select on mail.* to 'mailreader'@'localhost'; 
grant select on mail.* to 'mailreader'@'127.0.0.1'; 
grant select on mail.* to 'mailreader'@'::1'; 

# сменим базу данных на системную, где зададим пароль
# нашему пользователю mailreader
use mysql; 
update user set password=password('password') where user='mailreader'; 
flush privileges;

Внимание на то какие домены добавляем, на пользователей и на предпоследнюю строчку где ставим свой пароль.
Заливаем все это добро в  mysql
mysql < /root/workmail/mkmaildb.sql

Проверить как работает - зайти под mailreader

mysql -u mailreader -p
use mail;
select * from users;
\q

Шаг 2 - Dovecot 2

Что мы ставим - IMAP, POP3 сервер - сервис висящий на портах 143 и 110 (как правило + еще те что с SSL) и отдающий клиентам их почтовые сообщения по соответствующим протоколам. В нашем случае он будет еще и LDA local delivery agent - агент локальной доставки - тот кто распихивает почту по каталогам пользователей.
cd /usr/ports/mail/dovecot2
make install && make clean

Выбранные опции:
   [ * ]    DOCS
   [ * ]    EXAMPLES
   [ * ]    KQUEUE
   [   ]    LDAP
   [   ]    LIBWRAP
   [   ]    LUCENE
       [   ]   LZ4
   [ * ]    MYSQL
   [   ]    PGSQL
   [   ]    SOLR
   [   ]    SQLITE
   [ * ]    SSL
   [   ]    VPOPMAIL

пояснения к некоторым опциям
KQUEUE -   масштабируемый интерфейс уведомления о событиях, позволяет получать
           уведомления о событиях на указанные цели очень быстро.
LIBWRAP -  для введения ограничений на доступ к сервисам по IP.
LUCENE -   возможность подключить сторонний полнотекстовый поиск.
MYSQL -    будем держать базу пользователей в MYSQL
SOLR -     возможность подключить сторонний полнотекстовый поиск от apache
SSL -      защита соединения
VPOPMAIL - позволяет создавать и работать с виртуальными доменами без
           использования баз данных таких как: mysql, pgsql и т. д.

разрешим запуск dovecot при старте системы
echo 'dovecot_enable="YES"' >> /etc/rc.conf

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

Здесь должна быть врезка о проблеме выбора/создания/оптимизации raid/fs в зависимости от типа почтовых ящиков, которые будут использоваться.

Небольшое отступление: буду стараться использовать понятие почтовый каталог для каталогов внутри почтового ящика, видимым нами как папки Spam Drafts Sent.
mkdir /MAIL

Доступ ко всем почтовым ящикам будем осуществлять от единого vmail. Разные UID/GID усложнят настройку дополнительных фишек Dovecot ценой, возможно, большей безопасности. Чем то надо жертвовать. (честно говоря я просто не пробовал).

Создадим пользователя и группу
pw groupadd -n vmail -g 999
pw useradd -n vmail -u 999 -g vmail -s /usr/sbin/nologin

chown vmail:vmail /MAIL
chmod 750 /MAIL

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

cd /usr/local/etc/dovecot
cp -R /usr/local/share/doc/dovecot/example-config/* /usr/local/etc/dovecot/

dovecot.conf
protocols = imap
listen = * 

Протокол я оставил только IMAP.  Не вижу причин поддерживать pop3. И протокол TCPv4 только.

перейдем на уровень ниже для удобства
cd conf.d/


10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain
#!include auth-system.conf.ext 
!include auth-sql.conf.ext


В 10-auth.conf задаются параметры аутентификации. auth_mechanisms в каком виде пароли используется клиентами при подключении. PLAIN просто текст, в открытом виде.  
Рекомендую использовать PLAIN, с другими вариантами легко нарваться на проблемы с другими интересными функциями dovecot, и поддержкой со стороны клиентов. А открытую передачу паролей закроем потом.
Закомментируем строку !include auth-system.conf.ext отвечающую за системных пользователей. Не вижу смысла иметь две базы пользователей.
!include auth-sql.conf.ext включим поиск пользователей в SQL

смотрим auth-sql.conf.ext
здесь passdb  - для проверки пароля
userdb — для местонахождения почты пользователями, последнее можно сделать статически - без дергания базы данных.
Очередные аргументы показывают - /usr/local/etc/dovecot/dovecot-sql.conf.ext
cd ../


dovecot-sql.conf.ext
driver = mysql 
connect = host=/tmp/mysql.sock dbname=mail user=mailreader password=password 
default_pass_scheme = PLAIN
user_query = select concat ( '/MAIL/', home ) as home from 
users where email = '%u' 
# Внимание! выше одна строка
password_query = select password from users where email = '%u'

В файле dovecot-sql.conf.ext задаются параметры соединения с базой данных, и какие именно поля мы там запрашиваем. default_pass_scheme указывает в каком виде находятся пароли в базе данных - PLAIN (открытым текстом) Можно передавать пароли по сети в PLAIN а хранить как нить зашифрованными (варианты и как настроить см "Возможности dovecot2"). Внимание на пробелы - именно так: connect = host=/tmp...
Внимание здесь определяется что будет использоваться в качестве username (user@domain)

не забудем выполнить рекомендации в начале этого конфига
chmod 0600 dovecot-sql.conf.ext
chown root dovecot-sql.conf.ext

Переходим опять уровнем выше
cd conf.d/


На этапе настройки видеть подробный вывод ошибок сервиса необходимо, поэтому раскомментируем нужные строчки в следующем конфиге:
10-logging.conf
auth_verbose = yes 
auth_debug = yes 
mail_debug = yes 

10-master.conf
#inet_listener imaps { 
   #port = 993 
   #ssl = yes 
#}

Внимательно, с фигурными скобками, -закомментил слушателя на порту 993 (с ssl по умолчанию), не видел ни разу примера чтоб им пользовались, да и сертификаты мы сейчас временно отключим. Можно будет включить и работать с этими портами позже, когда настроим.
10-mail.conf
mail_location = maildir:~/Maildir 
namespace inbox { 
  inbox = yes 
  list = yes 
  subscriptions = yes 
} 
mail_uid = 999 
mail_gid = 999 
first_valid_uid = 999 
last_valid_uid = 999 
first_valid_gid = 999 
last_valid_gid = 999 

Здесь находится важный параметр mail_location. Он определяет не только местоположение почтовых ящиков, но и формат в котором будет храниться почта. Доступны варианты (источник http://wiki2.dovecot.org/MailboxFormat):

mbox -  Традиционный способ хранения сообщений в UNIX. Один файл содержит несколько сообщений. Лучше сразу отказаться, если будут большие почтовые ящики (они будут точно!)- будут проблемы.
Maildir - Один файл содержит одно сообщение. Надежный выбор, так как файлы никогда не изменяются и все операции являются атомарными.
sdbox, mdbox - Собственный высокопроизводительный формат почтовых ящиков Dovecot . Сообщения хранятся в одном или нескольких файлах, каждый из которых содержит одно или несколько сообщений.

Я выбрал Maildir, надеясь на совместимость с Courier IMAP, вдруг что. Сейчас думаю, надо было повнимательнее присмотреться к sdbox, mdbox форматам.

Итак строка  
mail_location = maildir:~/Maildir
формат ящиков  maildir
местоположение /home/Maildir,   home возьмем из базы данных. Та же строка в другом виде maildir:%h/Maildir Почему не поступить проще, к примеру так: maildir:/%h/, зачем дополнительный уровень вложенности? - желательно иметь домашний каталог, отдельно от почтового, это всплывет позже при настройке, дополнений типа Sieve.
Какие переменные можно использовать в пути к почтовому ящику см. 10-mail.conf
Дополнительно можно:
сменить разделитель используемый для каталогов внутри почтового ящика. По умолчанию Maildir/.folder.subfolder  можно получить Maildir/folder/subfolder установив mail_location = maildir:/mail/~/Maildir:LAYOUT=fs (кроме визуального удобства, если будем лазить по каталогам в консоли, не вижу преимуществ). Если выберете, подсматривайте в оригинальную документацию для отслеживания где еще придется делать дополнительные телодвижения.

Хранить отдельно control файлы (вспомогательные)
dovecot-uidlist — соответсвие IMAP UID <-> Maildir filename
dovecot-keywords - Maildir filename flag (a..z = 0..25) <-> keyword name соответствие
прописав mail_location = maildir:/mail/~/Maildir:CONTROL=/var/no-quota/%u можно хранить их отдельно от почтовых сообщений. Имеет смысл только при использовании квот файловой системы.

Еще можно задать местоположение индексных файлов,
mail_location = maildir:/mail/~/Maildir:INDEX=/var/indexes/%u, этим займемся для общих почтовых каталогов. Здесь переопределять это смысла я не вижу. Можно отключить создание индексных файлов :INDEX=MEMORY.

10-ssl.conf
ssl = no
#ssl_cert = </etc/ssl/certs/dovecot.pem 
#ssl_key = </etc/ssl/private/dovecot.pem

пока отключим ssl, завести бы так...
15-lda.conf
lda_mailbox_autocreate = yes 
lda_mailbox_autosubscribe = yes

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

открывем вторую консоль,
tail -f /var/log/maillog

на первой консоли
/usr/local/etc/rc.d/dovecot start
Starting dovecot.

/usr/local/etc/rc.d/dovecot status
dovecot is running as pid 2610.

netstat -na | grep LISTEN
tcp4 0 0 *.143 *.* LISTEN

смотрим есть ли ругань, на консоли. Настраиваем учетные записи в почтовом клиенте, если получится, последние версии thunderbird стали слишком умными, пытаются проверить там чего-то, не дают завершить настройку, если не проходит соединение. Возможно не пропрет без smtp сервера. Простой пароль, без защиты соединения, пытаемся подключиться, смотрим лог. Внимание пользователь с доменной частью!!!  mailadmin@tstdomain.ru

Что, я считаю необходимым сделать дополнительно:

Уже привычно что в почтовом клиенте, присутствуют почтовые каталоги Отправленные, Черновики, Корзина. Они могут быть созданы автоматически, почтовым клиентом. Но с этим возможны траблы. Представим, пользователь только получил учетную запись, стандартных каталогов нет, и он их создает вручную, на русском языке. Какие каталоги создадутся на сервере? На русском? Да еще если клиент показывает русские названия, а работает с папками на сервере Sent, Drafts ….

Для того чтобы избежать лишних проблем и сэкономить время и нервы в будущем, желательно, что бы стандартная структура для каждого почтового ящика создавалась автоматом.
15-mailboxes.conf
namespace inbox { 
  mailbox Drafts { 
    auto=subscribe 
    special_use = \Drafts 
}
  mailbox Trash { 
    auto=subscribe 
    special_use = \Trash 
  } 
  mailbox Sent { 
    auto=subscribe 
    special_use = \Sent 
  } 
  } 

namespace inbox это наше private namespace (подробнее об этом далее). В 15-mailboxes.conf комментариев достаточно чтобы понять что мы сделали (перевод конфигов - еще одна статья здесь "Dovecot2 config files RUS").
/usr/local/etc/rc.d/dovecot restart

проверим.

Готово! Далее для сбора полноценного стенда нам потребуется настроить postfix.

Шаг 3 - Postfix

Что это мы ставим - MTA mail transfer agent - это сервис висящий как правило на порту 25 (и не только) и принимающий почтовые сообщения по протоколу smtp.
cd /usr/ports/mail/postfix/
make install && make clean

postfix-2.11.3_2,1
          x x+[ ] BDB        Berkeley DB (uses WITH_BDB_VER)  
          x x+[ ] CDB        CDB maps lookups                  
          x x+[x] DOCS       Build and/or install documentation
          x x+[ ] INST_BASE  Install into /usr and /etc/postfix
          x x+[ ] LDAP_SASL  OpenLDAP client-to-server SASL auth
          x x+[ ] LMDB       LMDB maps                          
          x x+[x] MYSQL      MySQL maps (uses WITH_MYSQL_VER)  
          x x+[ ] NIS        NIS maps lookups                      
          x x+[ ] OPENLDAP   OpenLDAP maps (uses WITH_OPENLDAP_VER)  
          x x+[x] PCRE       Perl Compatible Regular Expressions      
          x x+[ ] PGSQL      PostgreSQL maps (uses DEFAULT_PGSQL_VER)
          x x+[ ] SASL2      Cyrus SASLv2 (Simple Auth. and Sec. Layer)
          x x+[x] SPF        SPF support (via libspf2 1.2.x)          
          x x+[ ] SQLITE     SQLite maps                              
          x x+[ ] TEST       SMTP/LMTP test server and generator      
          x x+[x] TLS        SSL and TLS support                    
          x x+[ ] VDA        VDA (Virtual Delivery Agent 32Bit)      
          x xqqqqqqqqqqqqqqqqqqq Dovecot SASL authentication methods qqqqqqqqqqqqqqqqqqx x
          x x+( ) DOVECOT    Dovecot 1.x SASL authentication method    
          x x+(*) DOVECOT2   Dovecot 2.x SASL authentication method    
          x xqqqqqqqqqqqqqq Kerberos network authentication protocol type qqqqqqqqqqqqqx x
          x x+( ) SASLKRB5   If your SASL req. Kerberos5, select this      
          x x+( ) SASLKMIT   If your SASL req. MIT Kerberos5, select this  

не знаю как расписать все опции, опишу отмеченные
MYSQL - там у нас пользователи
PCRE - поддержка регулярных выражений - ограничения
SPF - на будущее, проще в инете найти что это
TLS - защита соединения SSL|TLS
DOVECOT2 - за аутентификацию пользователей будет отвечать он.
 
VDA можно не ставить. Раскладыванием почтовых сообщений по ящикам будет заниматься dovecot.
Would you like to activate Postfix in /etc/mail/mailer.conf [n]?
y

Сделаем рекомендуемое:
/etc/periodic.conf
daily_clean_hoststat_enable="NO" 
daily_status_mail_rejects_enable="NO" 
daily_status_include_submit_mailq="NO" 
daily_submit_queuerun="NO" 

/etc/rc.conf
postfix_enable="YES" 
sendmail_enable="NO" 
sendmail_submit_enable="NO" 
sendmail_outbound_enable="NO" 
sendmail_msp_queue_enable="NO" 

перейдем в каталог с конфигурациооными файлами postfix
cd /usr/local/etc/postfix/

main.cf
myhostname = mail.tstdomain.ru
mydomain = tstdomain.local 
myorigin = $mydomain 
#proxy_interfaces = 1.2.3.4
#можно задать сразу внешн адрес
mydestination = mail.tstdomain.local, localhost.$mydomain, 
localhost, $mydomain
# внимание! выше одна строка
mynetworks_style = subnet 
debug_peer_level = 2 

##__это новые строчки, добавим их, в конец 
###################################################### 
##               MY CONFIG                          ## 
######################################################

virtual_mailbox_domains = mysql:/usr/local/etc/postfix/virtual/domains.sql
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/virtual/users.sql 
virtual_transport = dovecot 
dovecot_destination_recipient_limit = 1

наверное это минимальный набор изменений в main.conf, для запуска postfix в нашем случае.
Немного комментариев:
myhostname лучше указать то имя для которого у вас настроена mx запись.
mydomain указаны честно локальное имя моего сервера, он находится во внутренней сети.
mydestination — для кого мы будем принимать почту помимо виртуальных доменов, пример для мой записи: root@mail.testdomain.local root@localhost.testdomain.local  root@localhost root@testdomain.local  все эти адреса действительны и postfix для них почту принимать будет. Меня это устраивает.
mynetworks_style = subnet - пока нужно для тестов, условие тестов - еще один комп в той же подсети.
virtual_transport = dovecot указываем что почту для виртуальных пользователей будет доставлять dovecot (будет LDA -локальным агентом доставки).
Сделаем еще вот что:
postconf | grep alias_maps
alias_maps = hash:/etc/aliases

postfix ожидает хэш системного файла aliases здесь /etc/aliases, это ссылка на /etc/mail/aliases. Этот файл - список алиасов, которые в конечном счете указывают на root, добавим в конце еще один алиас на виртуального пользователя
/etc/mail/aliases
# в конец добавляем
root:   mailadmin@tstdomain.ru 

и создадим хеш
postalias /etc/mail/aliases

принудительно укажем смотреть на оригинальный файл
main.cf
alias_maps = hash:/etc/mail/aliases 

после этих манипуляций, вся почта адресованная root будет уходить виртуальному пользователю  mailadmin@testdomain.ru.

Создадим файлы с параметрами подключения к базе данных.
mkdir /usr/local/etc/postfix/virtual
cd /usr/local/etc/postfix/virtual

domains.sql
unix:file=/tmp/mysql.sock 
user = mailreader 
password = password
dbname = mail 
table = domains 
select_field = domain 
where_field = domain 

users.sql
unix:file=/tmp/mysql.sock 
user = mailreader 
password = password 
dbname = mail 
table = users 
select_field = concat ( '/MAIL', home ) 
where_field = email 
#additional_conditions = and act = '1'


Немного подкрутим безопасность файлов с паролями
chown -R root /usr/local/etc/postfix/virtual
chmod -R 640 /usr/local/etc/postfix/virtual/
chgrp -R postfix /usr/local/etc/postfix/virtual

Добавим описание транспорта dovecot для postfix
master.cf
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/dovecot-lda 
 -f ${sender} -d ${recipient}
# Внимание! здесь две строки всего, 2я и3я - одна строка.

Подсмотрено здесь http://wiki2.dovecot.org/LDA/Postfix

и еще права
/usr/local/etc/dovecot/conf.d/10-master.conf

 unix_listener auth-userdb {
    #mode = 0666
    mode = 0777

Обязательно на соседней консоли
tail -f /var/log/maillog

а в рабочей
/usr/local/etc/rc.d/postfix start
/usr/local/etc/rc.d/dovecot restart

проверяем,
echo test | mail root

отслеживаем в другой консоли что происходит...
dovecot: lda(admin@testdomain.ru): msgid=<20130307131730.64A812A3C1@mail.testdomain.ru>: saved mail to INBOX
postfix/pipe[96643]: 779E12A3C2: to=<admin@testdomain.ru>, orig_to=<root>, relay=dovecot, delay=0.47, delays=0.05/0.01/0/0.41, dsn=2.0.0, status=sent (delivered via dovecot service)

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

Ну вот, тестовый стенд для постепенного наращивания функционала собран.

Шаг 4 — Dovecot TLS, SSL

Итак пароли у нас передаются открытым текстом. Это может быть приемлемым, но не всегда. Если выбрать другой, более сложный механизм аутентификации, можно получить проблемы с неподдержкой его клиентами. Конкретнее, проблема в приложениях для мобильников, как правило они поддерживают только PLAIN, и в дополнение требуют SSL/TLS).

Немного теории с http://wiki2.dovecot.org

Первоначально поддержка SSL была добавлена для протоколов, используя отдельный  "SSL порт" (IMAPS, pop3s и т.д.), где SSL рукопожатие начинается сразу же, при  подключении клиента, и только после получения зашифрованной сессии, начинается работа регулярных протоколов. Использовать два отдельных порта для аутентификации открытым текстом  и SSL соединений считается расточительным и добавляет сложности клиентам которые, возможно, хотят использовать SSL. Появление команды STARTTLS позволяет отказаться от выделенных SSL портов.

Попробуем внедрить TLS.

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

Разработчики dovecot о нас позаботились, можно воспользоваться готовым скриптом /usr/local/share/examples/dovecot/mkcert.sh предварительно подредактировав /usr/local/share/examples/dovecot/dovecot-openssl.cnf

cd /usr/local/share/examples/dovecot/

dovecot-openssl.cnf
C=RU 
L=Moscow 
O=TSTCompany 
OU=IT server 
CN=mail.tstdomain.ru
emailAddress=postmaster@tstdomain.ru

создадим папки в которых будут храниться сертификаты
mkdir /etc/ssl/certs /etc/ssl/private

еще полезно поправить срок действия сертификатов, параметр -days 365 в скрипте mkcert.sh. Грубо прикинем, сколько осталось до пенсии — 20*365=7300. Запустим генерирование сертификатов:
sh mkcert.sh

chmod -R 0444 /etc/ssl/certs/
chmod -R 0400 /etc/ssl/private/

сертификаты готовы, права выставлены, идем настраивать dovecot
cd /usr/local/etc/dovecot/conf.d/

10-ssl.conf
ssl = yes 
ssl_cert = </etc/ssl/certs/dovecot.pem 
ssl_key = </etc/ssl/private/dovecot.pem 
ssl_require_crl = no 

Сказали пользовать ssl, пути к сертификатам, и не смотреть список отзыва клиентских сертификатов.

10-auth.conf
disable_plaintext_auth = yes 

Теперь нельзя простыми паролями (это не относится к соединениям защищенным ssl). Тоесть теперь только ssl с простым паролем, и никак по другому.

10-logging.conf
verbose_ssl = yes 

/usr/local/etc/rc.d/dovecot restart

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

Итак, чего мы достигли: теперь все пользователи подключаются к нашему серверу через зашифрованное соединение. Положительные моменты — возможность подключения мобильных приложений и пароли с пользователями в открытом виде не передаются. Можно сделать исключения для пользователей из "своих" сетей - не использовать TLS, но как показал опыт - никто при настройке лишние движения делать не хочет, в том числе и я :(  Сейчас также можно задействовать выделенные порты с SSL, если это Вам нужно.

Шаг 5 - Master users

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

Итак, что нам нужно, указать разделитель (* хороший выбор) и  2 базы данных с обычными и мастер пользователями. При использовании логина пользователь*мастер проверка мастера производится в другой базе. Работает только  при использовании PLAIN механизма SASL( с STARTTLS или без)(еще один аргумент за PLAIN).

Настроим рекомендуемый разделитель, и подключим auth-master.conf.ext
10-auth.conf
auth_master_user_separator = * 
!include auth-master.conf.ext 

auth-master.conf.ext
passdb { 
  driver = passwd-file 
  master = yes 
  args = /usr/local/etc/dovecot/master-users 
 pass = yes 
  } 

echo 'masteradmin:{plain}222' > /usr/local/etc/dovecot/master-users
cat /usr/local/etc/dovecot/master-users
masteradmin:{plain}222

/usr/local/etc/rc.d/dovecot restart

Проверяем, необходимо с клиента подключиться под пользователем test@tstdomain.ru*masteradmin и паролем 222, защита соединения STARTTLS.

Мастер пользователей может быть несколько:
echo 'masteradmin2:{plain}333' > /usr/local/etc/dovecot/master-users

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

Шаг 6 - QUOTA

Настройка квот очень важна на сервере, даже если у Вас 10 человек, то все равно рано или поздно получим проблемы. В основном это проблемы с огромным количеством никому не нужных сообщений, которые еще и будут  синхронизироваться по imap, и удалить их нельзя, вдруг там что-то ООЧЕНЬ важное, а чистить от неважного времени конечно нет.... Необходим метод принуждения.

Подробное описание что тут сделано статья - Возможности dovecot2, сейчас кратко.

Приступим к реализации. Настроим наиболее часто используемые - maildir пользовательские квоты в 10Мб.

90-quota.conf
plugin { 
  quota = maildir:User quota 
  quota_rule = *:storage=10M
  quota_rule2 = Trash:storage=+100M 
}
# воспользуемся сервисом предупреждений о приближении ограничения.
plugin { 
  quota_warning = storage=95%% quota-warning 95 %u 
  quota_warning2 = storage=80%% quota-warning 80 %u 
} 
# заменим пользователя от которого запускается скрипт..
service quota-warning { 
  executable = script /usr/local/bin/quota-warning.sh 
  user = vmail 
  unix_listener quota-warning { 
    user = vmail 
  } 
} 

 quota_grace = 20%% 

Настроили ящик размером 10 мб, и дополнительно 100мб в корзине. (при удалении письма сначала копируются в корзину, для этого нужно дополнительное место сверх общей квоты. (про shift+del не все знают). quota_grace = 20%% - полезный параметр - позволяет превысить квоту на ..% при доставке почты, при этом по imap не даст нормально работать - вынуждая пользователя чистить ящик. На http://wiki2.dovecot.org/ пример скрипта, создадим соответствующий файлик:
/usr/local/bin/quota-warning.sh
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o 
"plugin/quota=maildir:User quota:noenforcing"
From: postmaster@testdomain.ru
Subject: quota warning

Your mailbox is now $PERCENT% full.
EOF

chmod +x /usr/local/bin/quota-warning.sh
chown vmail:vmail /usr/local/bin/quota-warning.sh
chmod 550 /usr/local/bin/quota-warning.sh

Настроили, теперь необходимо задействовать.
Модуля квоты два:
  quota:      сама реализация квот, включая  все движки квот.
  imap_quota: выдает информацию о квотах через IMAP.

Добавим их в нужные конфиги...
15-lda.conf
mail_plugins = $mail_plugins quota

20-imap.conf
mail_plugins = $mail_plugins quota imap_quota 

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

Протестируем..
обязательно смотрим на  соседней консоли
tail -f /var/log/maillog


добиваемся заполнения ящика на 80 и 95 % и 100%


Шаг 7 - QUOTA  PER USER

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

введем в таблицу users дополнительное поле quota
/root/workmail/adduserquota.sql
# use this:  mysql < adduserquota.sql
use mail;
alter table users add column quota integer(10) UNSIGNED DEFAULT '0'; 
update users set quota='30'; 

зальем в мускуль
mysql < adduserquota.sql

добавили  UNSIGNED - беззнаковое число, думаю длины в 10 знаков хватит с лихвой, (зависит от того в каких единицах Вы будете мерять) и задали всем квоту в 30 ЕДЕНИЦ объема.

дополнительно необходимо в ../dovecot-sql.conf.ext несколько модифицировать  user_query
user_query = select concat ('/MAIL/', home) as home, concat ('*:storage=',
 quota, 'M' ) as quota_rule from users where email = '%u' 
# Внимание! здесь одна строка.

внимательно с запятыми.
Здесь добавляется запрос значения поля quota из базы данных и формирования строки, которая переопределит строку  quota_rule = *:storage=10M из 90-quota.conf
Приписывание M/G позволяет хранить в базе более читабельные значения квот. Думаю пора уже использовать G. Для теста пока оставим M.

Проверяем, если все работает как задумывалось, можно немного лоска навести — подредактировать /usr/local/bin/quota-warning.sh, написать поинтересней сообщение, возможно, даже на великом и могучем. Я не парился.
Да, и поставьте G !!

Шаг 8 — Public Namespace (общие почтовые каталоги)

Зачем? Появится возможность создавать общие почтовые каталоги видимые всеми/не всеми сотрудниками. Сообщение там будет храниться в одном экземпляре для всех - меньше места, возможно будет отказаться от некоторых массовых рассылок....

Попробуем добавить public namespace.
Перейдем в каталог в котором будет вестись основная работа
cd /usr/local/etc/dovecot/conf.d/


откроем еще одну консоль, на которой запустим
tail -f /var/log/maillog

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

Для начала раскомментим некоторые параметры в пространстве имен по умолчанию. Дело в том, что если ни одно namespace не определено, то подразумевается что определено private. Но, если сразу добавить public или shared, система будет думать что мы создаем сервер только с этими namespace и забудет о private. Поэтому перед добавлением дополнительного namespace, явно укажем что у нас есть private.
10-mail.conf
namespace inbox { 
type = private 
separator = /
inbox = yes
list = yes 
subscriptions = yes
} 

в руководстве separator рекомендуется выбирать «/», Если это не указывать, будет использоваться сепаратор по умолчанию «.»  Я использовал рекомендуемый. Важно его раскомментировать.
/usr/local/etc/rc.d/dovecot restart

смотрим консоль с логом и малость протестируем, что все еще работает....

Попробуем настроить public namespace.

10-mail.conf
namespace   {
  type = public
  separator = / 
  prefix = Company/ 
  hidden = no 
  location = maildir:/MAIL/Company
  inbox = no 
  list = yes 
  subscriptions = yes 
  #ignore_on_failure = 
  #disabled = 
  #alias_for = 
  #mailbox = 
} 

Описание используемых параметров в переводе 10-mail.conf (см. отдельную статью "dovecot RUS" на этом же ресурсе)
тип почтового ящика maildir,  location = maildir:/MAIL/Company
и создадим почтовые каталоги. Почтовые каталоги у меня начинаются с «.», т. к. я не переопределял принятый по умолчанию в dovecot разделитель иерархии для  maildir
mkdir -p /MAIL/Company/.Spam
mkdir /MAIL/Company/.News
chown -R vmail:vmail /MAIL/Company/
chmod -R g+w /MAIL/Company/

/usr/local/etc/rc.d/dovecot restart

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

Здесь важна магия! Сразу может не заработать. Нужно поплясать с бубном - копирнуть потроха другого почтового ящика в Company. Проверить, почистить...
типа

cp -R /MAIL/test/Maildir/* /MAIL/Company/

Проверим как все работает.
По умолчанию, сообщения в этих почтовых каталогах маркируются как прочитаные/непрочитаные глобально, т. е. если один пользователь изменил \Seen флаг, это увидят все остальные. Полезно изменить это поведение

10-mail.conf
namespace  { 
  type = public 
  separator = / 
  prefix = Company/ 
  hidden = no 
  location = maildir:/mail/Company:INDEX=~/Maildir/Company
  inbox = no 
  list = children 
  subscriptions = yes 
  #ignore_on_failure = 
  #disabled = 
  #alias_for = 
  #mailbox = 
} 

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

Попробуем прикрутить квоту к этому namespace.

приведем правила квот к виду:
90-quota.conf
plugin { 
  quota = maildir:User quota 
  quota_rule = *:storage=10M 
  quota_rule2 = Trash:storage=+10M 
  quota1 = maildir:Shared quota:ns=Company/ 
  quota1_rule = *:storage=10M 
} 

/usr/local/etc/rc.d/dovecot restart

Проверим как все работает.

:( у меня не заработало :(, а раньше получалось. Ну да ладно, это мелочи.
Сейчас к этому каталогу все имеют полный доступ, мы это поправим..


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

Шаг 9 — Access Control Lists

Немного теории с dovecot.org:
Dovecot v1.0 и v1.1 поддерживает файлы ACL — списки контроля доступа настраиваемые администратором. v1.2+ также поддерживает расширение IMAP ACL, которое позволяет пользователям самостоятельно изменять списки ACL.  

Подробное описание см. в статье "Возможности Dovecot" на этом же сайте.

Пример файла ACL:
 
owner lrwstipekxa
   user=timo rl
   group=acessallow
   group-override=acessdeny lrwstipekxa 

Владелец - все возможные права.
пользователь timo только read, list
группе acessallow - нет вообще доступа (user timo перекроет эти права, даже если он в этой группе)
group-override=acessdeny lrwstipekxa - полные права членам группы, не перекрываются индивидуально заданными пользователям.

Приступим к реализации.
90-acl.conf [/b]
plugin { 
  #setting_name = value 
  acl = vfile 
} 

в 20-imap.conf добавить к существующим расширениям, следующие: acl imap_acl - сам движек прав доступа и движек выдающий эту информацию по imap, у меня с учетом предыдущих примеров, подобное:
mail_plugins = $mail_plugins quota imap_quota acl imap_acl 

/usr/local/etc/rc.d/dovecot restart

и проверяем, действительно ли мы потеряли доступ к нашему public namespace. Если были подписаны, то выдает ошибку, если подписываться заново, то не видит почтовых каталогов.  
Теперь создадим dovecot-acl файл с разрешением доступа
/MAIL/Company/dovecot-acl
anyone lr 

cp /MAIL/Company/dovecot-acl /MAIL/Company/.Spam/dovecot-acl
cp /MAIL/Company/dovecot-acl /MAIL/Company/.News/dovecot-acl

Теперь группы..

идем в mysql добавлять поле с группами, внимание с длиной поля, возможно всего 128 знаков маловато будет, но мне хватит.

введем в таблицу users дополнительное поле acl_groups
/root/workmail/addacl_groups.sql
# use this:  mysql < addacl_groups.sql
use mail;
alter table users add column acl_groups varchar(128) DEFAULT NULL ;
update users set acl_groups='allow' where email='mailadmin@tstdomain.ru';
update users set acl_groups='allow,deny' where email='test@tstdomain.ru'; 

зальем в мускуль
mysql < addacl_groups.sql

Внимание, группы должны быть разделены только запятой «accessallow,accessdeny», с пробелами «allow, deny» работать не будет. В реальной системе, возможно будут группы вида group@tstdomain.ru, сейчас попроще.

в dovecot-sql.conf.ext правим запрос к базе пользователей, добавим в user_query запрос поля acl_groups
user_query = select concat ( '/MAIL/', home ) as home, 
concat ( '*:storage=', quota, 'M' ) as quota_rule, acl_groups 
from users where email = '%u'
# Внимание! все это одна строка

/usr/local/etc/rc.d/dovecot restart

Проверяем.
Необходимо создать файлы типа /MAIL/Company/dovecot-acl
с правами на пользователей и группы внутри.

ACL и Мастер пользователи

Если осталась настроенной учетная запись  test@tstdomain.ru*masteradmin, то можно видеть что она не работает. Исправим:
в dovecot-sql.conf.ext раздуем еще чуть-чуть запрос, добавив:'%u' as master_user,
user_query = select concat ( '/mail/', home ) as home, concat 
( '*:storage=', quota, 'M' ) as quota_rule, acl_groups, '%u' 
as master_user from users where email = '%u' 
# Внимание! все это одна строка

/usr/local/etc/rc.d/dovecot restart

В результате master_user для системы ACL становится user-ом

Шаг 10 Shared namespace

Попробуем следующий уровень - добавим shared namespace.
У пользователей появится возможность самостоятельно расшаривать свои почтовые каталоги для других пользователей.

Добавим желаемое namespace
10-mail.conf
namespace  { 
  type = shared
  separator = / 
  prefix = Users/%%u/
  hidden = no 
  location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u
  inbox = no 
  list =  children
  subscriptions = no
  #ignore_on_failure = 
  #disabled = 
  #alias_for = 
  #mailbox = 
} 

опять, если интересно подробнее - "Возможности  Dovecot2"

Итак наша строка
mail_location = maildir:%%h/Maildir:INDEX=%h/Maildir/shared/%%u
означает:
%%h/Maildir указывает на Maildir других пользователей, например, "/mail/someone1".
:INDEX=%h/Maildir/shared/%%u указывает на то, где будут храниться лично мой индексный файл расшареного почтового каталога другого пользователя.

С указанной выше конфигурацией можно открыть расшареные почтовые каталоги, если вы знаете их имена, но они не будут видны в списке общих почтовых каталогов. Это потому, что Dovecot не знает, какие пользователи сделали общими свои  почтовые каталоги и для кого. Перебор всех пользователей и, просмотр их почтовых каталогов был бы ужасно неэффективен для более чем пары пользователей.
Для решения этой проблемы Dovecot-у необходим словарь, содержащий список пользователей имеющих общие почтовые каталоги и для кого они доступны.
Вы можете использовать любой backend словарь, в том числе SQL, но простой плоский файл тоже будет неплохо работать (руководство - дословно):

Создадим словарь, как простой файл:
90-acl.conf
plugin { 
  acl_shared_dict = file:/var/db/dovecot/dict/shared-mailboxes
} 

mkdir /var/db/dovecot/dict/
chown vmail:vmail /var/db/dovecot/dict/

/usr/local/etc/rc.d/dovecot restart

Смотрим, визуально изменений никаких, но главное чтобы ругани в /var/log/maillog не было.
Далее:
Смотрим свойства папки в thunderbird -вккладка "совместное использование".
Ранее приходилось ставить дополнение imap-ACL-Extension
как проверять думаю понятно...


Если очень хочется, можно расшарить свою папку всем. По умолчанию Dovecot не позволяет использовать установку IMAP разрешений для "anyone" или "authenticated". Но если Вам очень нужно:
90-acl.conf
plugin { 
  acl_shared_dict = file:/var/db/dovecot/dict/shared-mailboxes 
  acl_anyone = allow 
} 

После этой манипуляции можно использовать anyone и authenticated идентификаторы и у всех пользователей появится возможность воспользоваться Вашим опубликованным каталогом. За исключением, тех, кому можно установить негативные права!! Например добавим -test@tstdomain.ru  read message. Добавляется с минусом, и этот пользователь теряет доступ, в отличии от всех остальных.
Небольшое отступление: anyone включает anonymous, authenticated без него. Это встроенные группы. Группы из поля acl_groups, тоже работают! Их можно добавлять как $group или $!group и для возможности group-override.



Шаг 11 Sieve

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

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

поставили, то что поставили состоит из 2х частей: плагин для dovecot который обрабатывает почту и сервер, позволяющий пользователям самим править свои правила sieve.
Приступим.

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

cd /usr/local/etc/dovecot/conf.d/

скопируем новый конфиг файл

cp /usr/local/share/doc/dovecot-pigeonhole/example-config/conf.d/90-sieve.conf \
/usr/local/etc/dovecot/conf.d/

включим плагин sieve в дополнение к, у меня уже работающему, плагину quota
15-lda.conf
mail_plugins = $mail_plugins quota sieve 

90-sieve.conf
sieve = ~/.dovecot.sieve 
   sieve_dir = ~/sieve 
} 

/usr/local/etc/rc.d/dovecot restart

Смотрим нет ли ругани...

Внедрили, теперь можно написать скрипты и посмотреть как работает, но писать лень, и для простых пользователей необходимо более простое решение, чем написание скриптов .sieve в сеансе SSH или заливание их к себе в домашний каталог по FTP.
Настроим ManageSieve Server, скопируем, для начала, чудесно появившийся новый конфиг файл
cp /usr/local/share/doc/dovecot-pigeonhole/ example-config/conf.d/20-managesieve.conf /usr/local/etc/dovecot/conf.d/

20-managesieve.conf
protocols = $protocols sieve 

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

/usr/local/etc/rc.d/dovecot restart
netstat -na | grep LISTEN
tcp4 0 0 *.4190 *.* LISTEN

видим что у нас поднялся еще один сервис, теоретически он должен позволять рулить .sieve скриптами. У thunderbird есть всякие дополнения, которые позволяют работать с этим. Рекомендую сразу забыть об этих дополнениях, и настаивать правила через web-интерфейс roundcube, благо там поддержка dovecot sieve заявлена как "fine".

Можно прикрутить глобальный сценарий, работающий для всех пользователей, см подробности в статье "Возможности  Dovecot2"
                     

Шаг 12 - Trash Plugin

Обычно, если сообщение не может быть сохранено/скопировано, потому что пользователь превысил квоту, операция завершается с ошибкой "Квота превышена". Trash плагин поможет еще немного продержаться, давая Dovecot право автоматически стирать старые сообщения из определенных почтовых каталогов, пока новое сообщение не будет сохранено. Если новое сообщение настолько большое, что не поместится, даже если стереть все сообщения из настроенных почтовых каталогов, то удаления не происходит, и пользователь получает ошибку "Квота превышена". Этот плагин может сэкономить время, избежав общения с пользователями, просто перемещающими ненужные сообщения в корзину, без ее очистки. Иногда просто забывают.

Этот плагин требует загруженного и настроенного плагина quota, использующего не файловую квоту.

Приступим к реализации:

Где включается? По идее там где и квота, 15-lda.conf, 20-imap.conf либо глобально 10-mail.conf

15-lda.conf
mail_plugins = $mail_plugins …...... trash …..

укажем местоположение файла конфигурации

90-plugin.conf
plugin {
  trash = /usr/local/etc/dovecot/dovecot-trash.conf.ext 
}

Файл конфигурации представляет собой текстовый файл, где каждая строка имеет формат:
<priority> <mailbox name>
Письма будут удаляться по приоритету, начиная с низшего -> до высшего номера.

/usr/local/etc/dovecot/dovecot-trash.conf.ext
# Spam mailbox is emptied before Trash
1 Spam
# Trash mailbox is emptied before Sent
2 Trash
# If both Sent and "Sent Messages" mailboxes exist, the next oldest message
# to be deleted is looked up from both of the mailboxes.
3 Sent
3 Sent Messages

/usr/local/etc/rc.d/dovecot restart

Проверяем, ….. не забываем при тестировании работы, настраивали ли мы дополнительные, внеквотные 100Mб для каталога Trash.


Если Вы добрались до этого места, и еще не хочется на все плюнуть, идем к части 2.






размещено: 2014-12-01,
последнее обновление: 2015-01-20,
автор: KontraBass



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0646 секунд
Из них PHP: 54%; SQL: 46%; Число SQL-запросов: 75 шт.
Исходный размер: 136802; Сжатая: 28345