Чужой опыт экономит время и увеличивает шансы для удачи

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

Пример настройки всех основных конфигов всех элементов рассматриваемой в этой серии заметок почтовой системы. Список всех пакетов для установки в Debian. Этот пример - всего лишь частный случай, для определенных конкретных задач.

Речь идет о такой конфигурации:
Postfix + Dovecot 2 + MySQL + PostfixAdmin + Postgrey + Postscreen + ClamAV + DKIM + Sieve + RoundCube (+плагины к RoundCube, включая парочку, написанных тут же, "с лету", своих экспериментальных). OC - Debian.

ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы.
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера





ВНИМАНИЕ! Тестирование конфигов "начисто" не проводилось. Возможны ошибки!

Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).

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

Здесь описываются примеры для одного конкретного частного случая конфигурации почтовой системы.

Содержание

  1. Описание конфигурации
  2. Настройка операционной системы (Debian)
  3. PTR
  4. DKIM и SPF
  5. MySQL
  6. PostfixAdmin
  7. Установка Postfix и Dovecot
  8. Postfix - конфигурационные файлы
  9. Dovecot - конфигурационные файлы
  10. Сертификаты
  11. Roundcube
  12. Полезные команды
  13. Источники

Описание конфигурации

Здесь рассматривается случай, когда всё находится на одном сервере.

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

PostfixAdmin будет использовать два порта: 25 - для коннекта с другими MTA, 587 - для подключения пользователей при отправке почты.

Dovecot будет использовать только IMAP для MUA. Протоколы: LMTP, IMAP, Sieve.
Dovecot-LDA будет использоваться только для рефильтеринга уже полученной ранее почты. Формат почтовых ящиков - Maildir.

Кликнув на кнопку можно изменить параметр во всех конфигах ниже:
  • domain - имя машины.
  • domain.tld - домен в примере.
  • mail.domain.tld - почтовый субдомен.
  • postmaster - левая часть логина почтового ящика админа и мастер-пользователя postmaster@domain.tld.
  • bccsnd - левая часть логина почтового ящика для авто-BCC неизвестных пользователей родных доменов bccsnd@domain.tld.
  • user1 , user2 - левая часть логинов почтовых ящиков пользователей user1@domain.tld и user2@domain.tld.
  • ip1.ip2.ip3.ip4 - IP адрес домена, и он же IP адрес почтового субдомена.
  • 5000 , vmail - GUID, группа пользователей виртуальных ящиков.
  • 5000 , vmail - UID, системный пользователь виртуальных ящиков.
  • /home/vmail/ - базовый каталог почты Maildir. Формат: "/home/vmail/domain.tld/_пользователь_/".
  • /etc/dovecot/acl/%d - каталог глобальных ACL.
  • /var/lib/dovecot/ - каталог, в котором будет создан вложенный подкаталог "sieve" с глобальными (каталог "global") и персональными (каталог "personal") Sieve-скриптами.
  • /var/lib/dovecot/virtual - каталог виртуальных папок плагина "virtual" Dovecot.
  • 8891 - порт OpenDKIM.
  • 7357 - порт ClamAV-Milter.
  • 10023 - порт Postgrey.
  • 4190 - порт ManageSieve.
  • /etc/postfix/mysql_virtual_maps.cf - файл SQL-запроса виртуального почтового ящика.
  • /etc/postfix/mysql_virtual_domains.cf - файл SQL-запроса домена.
  • /etc/postfix/mysql_virtual_alias_maps.cf - файл SQL-запроса почтового ящика, для которого запрашиваемый является алиасом.
  • /etc/postfix/mysql_virtual_alias_domain_maps.cf - файл SQL-запроса ящика домена, для которого домен запрашиваемого ящика является алиасом.
  • /etc/postfix/mysql_bcc_mailbox_maps.cf - файл SQL-запроса для авто-BCC в ящики зарегистрированных отправителей.
  • /etc/postfix/mysql_bcc_domain_maps.cf - файл SQL-запроса ящика для авто-BCC не зарегистрированных отправителей родных доменов.
  • /etc/postfix/ssl.key.pem - Postfix SSL ключ.
  • /etc/postfix/ssl.cert.pem - Postfix SSL сертификат.
  • /etc/dovecot/ssl.key.pem - Dovecot SSL ключ.
  • /etc/dovecot/ssl.cert.pem - Dovecot SSL сертификат.
  • 3650 - Количество дней на которые действительны SSL-сертификаты.
  • /etc/postfixadmin/scripts/ - путь к папке с пост-скриптами PostfixAdmin.
  • 1024000000 - размер почтового ящика (в байтах).
  • 20480000 - максимальный размер письма (в байтах).
  • /var/www/html/ssl/ - путь к корневой папке с web-файлами для https Apache2
  • _POSTFIXADMIN_SQL_BASE_ - имя MySQL базы PostfixAdmin

  • _POSTFIXADMIN_SQL_USER_ - имя пользователя MySQL базы PostfixAdmin

  • _POSTFIXADMIN_SQL_PASSWORD_ - пароль пользователя MySQL базы PostfixAdmin

  • _ROUNDCUBE_SQL_BASE_ - имя MySQL базы Roundcube

  • _ROUNDCUBE_SQL_USER_ - имя пользователя MySQL базы Roundcube

  • _ROUNDCUBE_SQL_PASSWORD_ - пароль пользователя MySQL базы Roundcube

Все встречающиеся здесь команды в консоли выполняются из-под "root"!

# sockstat -l

USER       PROCESS           PID   PROTO   SOURCE ADDRESS       FOREIGN ADDRESS   STATE

...

opendkim   opendkim          ...   tcp4    127.0.0.1:8891       *:*               LISTEN

clamav     clamav-milter     ...   tcp4    127.0.0.1:7357       *:*               LISTEN

root       /usr/sbin/postg   ...   tcp4    127.0.0.1:10023      *:*               LISTEN

root       dovecot           ...   tcp4    127.0.0.1:143        *:*               LISTEN

root       dovecot           ...   tcp4    127.0.0.1:4190       *:*               LISTEN

root       master            ...   tcp4    127.0.0.1:25         *:*               LISTEN

root       master            ...   tcp4    ip1.ip2.ip3.ip4:25   *:*               LISTEN

root       master            ...   tcp4    127.0.0.1:587        *:*               LISTEN

root       master            ...   tcp4    ip1.ip2.ip3.ip4:587  *:*               LISTEN

...

# netstat -l -p | grep lmtp
unix  2      [ ACC ]     STREAM     LISTENING     ...     .../dovecot        /var/spool/postfix/private/dovecot-lmtp
unix  2      [ ACC ]     STREAM     LISTENING     ...     .../master         private/lmtp

См. заметку Пересылка почты - примеры работы системы в разных ситуациях.

А также заметку Копии всех отправленных.

ВАЖНО! Необходимо соблюдать порядок установки, указанный в следующих разделах.

Настройка операционной системы (Debian)

Файлы конфигурации могут выглядеть примерно так:

/etc/hosts :

127.0.0.1          localhost
ip1.ip2.ip3.ip4    mail.domain.tld
ip1.ip2.ip3.ip4    domain.tld
...

Возможно понадобится дополнительная настройка IPv6.

/etc/hostname :

domain

Рекомендую удалить в т.ч. строки с комментариями{информация нуждается в проверке}.

/etc/mailname :

mail.domain.tld

PTR

PTR настраивается скорее всего у провайдера, где находится сервер. Необходимо указать mail.domain.tld для IP своего сервера.

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

# nslookup ip1.ip2.ip3.ip4
...
ip4.ip3.ip2.ip1.in-addr.arpa       name = mail.domain.tld

Результат в левой части последней строки содержит IP наоборот.

Соответственно, и в DNS тоже, IP сервера должен быть сопоставлен указанному почтовому домену (он может быть там на том же IP, что и сайт).

DKIM и SPF

Заметка с описанием SPF и DKIM.

DKIM требует установки и настройки соответствующего пакета (см. ниже).
Policyd-SPF требует установки и настройки соответствующего пакета (см. ниже).

DKIM и SPF настраивается в DNS в виде TXT-записей.

SPF в DNS может выглядеть примерно так:

domain.tld. IN TXT "v=spf1 a mx ip4:ip1.ip2.ip3.ip4 ~all"

ВАЖНО! После домена должны быть точка.

DKIM в DNS может выглядеть примерно так:

mail._domainkey IN TXT "v=DKIM1;k=rsa;p=_КЛЮЧ_СГЕНЕРИРОВАННЫЙ_СООТВЕТСТВУЮЩИМ_СОФТОМ_"

Определяем политику использования DKIM в домене - добавляем в DNS еще одну TXT-запись

_adsp._domainkey IN TXT "dkim=all"

Где:
unknown - отправка не подписанных сообщений разрешена (значение по умолчанию)
all - отправка не подписанных сообщений запрещена
discardable - все не подписанные сообщения должны быть заблокированы на стороне получателя

Итого: для DKIM 2 записи + 1 для SPF.

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

MySQL

Предполагается, что "mysql-server" уже установлен - установка MySQL здесь не рассматривается.

В конфигурационном файле MySQL, в этом примере, указан не домен, а IP.

/etc/mysql/my.cnf :

...
bind-address = 127.0.0.1
...

Важно, чтобы этот параметр совпадал с настройками в почтовых программах. Если здесь будет указано localhost , а в других местах - 127.0.0.1 , то это может вызвать проблемы. Рекомендую здесь указывать именно IP.

PostfixAdmin

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

Предполагается, что "apache2", "php5" и "mysql-server" - уже установлены. Их установка здесь не рассматривается.

Нужно в MySQL создать базу и пользователя для PostfixAdmin.

Установка:

# apt-get install php5-imap php5-mbstring
# apt-get install postfixadmin

В вопросах установки ставим пометку на Apache2, и на вопрос о создании базы отвечаем - нет.

PostfixAdmin установился сюда: /usr/share/postfixadmin/

При установке PostfixAdmin создал ссылку на файл с описанием алиаса для Apache2 здесь: /etc/apache2/conf.d/postfixadmin

Подправляем алиас (установим доступ только через SSL)

/etc/postfixadmin/apache.conf :

...
<Directory "/usr/share/postfixadmin/">
 
SSLRequireSSL
 
#################
AuthUserFile /etc/apache2/postfixadmin.htpasswd
AuthName "Password"
AuthType Basic
require valid-user
#################
 
</Directory>
...

Необходимо будет внести логин и пароль в файл /etc/apache2/postfixadmin.htpasswd - это здесь не рассматривается.

Во всех примерах конфигов здесь следует удалять троеточия (...) - они означают не указанные здесь строки.

Правим настройки для MySQL:

/etc/postfixadmin/dbconfig.inc.php :

...
$dbuser='_POSTFIXADMIN_SQL_USER_';
$dbpass='_POSTFIXADMIN_SQL_PASSWORD_';
$basepath='';
$dbname='_POSTFIXADMIN_SQL_BASE_';
$dbserver='127.0.0.1';
$dbport='3306';
$dbtype='mysql';
...

Заходим в установщик (через браузер) по адресу:
https://domain.tld/postfixadmin/setup.php

Выполнив, то что предложит установщик, вписываем пароль на доступ к setup в файл

/etc/postfixadmin/config.inc.php :

...
$CONF['setup_password'] = '_СТРОКА_ПРЕДЛОЖЕННАЯ УСТАНОВЩИКОМ_';
...

Создаем через setup суперадмина (postmaster@domain.tld) и новый пароль для него (нужно будет вводить еще раз пароль к setup для доступа).

Там же (здесь указаны только ключевые строки файла конфигурации):

/etc/postfixadmin/config.inc.php :

...

$CONF['default_language'] = 'ru';

...

$CONF['admin_email'] = 'postmaster@domain.tld';

...

// Используется в письмах:

$CONF['smtp_server'] = '127.0.0.1';

//$CONF['smtp_server'] = 'mail.domain.tld';

$CONF['smtp_port'] = '25';

//$CONF['smtp_port'] = '587';

...

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

...

//$CONF['dovecotpw'] = "/usr/sbin/dovecotpw";

//$CONF['dovecotpw'] = "/usr/bin/doveadm pw";

 

...

$CONF['page_size'] = '50';

...

//$CONF['default_aliases'] = array (

// 'abuse' => 'abuse@change-this-to-your.domain.tld',

// 'hostmaster' => 'hostmaster@change-this-to-your.domain.tld',

// 'postmaster' => 'postmaster@change-this-to-your.domain.tld',

// 'webmaster' => 'webmaster@change-this-to-your.domain.tld'

//);

//$CONF['default_aliases'] = array ( // <<-- Мешает.

// 'webmaster' => 'postmaster@domain.tld'

//);

...

$CONF['domain_path'] = 'YES';

...

$CONF['domain_in_mailbox'] = 'NO';

...

$CONF['aliases'] = '0';

$CONF['mailboxes'] = '0';

$CONF['maxquota'] = '1024';

...

$CONF['quota'] = 'YES';

...

$CONF['quota_multiplier'] = '1048576';

...

$CONF['transport'] = 'YES';

...

$CONF['transport_options'] = array (

   'virtual', // for virtual accounts

   'local', // for system accounts

   'relay' // for backup mx

);

...

$CONF['vacation'] = 'NO';

...

$CONF['vacation_domain'] = '';

...

$CONF['vacation_control'] ='NO';

...

$CONF['alias_control'] = 'YES';

...

$CONF['fetchmail_extra_options'] = 'YES';

...

$CONF['show_header_text'] = 'YES';

//$CONF['header_text'] = '<div align=center>:: Your site ::</div>';

$CONF['header_text'] = '<div align=center>Надпись в верхней части интерфейса PosfixAdmin.</div>';

...

$CONF['user_footer_link'] = "main";

...

$CONF['footer_text'] = 'Return to domain.tld';

$CONF['footer_link'] = 'http://domain.tld'

...

// Welcome Message

// This message is send to every newly created mailbox.

// Change the text between EOM.

$CONF['welcome_text'] = <<<EOM

Здравствуйте!

Добро пожаловать в свой новый ящик.

 

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

 

Hello.

Welcome to your new account.

 

EOM;

...

$CONF['show_status']='YES';

...

$CONF['show_status_key']='YES';

...

$CONF['show_undeliverable']='YES';

...

$CONF['show_popimap']='YES';

...

$CONF['show_custom_domains']=array("domain","localhost");

$CONF['show_custom_colors']=array("lightgreen","lightblue");

...

$CONF['recipient_delimiter'] = "+";

...

$CONF['create_mailbox_subdirs']=array('Drafts', 'Sent', 'Junk', 'Trash', 'Archive');

$CONF['create_mailbox_subdirs_host']='127.0.0.1';

...

$CONF['create_mailbox_subdirs_prefix']='';

...

$CONF['new_quota_table'] = 'YES';

...

$CONF['create_mailbox_subdirs_hostport']=143;

...

$CONF['create_mailbox_subdirs_hostoptions']=array('novalidate-cert','norsh');

...

$CONF['mailbox_postcreation_script']='/etc/postfixadmin/scripts/addmail.sh';

...

$CONF['mailbox_postedit_script']='/etc/postfixadmin/scripts/editmail.sh';

...

$CONF['mailbox_postdeletion_script']='/etc/postfixadmin/scripts/delmail.sh';

...

Создаем папку /var/www/html/ssl/postfixadmin-log/ (владелец "www-data"). В ней будут сохраняться логи.

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

# nano /var/www/html/ssl/postfixadmin-log/.htaccess :

Options All Indexes
IndexOptions FancyIndexing FoldersFirst
#IndexOrderDefault Ascending Date
IndexOrderDefault Descending Date

Vacation

Автоответчик ("я в отпуске") Postfix на мой взгляд не очень удачно реализован (требует выделения домена) - сложен в настройке, и требует установки дополнительных Perl-модулей. Намного удобнее использовать автоответчик на базе Sieve в Dovecot.

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

Здесь его настройка пока не рассматривается.

Скрипты

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

Создаем папку для скриптов (владелец "www-data"):

# mkdir /etc/postfixadmin/scripts/

Создаем скрипт, автоматом выполняемый после добавления новой почты через web-интерфейс PostfixAdmin

# nano /etc/postfixadmin/scripts/addmail.sh (владелец "www-data")

#!/bin/bash

daten=`date -R`

printf "$daten \n CREATE mailbox: $1\n Domain: $2\n MailDir: $3\n Quota: $4 B\n\n" >> /var/www/html/ssl/postfixadmin-log/addmailbox.log

 

# if [[ -d /home/vmail/incron_mailuser_monitor/ ]]

# then

#     userdomain=(${1//@/ })

#     touch /home/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]}

# fi

ВАЖНО! Закомментированные строки в конце - раскомментим позже, когда будем настраивать автоматический мониторинг через incron папки "Отправленные" для каждого ящика (см. ниже).

Создаем скрипт, автоматом выполняемый после редактирования ящика через web-интерфейс PostfixAdmin

# nano /etc/postfixadmin/scripts/editmail.sh (владелец "www-data"):

#!/bin/bash

daten=`date -R`

printf "$daten \n EDIT mailbox: $1\n Domain: $2\n MailDir: $3\n Quota: $4 B\n\n" >> /var/www/html/ssl/postfixadmin-log/editmailbox.log

Создаем скрипт после удаления ящика через web-интерфейс PostfixAdmin (удаляет из RoundCube и папки* в папке почты домена)
Почтовые папки удалит incron (т.к. владелец не "www-data", а "vmail") !

# nano /etc/postfixadmin/scripts/delmail.sh (владелец "www-data"):

#!/bin/bash

daten=`date -R`

 

#del RoundCube user:

host="127.0.0.1"

user="_ROUNDCUBE_SQL_USER_ "

pass="_ROUNDCUBE_SQL_PASSWORD_"

db="_ROUNDCUBE_SQL_BASE_"

 

sql="SELECT user_id FROM users WHERE username = '$1'"

RES=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf "$daten \n DELETE mailbox: $1\n Domain: $2\n MailDir: $3\n Quota: $4 B\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

printf " >>> RoundCube SQL-query START \n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

for i in $RES; do

 

if [ "$i" != "user_id" ]; then

 

printf " ! FOUND RECORD: USER_ID = $i ! ( $1 )\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Find user_id:

printf " SQL: $sql \n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from Cache:

sql="DELETE FROM cache WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from ContactGroupMembers:

sql="DELETE FROM contactgroupmembers WHERE contactgroup_id IN (SELECT contactgroup_id FROM contactgroups WHERE user_id = $i)"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from ContactGroups:

sql="DELETE FROM contactgroups WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from Contacts:

sql="DELETE FROM contacts WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from Identities:

sql="DELETE FROM identities WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from Cache Messages

sql="DELETE FROM cache_messages WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from Cache Thread

sql="DELETE FROM cache_thread WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# Delete user from Users:

sql="DELETE FROM users WHERE user_id = $i"

RESD=`mysql --host=$host --port=3306 --user=$user --password=$pass --database=$db --execute="$sql"`

printf " SQL: $sql\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

fi

 

done

 

printf " >>> RoundCube SQL-query END \n\n" >> /var/www/html/ssl/postfixadmin-log/delmailbox.log

 

# if [[ -d /home/vmail/incron_mailuser_monitor/ ]]

# then

#     userdomain=(${1//@/ })

#     if [[ -f /home/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]} ]]

#     then

#         rm /home/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]}

#     fi

# fi

ВАЖНО! Закомментированные строки в конце - раскомментим позже, когда будем настраивать автоматический мониторинг через incron папки "Отправленные" для каждого ящика (см. ниже).

ВАЖНО! Возможно придется в скриптах откорректировать имена таблиц Postfixadmin.

PostfixAdmin запускает эти скрипты примерно так:

# /etc/postfixadmin/scripts/editmail.sh 'test@domain.tld' 'domain.tld' 'domain.tld/test/' '1073741824'

Если пробовать скрипты из консоли - надо не забывать менять пользователя, в т.ч. у лог-фалов, т.к. будет "permission denied". Если что не так - смотреть error.log Apache2.

Исправляем перекос в дизайне для таблицы списка ящиков:

# nano /usr/share/postfixadmin/templates/list-virtual.php

...
// >>> DEL MY -- start
/*
   $colspan=8;
   if ($CONF['vacation_control_admin'] == 'YES') $colspan=$colspan+1;
   if ($CONF['alias_control_admin'] == 'YES') $colspan=$colspan+1;
   if ($display_mailbox_aliases === true)              $colspan=$colspan+2;
*/
// >>> DEL MY -- end
// >>> ADD MY -- start
   $colspan=6;
	if ($CONF['show_status'] == 'YES') {$colspan++;}
	if ($display_mailbox_aliases) {$colspan++;}
	if ($CONF['quota'] == 'YES') {$colspan++;}
	if ($CONF['vacation_control_admin'] == 'YES' && $CONF['vacation'] == 'YES') {$colspan++;}
	if (( (! authentication_has_role('global-admin')) && $CONF['alias_control_admin'] == 'YES') || 
		(    authentication_has_role('global-admin')  && $CONF['alias_control'] == 'YES'))
	 {$colspan++;}
// >>> ADD MY -- end
...
   print "<table id=\"mailbox_table\">\n";
...

Смотрим что вышло в браузере (требует пароль ранее созданного суперадмина): https://domain.tld/postfixadmin/

ВАЖНО! Кодировка таблиц должна быть UTF-8 (иначе будет выдавать ошибку "temporary lookup failure").

На этом пока прервемся и установим Dovecot и Postfix.

Установка Postfix и Dovecot

Заметка с описанием подробностей настройки Postfix.

Предполагается, что "openssl" и "mysql-server" - уже установлены. Их установка здесь не рассматривается.

Удаляем Sendmail, Heirloom Mailx (nail) и другие почтовые программы, если они есть.

Удаление Heirloom Mailx (nail) может выглядеть примерно так:

# apt-get --purge remove heirloom-mailx

Если до удаления отправка письма из консоли через "mail" была успешной:

# echo `hostname` | mail -v -s `hostname` root
Mail Delivery Status Report will be mailed to <root>.

То теперь, после удаления, попытка отправить письмо из консоли через "mail" должна выдать ошибку:

# echo `hostname` | mail -v -s `hostname` root
bash: /usr/bin/mail: No such file or directory

Остальные программы удаляются аналогично.

ВАЖНО! Если ранее была почта, то имеет смысл сделать ее резервирование с предварительным экспортом в формат Maildir. Впрочем формат mbox можно будет позднее временно подключить в Dovecot и сделать копирование сообщений, поэтому для этого формата достаточно сделать только резервное копирование самой почты.

Далее установим сразу Dovecot и Postfix:
# apt-get install postfix postfix-mysql dovecot-common dovecot-imapd dovecot-lmtpd dovecot-sieve dovecot-managesieved

Предполагается, что "openssl" и "mysql-server" - уже установлены. Их установка здесь не рассматривается.

В процессе установки будут заданы вопросы - о них в следующем разделе.

Проверяем Postfix (в консоли):

# postconf -a
cyrus
dovecot

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

Postfix - конфигурационные файлы

ВАЖНО! На вопросы установки Postfix нужно хоть что-нибудь ответить, иначе могут быть проблемы с файлами конфигурации.

Ответы на вопросы установки Postfix могут быть примерно такими:

  1. General type of mail configuration — Internet Site
  2. System mail name — mail.domain.tld
  3. Root and postmaster mail recipient — postmaster@domain.tld
  4. Other destinations to accept mail for (blank for none) - оставляем пустым (все равно это перекрывается виртуальными обработчиками)
  5. Форсировать изменения? - Нет
  6. Local networks — 127.0.0.0/32
  7. Mailbox size limit — 1024000000 (1 гиг)
  8. Local address extension character — пустое поле
  9. Internet protocols to use — IPv4

Если что-то пойдет не так, можно повторить операцию командой (в консоли):

# dpkg-reconfigure postfix

Новый пользователь:

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

Сделаем копию основных конфигурационных файлов:

# mv /etc/postfix/main.cf /etc/postfix/main.cf.original
# mv /etc/postfix/master.cf /etc/postfix/master.cf.original

Создадим новые с таким содержимым

# nano /etc/postfix/master.cf :

#

# Postfix master process configuration file. For details on the format

# of the file, see the master(5) manual page (command: "man 5 master").

#

#

# ==========================================================================

# service type private unpriv chroot wakeup maxproc command + args

#                   (yes)   (yes)   (yes)   (never)   (100)

# ==========================================================================

#smtp      inet  n       -       -       -       -       smtpd

# +++ Postscreen +++

smtpd     pass  -       -       n       -       -       smtpd

smtp       inet   n       -       n       -      1       postscreen

# -o soft_bounce=yes

tlsproxy  unix   -        -       n       -      0       tlsproxy

#dnsblog   unix  -       -       n       -       0       dnsblog

#

# Remap 25 port to 587 port

submission inet n       -       -       -       -       smtpd

  -o smtpd_tls_security_level=encrypt

  -o smtpd_sasl_auth_enable=yes

  -o smtpd_sasl_type=dovecot

  -o smtpd_sasl_path=private/auth

  -o smtpd_sasl_security_options=noanonymous

  -o smtpd_sender_login_maps=mysql:/etc/postfix/mysql_virtual_maps.cf

  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

  -o smtpd_sender_restrictions=reject_sender_login_mismatch

  -o smtpd_recipient_restrictions=reject_unverified_recipient,reject_unknown_recipient_domain,reject_non_fqdn_recipient,permit_sasl_authenticated,reject

#smtps     inet  n       -       -       -       -       smtpd

#628       inet  n       -       -       -       -       qmqpd

pickup     fifo  n       -       -       60      1       pickup

cleanup   unix  n       -       -       -       0       cleanup

qmgr       fifo  n       -       n       300     1       qmgr

#qmgr      fifo  n       -       -       300     1       oqmgr

tlsmgr      unix  -       -       -       1000?   1       tlsmgr

rewrite      unix  -       -       -       -       -       trivial-rewrite

bounce     unix  -       -       -       -       0       bounce

defer         unix  -       -       -       -       0       bounce

trace         unix  -       -       -       -       0       bounce

verify         unix  -       -       -       -       1       verify

flush         unix  n       -      -       1000?     0       flush

proxymap  unix  -       -       n       -       -       proxymap

smtp       unix  -       -       -       -       -       smtp

relay       unix  -       -       -       -       -       smtp

      -o fallback_relay=

      -o smtp_helo_timeout=5 -o smtp_connect_timeout=5

showq     unix  n       -       -       -       -       showq

error       unix  -       -       -       -       -       error

discard    unix  -       -       -       -       -       discard

#local      unix  -       n       n       -       -       local

#virtual    unix  -       n       n       -       -       virtual

lmtp       unix  -       -       -       -       -       lmtp

anvil       unix  -       -       -       -       1       anvil

scache    unix  -       -       -       -       1       scache

#

# ====================================================================

# Interfaces to non-Postfix software. Be sure to examine the manual

# pages of the non-Postfix software to find out what options it wants.

#

# Many of the following services use the Postfix pipe(8) delivery

# agent. See the pipe(8) man page for information about ${recipient}

# and other message envelope options.

# ====================================================================

#

# maildrop. See the Postfix MAILDROP_README file for details.

# Also specify in main.cf: maildrop_destination_recipient_limit=1

#

maildrop  unix  -       n       n       -       -       pipe

  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}

#

# See the Postfix UUCP_README file for configuration details.

#

uucp unix -       n       n       -       -       pipe

  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)

#

# Other external delivery methods.

#

ifmail    unix  -       n       n       -       -       pipe

  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)

bsmtp     unix  -       n       n       -       -       pipe

  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient

scalemail-backend  unix  -       n       n       -       2       pipe

  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}

mailman   unix  -       n       n       -       -       pipe

  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py

  ${nexthop} ${user}

# python-postfix-policyd-spf

policyd-spf  unix  -       n       n       -       0       spawn

  user=nobody argv=/usr/bin/python /usr/bin/policyd-spf

retry       unix  -       -       -       -       -       error


# nano /etc/postfix/main.cf :

# +++ Debug:

#debug_peer_level = 2

#debug_peer_list = 127.0.0.1

#debug_peer_list = 127.0.0.1, domain.tld <<<-- ???

 

#syslog_facility = mail

 

smtpd_banner = $myhostname ESMTP

# +

# smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)

#smtpd_banner = $myhostname ESMTP ($mail_version)

 

biff = no

 

# user@host => user@host.$mydomain (default=yes)

append_dot_mydomain = no

 

# + (help doc postfix)

#readme_directory = no

 

# + mydomain

mydomain = domain.tld

 

# + myorigin (add after '@' for output)

#myorigin = /etc/mailname

#myorigin = mail.domain.tld

myorigin = $mydomain

 

myhostname = mail.domain.tld

inet_protocols = ipv4

 

# !!! Do not use $mydomain for mydestination !!!

#mydestination = $myhostname, localhost.$mydomain

mydestination = $myhostname, localhost, localhost.$mydomain

 

#mynetworks_style = subnet

mynetworks_style = host

# + mynetworks

# Trusted networks

# If this parameter apply - "mynetworks_style" ignore

mynetworks = 127.0.0.1/32

 

#inet_interfaces = 1.2.3.4

# +

#inet_interfaces = all

inet_interfaces = ip1.ip2.ip3.ip4, 127.0.0.1

 

# Replace address "user@host" => "user@$myorigin " (default: yes)

#append_at_myorigin = no

 

#masquerade_domains =

#masquerade_exceptions = root

#masquerade_classes = envelope_sender, header_sender, header_recipient

 

# +

# Authorisation - dovecot:

# smtpd_sasl_type = dovecot

#smtpd_sasl_path = private/auth

#smtpd_sasl_auth_enable = yes

 

# + relayhost (default - no relay host)

#relayhost =

 

# +

# BCC

# !!! Move to master.cf !!!

# recipient_bcc_maps = type:table

#recipient_bcc_maps = hash:/etc/postfix/recepient_bcc

#always_bcc = bccsnd@domain.tld

#receive_override_options = no_address_mappings

#sender_bcc_maps = mysql:/etc/postfix/mysql_bcc_mailbox_maps.cf

sender_bcc_maps = mysql:/etc/postfix/mysql_bcc_mailbox_maps.cf, mysql:/etc/postfix/mysql_bcc_domain_maps.cf

 

# +

# parameter specifies the directory where UNIX-style mailboxes are kept.

# default # mailbox file is /var/spool/mail/user or /var/mail/user

# mail_spool_directory =

 

# +

# For a non virtual user setup ( as when Dovecot mail_location = maildir:~/.maildir ) :

mailbox_transport = lmtp:unix:private/dovecot-lmtp

#mailbox_transport = local

 

# address MAIL FROM for probe with "verify" (default=double-bounce@$myorigin)

address_verify_sender =

 

# This uses non-persistent storage only.

# empty = disable cache

# default = btree:$data_directory/verify_cache          # ($data_directory = /var/lib/postfix)

# address_verify_map =

 

# +

#virtual_destination_recipient_limit = 1

# +

# Version Postfix > 2.9

default_destination_recipient_limit = 1

#dovecot_destination_recipient_limit = 1

 

# !!!

# not needed if the Dovecot LDA or LMTP is used

# (these options are only relevant for the Postfix LDA: "virtual"):

#virtual_mailbox_base = /var/vmail

# End symbol "/" - maildir format

#virtual_mailbox_base = /var/vmail/

#virtual_minimum_uid = 100

#virtual_uid_maps = static:5000

#virtual_gid_maps = static:5000

 

#virtual_mailbox_domains = domain.tld, domain1.tld

# virtual_mailbox_domains = $mydomain, mysql:/etc/postfix/mysql_virtual_domains.cf

# virtual_mailbox_domains = $mydomain

virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains.cf

 

# +

virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_maps.cf

 

#virtual_alias_maps = hash:/etc/postfix/virtual

# +

#virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf,mysql:/etc/postfix/mysql_virtual_alias_maps.cf

 

# +

#virtual_transport = dovecot

#virtual_transport = lmtp:unix:private/dovecot

virtual_transport = lmtp:unix:private/dovecot-lmtp

 

# Use "strict_rfc821_envelopes = no" to accept "RCPT TO:<User Name <user@example.com>>".

# Postfix will ignore the "User Name" part and deliver to the <user@example.com> address.

strict_rfc821_envelopes = yes

 

# Disable for: stops some methods used to harvest email addresses during the connection to the server.

# def: no

# disable_vrfy_command = yes

 

 

# RULES and POLICES

 

smtpd_helo_required = yes

 

# * Note

# If a remote SMTP client is authenticated, the permit_sasl_authenticated access restriction can be used to permit relay (for dovecot?) access.

 

# !!! permit_sasl_authenticated - MOVE TO master.cf for submission (587 port for MUA)

 

# reject - for all others, which do not permit

# permit - for all others, which do not reject

 

# note! Postfix no check MX. need Policy

 

smtpd_client_restrictions =

 permit_mynetworks,

 reject_unknown_client_hostname,

 permit_sasl_authenticated,

# check spam (blacklist servers)

# reject_rhsbl_client blackhole.securitysage.com, <<-- _rhsbl_ - Reject the request when the client hostname / _rbl_ - Reject the request when the reversed client network addres

# reject_rhsbl_sender blackhole.securitysage.com

# reject_rbl_client bl.spamcop.net,

# reject_rbl_client dnsbl.sorbs.net,

# reject_rbl_client zen.spamhaus.org,

# reject_rbl_client dnsbl-1.uceprotect.net

#

# reject_rbl_client zombie.dnsbl.sorbs.net,

# reject_rbl_client cbl.abuseat.org,

# reject_rbl_client multihop.dsbl.org,

# reject_rbl_client work.rsbs.express.ru,

 permit

# reject_unknown_reverse_client_hostname

# check_client_access hash:/etc/postfix/client_access

 

 

smtpd_helo_restrictions =

 permit_mynetworks,

 reject_invalid_helo_hostname,

 reject_non_fqdn_helo_hostname,

 reject_unknown_helo_hostname,

 check_helo_access hash:/etc/postfix/hello_access,

 permit

 

smtpd_sender_restrictions =

 reject_unknown_sender_domain,

 reject_non_fqdn_sender,

# reject_unverified_sender, - rejected automailers? Maybe make trust list?

 permit

 

smtpd_recipient_restrictions =

 permit_mynetworks,

 permit_sasl_authenticated,

 reject_unknown_recipient_domain,

 reject_non_fqdn_recipient,

 reject_unverified_recipient,

 reject_unauth_destination,

# postgrey:

 check_policy_service inet:127.0.0.1:10023,

# policy-spf (see master.cf):

 check_policy_service unix:private/policyd-spf,

 permit

#127.0.0.1:10023_time_limit = 180 <<-- Only for line by "master.cf"

## check_policy_service unix:public/postgrey

# check_recipient_access hash:/etc/postfix/maps/access_recipient,

 

#smtpd_policy_service_max_idle = 300

#smtpd_policy_service_max_ttl = 1000

#smtpd_policy_service_timeout = 100

command_time_limit = 240

#policyd-spf_time_limit = 3600

policyd-spf_time_limit = 180

 

# Need: install dkim-milter and sid-milter

##smtpd_milters = unix:public/dkim-filter

##non_smtpd_milters = unix:public/dkim-filter

##milter_protocol = 6

 

# DKIM + ClamAV

# OpenDkim with Milter:

milter_default_action = accept

milter_protocol = 6

#smtpd_milters = inet:localhost:8891

#non_smtpd_milters = inet:localhost:8891

smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:7357

non_smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:7357

 

# +++ Postscreen +++

#postscreen_watchdog_timeout = 10 (default: 10s)

#postscreen_cache_cleanup_interval (default: 12h)

#postscreen_cache_retention_time (default: 7d)

postscreen_cache_retention_time = 90d

postscreen_access_list = permit_mynetworks,

  cidr:/etc/postfix/postscreen_access.cidr

#postscreen_reject_footer = Postscreen Test

#postscreen_dnsbl_threshold = 2

#postscreen_dnsbl_sites = zen.spamhaus.org*2

#    bl.spamcop.net*1 b.barracudacentral.org*1

#postscreen_dnsbl_reply_map = texthash:/etc/postfix/dnsbl_reply

postscreen_cache_map = btree:$data_directory/postscreen_cache

# wait greet banner before send:

postscreen_greet_banner = Hello from $mydomain !

postscreen_greet_wait = 10s

# reject 550 and logging:

postscreen_greet_action = enforce

# wait answr after command:

postscreen_pipelining_enable = yes

# reject 550 and logging:

postscreen_pipelining_action = enforce

# non-SMTP command and header ("...: text")

postscreen_non_smtp_command_enable = yes

postscreen_forbidden_commands = CONNECT, GET, POST

# reject 550 and logging:

postscreen_non_smtp_command_action = enforce

# test end-symbols:

postscreen_bare_newline_enable = yes

# reject 550 and logging:

postscreen_bare_newline_action = enforce

 

#unknown_address_reject_code = 554

#unknown_hostname_reject_code = 554

#unknown_client_reject_code = 554

#unknown_local_recipient_reject_code = 550

#unverified_recipient_reject_code = 450

 

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

smtpd_tls_key_file=/etc/postfix/ssl.key.pem

 

# (old - "smtpd_use_tls"). Value: "no", "may" (at client), "encript" (TLS only)

# setting "smtpd_tls_security_level = encrypt" implies "smtpd_tls_auth_only = yes"

smtpd_tls_security_level = may

smtp_tls_security_level = may

smtpd_tls_ask_ccert = yes

 

smtpd_tls_loglevel = 1

smtp_tls_loglevel = 1

 

smtpd_tls_received_header = yes

smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache

#smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

#smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

 

# +

# data_directory > Postfix 2.5

# Not need - default!

#data_directory = /var/lib/postfix

 

# For local users:

alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases

 

#canonical_maps = hash:/etc/postfix/canonical

 

smtp_generic_maps = hash:/etc/postfix/aliases_smtp_output

lmtp_generic_maps = hash:/etc/postfix/aliases_lmtp

#lmtp_generic_maps = mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf,mysql:/etc/postfix/mysql_virtual_alias_maps.cf,hash:/etc/postfix/aliases_lmtp

 

# +

# after "user" before "@" extension - user+extension@domain.tld

recipient_delimiter = +

 

#local_recipient_maps = unix:passwd.byname $alias_maps

#local_recipient_maps = proxy:unix:passwd.byname $alias_maps

#local_recipient_maps =

 

#mailbox_size_limit = 0

mailbox_size_limit = 1024000000

message_size_limit = 20480000

 

# Default:

#queue_run_delay = 300s

#minimal_backoff_time = 300s

#master_service_disable =

 

#content_filter = Email content filter

queue_directory = /var/spool/postfix

 

# Mail notice (default "postmaster") :

delay_notice_recipient = postmaster@domain.tld

bounce_notice_recipient = postmaster@domain.tld

2bounce_notice_recipient = postmaster@domain.tld

error_notice_recipient = postmaster@domain.tld

reject_rbl_client - имеет смысл включать только на период спам-атак. Иначе они могут сильно навредить, поскольку сторонние сервисы: во-первых - часто ошибаются, во-вторых - замедляют работу почты и создают дополнительную нагрузку.

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

Дополнительные файлы с параметрами и данными

Заметка с описанием подробностей настройки Postfix.

Форматы таблиц данных - в основном "hash" (возможны "cidr" и др.). После создания файла формата "hash", должна быть создана база, командой postmap (см. ниже пример). Особенностью некоторых форматов является то, что после изменений необходимо перечитать (или перезагрузить) Postfix ("postfix reload"), иначе изменения не будут задействованы (зато выше скорость чтения данных).

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


Файл для правила "check_helo_access hash:/etc/postfix/hello_access" (если будет использоваться)

# nano /etc/postfix/hello_access :

mail.domain.tld REJECT Don't use my server name

domain.tld REJECT Don't use my server name

Потом в консоли:

# postmap /etc/postfix/hello_access

Тестирование может выглядеть примерно так (в консоли из внешнего сервера - после окончания всей настройки!):

# telnet mail.domain.tld 25

Trying ip1.ip2.ip3.ip4...

Connected to mail.domain.tld.

Escape character is '^]'.

220 mail.domain.tld ESMTP

 

# helo mail.domain.tld

250 mail.domain.tld

 

# mail from:<>

250 2.1.0 Ok

 

# rcpt to:<postmaster@domain.tld>

554 5.7.1 <mail.domain.tld>: Helo command rejected: Don't use my server name

 

# quit

221 2.0.0 Bye


Файл для правила "check_client_access hash:/etc/postfix/client_access" (если будет использоваться)

# nano /etc/postfix/client_access :

ip.ip.ip.ip ПРАВИЛО

ВАЖНО! - необходимо заменить "ip.ip.ip.ip" и "ПРАВИЛО" на те для которых это будет выполняться (например "1.2.3.4 REJECT").

Потом в консоли:

# postmap /etc/postfix/client_access


Аналогично, если это будет использоваться, необходимо создать файлы и базы (таблицы) для правил:

  • "check_recipient_access hash:/etc/postfix/maps/access_recipient" - список получателей и правил для них (можно отсекать прием для ящика рассылки)
  • "canonical_maps = hash:/etc/postfix/canonical" - см. описание в соответствующем разделе в заметке.
  • "smtp_generic_maps = hash:/etc/postfix/aliases_smtp_output" - см. описание в соответствующем разделе в заметке.
  • "lmtp_generic_maps = hash:/etc/postfix/aliases_lmtp" - см. описание в соответствующем разделе в заметке.

ВАЖНО! Для вышеперечисленных файлов обязательно завершающее создание базы для каждого командой: postmap ...


Файлы для правил:

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

- создаются следующим образом (см. описание в соответствующем разделе в заметке):

# nano /etc/aliases :

Получатель: Новый_получатель

ВАЖНО! - необходимо заменить "Получатель" и "Новый_получатель" на те для которых это будет выполняться
(например "www-data: postmaster@domain.tld").

ВАЖНО! - двоеточие обязательно!

Потом в консоли:

# newaliases
"postmap /etc/aliases" - здесь НЕ подходит!


Файл для правила "postscreen_access_list permit_mynetworks, cidr:/etc/postfix/postscreen_access.cidr" (если будет использоваться специальный список доступа для Postscreen)

# nano /etc/postfix/postscreen_access.cidr :

ip.ip.ip.ip ПРАВИЛО

ВАЖНО! - необходимо заменить "ip.ip.ip.ip" и "ПРАВИЛО" на те для которых это будет выполняться (например "1.2.3.4/32 permit").
Этот формат не требует никаких последующих действий для создания базы.


ВАЖНО! Некоторые файлы могут быть пустыми, но они должны быть созданы!

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

# postfix reload


Создадим файлы, хранящие SQL-запросы, проверяя имена таблиц и полей (в очередной версии PostfixAdmin они могут измениться - был прецедент)

# nano /etc/postfix/mysql_virtual_domains.cf :

user = _POSTFIXADMIN_SQL_USER_

password = _POSTFIXADMIN_SQL_PASSWORD_

hosts = 127.0.0.1

dbname = _POSTFIXADMIN_SQL_BASE_

query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1'

# nano /etc/postfix/mysql_virtual_maps.cf :

user = _POSTFIXADMIN_SQL_USER_

password = _POSTFIXADMIN_SQL_PASSWORD_

hosts = 127.0.0.1

dbname = _POSTFIXADMIN_SQL_BASE_

query = SELECT username FROM mailbox WHERE username='%s' AND active = '1'

Запрос для авто-BCC ящика зарегистрированного пользователя

# nano /etc/postfix/mysql_bcc_mailbox_maps.cf :

user = _POSTFIXADMIN_SQL_USER_

password = _POSTFIXADMIN_SQL_PASSWORD_

hosts = 127.0.0.1

dbname = _POSTFIXADMIN_SQL_BASE_

query = SELECT CONCAT('%u', '+bccflag', '@', '%d') FROM mailbox WHERE username='%s' AND active = '1'

Запрос ящика для авто-BCC не зарегистрированных пользователей родного домена

# nano /etc/postfix/mysql_bcc_domain_maps.cf :

user = _POSTFIXADMIN_SQL_USER_

password = _POSTFIXADMIN_SQL_PASSWORD_

hosts = 127.0.0.1

dbname = _POSTFIXADMIN_SQL_BASE_

query = SELECT bccsnd+bccflag@domain.tld' FROM domain WHERE domain='%d' AND active = '1'

См. заметку про использование BCC.

eMail-алиасы

# nano /etc/postfix/mysql_virtual_alias_maps.cf :

user = _POSTFIXADMIN_SQL_USER_

password = _POSTFIXADMIN_SQL_PASSWORD_

hosts = 127.0.0.1

dbname = _POSTFIXADMIN_SQL_BASE_

query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Доменные алиасы

# nano /etc/postfix/mysql_virtual_alias_domain_maps.cf :

user = _POSTFIXADMIN_SQL_USER_

password = _POSTFIXADMIN_SQL_PASSWORD_

hosts = 127.0.0.1

dbname = _POSTFIXADMIN_SQL_BASE_

query = SELECT CONCAT('%u', '@', target_domain) FROM alias_domain WHERE alias_domain = '%d' AND active = 1

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

# chgrp postfix /etc/postfix/*.cf

# chmod u=rw,g=r,o= /etc/postfix/*.cf

ВАЖНО! Здесь параметр hosts надо указывать тот же, что указан в "my.cnf" MySQL (bind-address)!

Применим все изменения:

# service postfix restart

Первые данные

Теперь вернемся к Posfixadmin и внесем первые данные через его web-интерфейс по адресу: https://domain.tld/postfixadmin/

  1. Внесем свой новый домен - domain.tld
  2. Временно внесем еще один тестовый домен - test.com (его потом надо будет удалить !!!)
  3. Алиас ДЛЯ домена domain.tld - вся почта домена test.com перенаправляется на domain.tld
  4. Создаем ящик - postmaster@domain.tld
  5. Превращаем ящик postmaster@domain.tld в алиас для test@domain.tld (этот ящик заводить не нужно - достаточно вписать его, как целевой для ящика-алиаса postmaster@domain.tld).
  6. Обязательно (!) создаем ящик - bccsnd@domain.tld

* Тут важно не запутаться. В редактировании домена создется алиас ДЛЯ редактируемого домена, а в редактировании ящика - уже сам редактируемый ящик превращается в алиас для перечисленных.

** Кстати при создании ящика обязательно надо слать приветственное письмо, т.к. за создание папки отвечает Dovecot (Posfix вообще к этим папкам не имеет доступа - любой физический доступ осуществляется ЧЕРЕЗ Dovecot).

*** Аутентификация будет происходить очень интересно. Наличие/отсутствие имен ящиков, Postfix будет проверять сам в таблицах PostfixAdmin. Пароли Postfix в своих таблицах запрашивать не будет - они будут проверяться средствами Dovecot, но... в таблицах PostfixAdmin. :)

Проверка

Домен:

# postmap -q domain.tld mysql:/etc/postfix/mysql_virtual_domains.cf (должно вернуть domain.tld)

Юзер@домен найден:

# postmap -q postmaster@domain.tld mysql:/etc/postfix/mysql_virtual_maps.cf (должно вернуть postmaster@domain.tld)

BCC - Юзер@домен найден:

# postmap -q postmaster@domain.tld mysql:/etc/postfix/mysql_bcc_mailbox_maps.cf (должно вернуть postmaster+bccflag@domain.tld)

BCC - Юзер@домен НЕ найден:

# postmap -q aaaaaaa@domain.tld mysql:/etc/postfix/mysql_bcc_mailbox_maps.cf (пусто)

BCC - домен найден:

# postmap -q aaaaaaa@domain.tld mysql:/etc/postfix/mysql_bcc_domain_maps.cf (должно вернуть bccsnd+bccflag@domain.tld)

BCC - Юзер@домен НЕ найден:

# postmap -q aaaaaaa@another.com mysql:/etc/postfix/mysql_bcc_domain_maps.cf (пусто)

Для ящика-алиаса:
* вернет список ящиков для пересылки (рассылки) для ящика X - список может содержать любые валидные (домены ящиков проверяется через DNS) имена (напр ***@gmail.com)!

# postmap -q postmaster@domain.tld mysql:/etc/postfix/mysql_virtual_alias_maps.cf (должно вернуть 'test@domain.tld')

Для домена-алиаса:
В данном экзотическом варианте - вернет список рассылки ящика-алиаса, ДЛЯ которого запрашиваемый ящик является алиасом.
* К алиас-домену привязываются имена ВСЕХ ящиков основного домена, но ТОЛЬКО те, что есть в основном домене.
# postmap -q postmaster@test.com mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf (должно вернуть 'test@domain.tld')

См. также заметку про использование BCC.

Postgrey

Проверка настойчивости входящих.

Заметка с описанием подробностей настройки Postgrey.

Установка (в консоли):

# apt-get install postgrey

/etc/postgrey/whitelist_clients - белый список клиентов.

/etc/postgrey/whitelist_recipients - белый список получателей.

Настройка Postgrey в Postfix - в файле "/etc/postfix/main.cf" (см. выше).

Строки оттуда (продублировано - повтор):

...

smtpd_recipient_restrictions = ...,

 ...,

 check_policy_service inet:127.0.0.1:10023

...

Базы будут здесь:
/var/lib/postgrey

Настраиваем сам Postgrey

# nano /etc/default/postgrey :

...

POSTGREY_OPTS="--inet=10023 --delay=200 --max-age=40 --auto-whitelist-clients=4"

...

200 сек отказывать новичкам (по умолчанию 300 сек),
40 дней без обновления хранить информацию о них в белом листе (по умолчанию 35 дней),
4 раза принимать письма с проверкой, после чего автоматом добавлять в белый лист.

Применить изменения (в консоли):

# service postgrey restart

Получение отчета из лога о текущих "отказниках" (в консоли):

# cat /var/log/mail.log | postgreyreport --nosingle_line --check_sender=mx,a --show_tries --separate_by_subnet=":-----------------------\n"

Postscreen

Детектор и блокировщик почтовых зомби-ботов.

Заметка с описанием подробностей настройки Postscreen.

Раздел в еще одной заметке.

Postscreen не нуждается в отдельной установке, поскольку является частью Postfix с версии 2.8.

Настройка в конфигах "/etc/postfix/master.cf" и "/etc/postfix/main.cf" - см. выше.

Там же - описание "/etc/postfix/postscreen_access.cidr" для параметра postscreen_access_list в файле "/etc/postfix/main.cf".

Policyd-SPF

SPF - это TXT-запись в DNS, в которой, в простейшем варианте должен быть указан IP сервера, которому разрешено отправлять почту.

Описание того как это должно выглядеть в DNS см. выше.

Заметка с описанием SPF.

Соответственно, Policyd-SPF - это проверка для входящих писем на наличие такой записи. Результат этой проверки дописывается в заголовок письма. В дальнейшем это можно использовать для подсчета оценки вероятности спама или просто наблюдать результат в почтовом клиенте (при наличии такой возможности у него).

Есть разные реализации, - здесь использован скрипт на Python.

Установка (в консоли):

# apt-get install postfix-policyd-spf-python

Настройка в конфигах "/etc/postfix/master.cf" и "/etc/postfix/main.cf" - см. выше.

Кроме того в файле

/etc/postfix-policyd-spf-python/policyd-spf.conf :

# For a fully commented sample config file see policyd-spf.conf.commented

 

debugLevel = 0

defaultSeedOnly = 0

 

#HELO_reject = SPF_Not_Pass

HELO_reject = False

#Mail_From_reject = Fail

Mail_From_reject = False

 

PermError_reject = False

TempError_Defer = False

 

#skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0//104,::1//128

skip_addresses = 127.0.0.1/32

В консоли:

# service postfix reload

Проверка:

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

...

Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=1.2.3.4; helo=mail.outside.tld; envelope-from=xxxxx@outside.tld; receiver=postmaster@domain.tld

...

OpenDKIM

Заметка с описанием DKIM.

О настройке DKIM в DNS см. выше.

Установка (в консоли):

# apt-get install opendkim opendkim-tools
(установит в т.ч. библиотеку libmilter)

Создадим папки (консоль):

# mkdir -pv /etc/opendkim/mail/

# chown -Rv opendkim:opendkim /etc/opendkim

# chmod go-rwx /etc/opendkim/*

# cd /etc/opendkim/mail/

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

# nano /etc/opendkim/mail/opendkimhosts :

127.0.0.1

localhost

domain

# Your IP addresses (one per line)

ip1.ip2.ip3.ip4

#Your hostnames (one per line)

domain.tld

Сгенерируем ключи:

# opendkim-genkey -D /etc/opendkim/mail/ -b 1024 -d domain.tld -s mail
-r - означает, что только для почты
-s - селектор

Права (в консоли):

# cd /etc/opendkim/mail/

# chown opendkim:opendkim *

# chmod u=rw,go-rwx *

Конфигурируем OpenDKIM

# nano /etc/opendkim.conf

Всё комментим и добавляем:

...

Domain domain.tld

KeyFile /etc/opendkim/mail/mail.private

Selector mail

InternalHosts /etc/opendkim/mail/opendkimhosts

ExternalIgnoreList /etc/opendkim/mail/opendkimhosts

AutoRestart yes

Background yes

Canonicalization simple

DNSTimeout 5

Mode sv

SignatureAlgorithm rsa-sha256

SubDomains yes

#UseASPDiscard no

#Version rfc4871

Конфигурируем порт

# nano /etc/default/opendkim

Всё комментим и добавляем:

...

SOCKET="inet:8891@localhost"

Настройки DKIM в Postfix - в файле "/etc/postfix/main.cf" (см. выше).

Строки оттуда (продублировано - повтор):

...

milter_default_action = accept

milter_protocol = 2

smtpd_milters = inet:localhost:8891

non_smtpd_milters = inet:localhost:8891

...

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

Открытый ключ (сгенерированный ранее) должен быть здесь:

/etc/opendkim/mail/mail.txt

Копируем его в DNS (см. выше как). Там же создаем TXT-запись о политике использования DKIM в домене.

ВАЖНО! Ключ в DNS должен быть указан одной длинной строкой. Добавляется только то, что в кавычках - вместе с кавычками.

Рестарт (в консоли):

# /etc/init.d/opendkim restart

# service postfix restart

ClamAV-Milter

Заметка с описанием подробностей настройки ClamAV.

Будет подключен через Milter-протокол.

Устновка:

# apt-get install clamav-milter

Базы должны быть здесь:

/var/lib/clamav

Доки здесь (и примеры):

/usr/share/doc/clamav/

/usr/share/doc/clamav-base/

/usr/share/doc/clamav-daemon/

/usr/share/doc/clamav-freshclam/

/usr/share/doc/clamav-milter/

Установятся также пакеты: clamav, clamav-base, clamav-daemon, clamav-freshclam, libclamav6, libtommath0.
Предложенные дополнительно пакеты: clamav-docs, daemon, libclamunrar6.

После установки пишет про три фейла:

[FAIL] Clamav signatures not found in /var/lib/clamav ... failed!

[FAIL] Please retrieve them using freshclam ... failed!

[FAIL] Then run '/etc/init.d/clamav-daemon start' ... failed!

Это по-видимому потому, что не было баз.
Как только они обновились демон стартовал успешно (в консоли):

# /etc/init.d/clamav-daemon start

Логи будут здесь:

/var/log/clamav/

"clamav-milter.log" - не должен содержать ошибок конфигурации и предупреждений. В нем будет записываться информация о письмах, в которых обнаружены вирусы.
"clamav.log" - логиирует рестарты и обновление баз (одной строкой) + краткая информация об обнаруженных вирусах.
"freshclam.log" - логгирует обновление баз.

Можно сохранить оригинальные файлы конфигурации:

# cp /etc/clamav/clamav-milter.conf /etc/clamav/clamav-milter.cong.original

# cp /etc/clamav/clamd.conf /etc/clamav/clamd.cong.original

# cp /etc/clamav/freshclam.conf /etc/clamav/freshclam.cong.original

Запускаем скрипт автонастройки:

# dpkg-reconfigure clamav-milter

Ответы на вопросы могут быть такими:

  1. Handle the configuration file automaticaly? - Yes
  2. User tu run clamav-milter as: - clamav
  3. Groups for clamav-milter (space-separated): - (ничего - просто Enter)
  4. Communications interface with Sendmail - inet:7357@127.0.0.1
  5. Group owner of clamav-milter local (UNIX) socket: - clamav
  6. Creation mode for clamav-milter local (UNIX) socket: - 600
  7. Remove stale socket after unclean shutdown - Yes
  8. Wait timeout for data coming from clamd - 120 (можно увеличить, например до 240)
  9. Should clamav-milter stay in foreground (not forking)? - No
  10. Chroot to directory - (ничего - просто Enter)
  11. Pid file (оставляем как есть) - /var/run/clamav/clamav-milter.pid
  12. Temporary directory path (предлагает "/tmp") - очищаем предложенное и Enter. Будет используется $TEMPDIR или $TEMP.
  13. Clamav socket to connect to for scanning: - unix:/var/run/clamav/clamd.ctl
  14. Host excludes for scanning: - хосты, которые исключить из сканирования. Если оставить пустым, то вся почта будет сканироваться, - оставляем пустым.
  15. Mail address whitelist: - пусто
  16. Action to perform on infected messages (что делать если найдено зараженное письмо): - Reject (550)
  17. Action to perform on error conditions (если ошибка: таймаут, ошибка сканера, нарушение структуры данных и т.п.) - Reject
  18. Specific rejection reason for infected messages (сообщение для ответа на зараженное письмо): Virus detected: "%v". Mail delivery error (reject from virus scanner).
  19. Add headers to processed messages? - Add
  20. Log-file for clamav-milter: - /var/log/clamav/clamav-milter.log
  21. Disable log file locking? - Yes
  22. Maximum size of the log file (MB) - 50
  23. Log time with each message? - Yes
  24. Use system logger? - No
  25. Type of the syslog messages - LOG_LOCAL6
  26. Enable verbose logging? (подробное логгирование) - No
  27. Information to log on infected messages - Full
  28. Information to log if no threat is found - Off
  29. Size limit for scanned messages (MB) - 25

Подредактируем некоторые строки в файлах конфигурации.

/etc/clamav/clamd.conf :

...

LocalSocket /var/run/clamav/clamd.ctl

...

#LocalSocketMode 666

LocalSocketMode 600

...

Сокет в указанном выше файле должен совпадать с тем, что указан в файле

/etc/clamav/clamav-milter.conf :

...

ClamdSocket unix:/var/run/clamav/clamd.ctl

...

Настройка обновлений баз данных вирусов

/etc/clamav/freshclam.conf :

...

LogFileMaxSize 10M

Checks 4

...

LogFileMaxSize 10M - Максимальный размер лога обновления баз 10 MB (а зачем больше?), т.к. "0", по умолчанию - без ограничения.
Checks 4 - количество проверок обновлений базы, в день. Слишком часто по-видимому бессмысленно.

Изменяем размер лога (поскольку "0" - без ограничения)

/etc/clamav/clamd.conf :

...

#LogFileMaxSize 0

LogFileMaxSize 20M

...

Необходимо также всё закомментить в файле:
/etc/default/clamav-milter

Рестарт (в консоли):

# /etc/init.d/clamav-milter restart

или так:

# service clamav-milter restart

Проверка (в консоли):

# sockstat -l

...

clamav   clamav-milter        ...     tcp4   127.0.0.1:7357       *:*       LISTEN

...

(должна присутствовать указанная строка)

В конфигурационном файле Postfix /etc/postfix/main.cf (см. выше), необходимо добавить через запятую к параметрам smtpd_milters и non_smtpd_milters значения, касющиеся ClamAV.

Строки оттуда (продублировано - повтор):

...

smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:7357

non_smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:7357

...

Здесь ранее было только значение "inet:127.0.0.1:8891", касающееся DKIM. А теперь добавилось "inet:127.0.0.1:7357".

В письме присланном снаружи должны присутствовать строки заголовка подобные следующим:

...

X-Virus-Status: Clean

X-Virus-Scanned: clamav-milter 0.97.8 at domain

...

Кроме того не должно быть испорчено "DKIM pass" и "SPF pass"

Тоже самое должно быть (появиться) в письме отосланном наружу.

Чтобы проверить работу антивируса, нужно послать себе письмо, содержащее тестовый вирус EICAR-Test-File. Этот вирус, на самом деле не является вирусом, а предназначен для проверки антивирусных программ и является тестовой строкой, которую можно скопировать в письмо, либо в файл, вложенный в письмо. Информации о нем достаточно много в Интернет.

Dovecot - конфигурационные файлы

См. заметку по теме.

Dovecot уже был установлен ранее - одновременно с Postfix (см. выше). Здесь будет рассмотрена только настройка конфигурационных файлов.

Если в консоли ввести:

# doveconf

то получим все текущие настройки.

Можно использовать что-то вроде:

# doveconf | grep mail_

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

ВАЖНО! Все неуказанные параметры ниже необходимо удалить или закомментировать. Некоторые незадействованные параметры оставлены закомментированными, поскольку они могут быть полезны в дальнейшем.

Автозагрузка должна быть включена в файле

/etc/default/dovecot :

...

ENABLED=1

...

Dovecot будет слушать только 143 (IMAP) порт и только на локалхосте (127.0.0.1).

На этот порт будет подключаться MUA - RoundCube. Наружу используется 25 порт (Postfix). При этом для отправки писем RoundCube использует другой порт - 587 (Postfix).


Протоколы

Можно удалить неиспользуемые протоколы из каталога:

/usr/share/dovecot/protocols.d/

А можно сделать так:

/etc/dovecot/dovecot.conf :

#!include_try /usr/share/dovecot/protocols.d/*.protocol

protocols = imap lmtp sieve

...

!include conf.d/*.conf

...


Все файлы конфигурации.

/etc/dovecot/dovecot.conf :

# Enable installed protocols
#!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp sieve

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

!include conf.d/*.conf
#!include_try local.conf


/etc/dovecot/conf.d/10-auth.conf :

# Connect only after start SSL/TLS
# If not local network only !
disable_plaintext_auth = yes
auth_cache_size = 1M
auth_cache_negative_ttl = 0
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
auth_master_user_separator = *
auth_mechanisms = plain

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


/etc/dovecot/conf.d/10-director.conf :

service director {
  unix_listener login/director {
    #mode = 0666
  }
  fifo_listener login/proxy-notify {
    #mode = 0666
  }
  unix_listener director-userdb {
    #mode = 0600
  }
  inet_listener {
    #port = 
  }
}
# Enable director for the wanted login services by telling them to
# connect to director socket instead of the default login socket:
service imap-login {
  #executable = imap-login director
}
#service pop3-login {
  #executable = pop3-login director
#}
# Enable director for LMTP proxying:
protocol lmtp {
  #auth_socket_path = director-userdb
}

/etc/dovecot/conf.d/10-logging.conf :

# Log file to use for error messages. "syslog" logs to syslog,
# /dev/stderr logs to stderr.
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
auth_verbose = no
auth_verbose_passwords = no
auth_debug = no
auth_debug_passwords = no
mail_debug = no
verbose_ssl = no
#plugin {
#}
#log_timestamp = "%b %d %H:%M:%S "
#login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c
#login_log_format = %$: %s
#mail_log_prefix = "%s(%u): "
# Format to use for logging mail deliveries. You can use variables:
#  %$ - Delivery status message (e.g. "saved to INBOX")
#  %m - Message-ID
#  %s - Subject
#  %f - From address
#  %p - Physical size
#  %w - Virtual size
#deliver_log_format = msgid=%m: %$

Здесь может понадобиться изменить права (только при необходимости) для /var/log/dovecot.log на 666.

Информацию об ошибках и прочих событиях следует искать так же в следующих лог-файлах:

/var/log/dovecot.log

/var/log/mail.log

/var/log/mail.err

/var/log/mail.warn

/var/log/mail.info


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

Для этого отредактируем файл:
/etc/rsyslog.conf

Добавим в конец файла

...
# Add
# Postfix + Dovecot
local1.*                          -/var/log/dovecot.log
local1.info                       -/var/log/dovecot.info
local1.warn                       -/var/log/dovecot.warn
local1.err                        -/var/log/dovecot.err
:msg,contains,"stored mail into mailbox"	-/var/log/dovecot.lmtp

Файлы

"/var/log/mail.log" и "/var/log/mail.info" - дублируют друг друга

Комментируем один из них (в том же конфиге):

...
#mail.info                      -/var/log/mail.info
...

Отключение логгирования почтовых событий в syslog (тот же конфиг):

...
#*.*;auth,authpriv.none         -/var/log/syslog
*.*;auth,authpriv,mail.none                -/var/log/syslog
...

После этого в консоли:

# service rsyslog restart

Создадим скрипт ротации логов

# nano /etc/logrotate.d/dovecot :

/var/log/dovecot.log
/var/log/dovecot.info
/var/log/dovecot.warn
/var/log/dovecot.err
/var/log/dovecot.lmtp
{
        weekly
        rotate 52
        missingok
        notifempty
        compress
        delaycompress
        create 640 root root
        sharedscripts
        postrotate
        /bin/kill -USR1 'cat /var/run/dovecot/master.pid 2>/dev/null' 2>/dev/null || true
        endscript
}

Владелец этого скрипта должен быть "root", права 644.


В следующем конфиге ("10-mail.conf") присутствует namespace virt, для которого плагин virtual должен быть включен в трех конфигах:

  • 20-imap.conf
  • 20-lmtp.conf
  • 15-lda.conf
  • 20-managesieve.conf

ВАЖНО! В конфигах "15-lda.conf" и "20-managesieve.conf" включение плагинов должно быть без дублирования уже включенных: mail_plugins = ... virtual, а в остальных - с дублированием: mail_plugins = $mail_plugins ... virtual

В конфиге "10-mail.conf" строка "location = " для "namespace virt" настраивает плагин так, что каталог с правилами будет общий для всех пользователей, а индексные каталоги - у каждого свои.

Но сначала создадим необходимые каталоги (в консоли):

# mkdir /var/lib/dovecot/virtual

# mkdir /var/lib/dovecot/virtual/Folder1

# chown -hR vmail:vmail /var/lib/dovecot/virtual

# chmod -R 700 /var/lib/dovecot/virtual

ВАЖНО! В дальнейшем для всех подпапок внутри /var/lib/dovecot/virtual нужно будет так же изменять владельца и права!

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

Файл с фильтрами для виртуального каталога может выглядеть так (для виртуальной папки Folder1):

# nano /var/lib/dovecot/virtual/Folder1/dovecot-virtual

virtual/Folder1

  inthread refs x-mailbox INBOX

Подробнее об этом - см. соответствующий раздел заметки.

Продолжим.

/etc/dovecot/conf.d/10-mail.conf :

mail_location = maildir:/home/vmail/%d/%n:INBOX=/home/vmail/%d/%n

namespace virt {

#  type = private

  prefix = virtual/

  separator = /

  location = virtual:/var/lib/dovecot/virtual:INDEX=/home/vmail/%d/%n/virtual_index:CONTROL=/home/vmail/%d/%n/virtual_index

  inbox = no

  hidden = yes

  list = yes

  subscriptions = yes

  #mailbox Folder1 {

  #  auto=subscribe

  #}

}

namespace allusers {

  type = public

  separator = /

  prefix = "allmail/%d/"

  location = maildir:/home/vmail/%d:LAYOUT=fs:INDEX=/home/vmail/%d/%n/allmail_index

  inbox = no

  hidden = yes

  list = yes

  subscriptions = no

}

namespace system_users {

  type = private

  separator = /

  prefix = "system_users/"

  location = mbox:/var/mail/:INDEX=/home/vmail/system_users_index

  inbox = no

  hidden = yes

  list = yes

  subscriptions = yes

}

namespace inbox {

  type = private

  separator = /

  prefix =

  inbox = yes

  hidden = no

  list = yes

  subscriptions = yes

}

mail_uid = 5000

mail_gid = 5000

#mail_nfs_storage = no

#mail_nfs_index = no

#first_valid_uid = 500

#last_valid_uid = 0

#first_valid_gid = 1

#last_valid_gid = 0

#mail_attachment_dir =

#mail_attachment_min_size = 128k

#mail_attachment_fs = sis posix

# Hash format to use in attachment filenames. You can add any text and

# variables: %{md4}, %{md5}, %{sha1}, %{sha256}, %{sha512}, %{size}.

# Variables can be truncated, e.g. %{sha256:80} returns only first 80 bits

#mail_attachment_hash = %{sha1}

* Чтобы читать почту системных юзеров (namespace system_users) надо дать разрешение на папку "/var/mail/" и на файл каждого пользователя - чтение и запись для всех


/etc/dovecot/conf.d/10-master.conf :

#default_process_limit = 100

#default_client_limit = 1000

#default_vsz_limit = 256M

#default_login_user = dovenull

#default_internal_user = dovecot

service imap-login {

  inet_listener imap {

   address = 127.0.0.1

   port = 143

   #ssl = yes

  }

  inet_listener imaps {

   #port = 993

   port = 0

   #ssl = yes

  }

  #service_count = 1

  #process_min_avail = 0

  #vsz_limit = $default_vsz_limit

}

#service pop3-login {

  #inet_listener pop3 {

   #port = 110

  #}

  #inet_listener pop3s {

   #port = 995

   #ssl = yes

  #}

#}

service lmtp {

  unix_listener lmtp {

  path = /var/spool/postfix/private/dovecot-lmtp

  group = postfix

  mode = 0660

  user = postfix

  ##mode = 0666

  }

 #unix_listener /var/spool/postfix/private/dovecot-lmtp {

 #  group = postfix

 #  mode = 0660

 #  user = postfix

 # }

# process_min_avail = 5

  executable = lmtp -L

}

 

service imap {

  #vsz_limit = $default_vsz_limit

  # Max. number of IMAP processes (connections)

  #process_limit = 1024

  #executable = imap

}

 

#service pop3 {

  # Max. number of POP3 processes (connections)

  #process_limit = 1024

#}

service auth {

  unix_listener auth {

   path = /var/spool/postfix/private/auth

   mode = 0660

   user = postfix

   group = postfix

  }

  user = $default_internal_user

}

 

service auth-worker {

  user = $default_internal_user

}

 

# Detail Process title in ps

#verbose_proctitle = yes

 

#service dict {

  #unix_listener dict {

  #}

#}


/etc/dovecot/conf.d/10-ssl.conf :

#ssl = yes

ssl = required

ssl_cert = </etc/dovecot/ssl.cert.pem

ssl_key = </etc/dovecot/ssl.key.pem

#ssl_key_password =
#ssl_ca =

#ssl_require_crl = yes

#ssl_verify_client_cert = no

#auth_ssl_username_from_cert=yes.

#ssl_cert_username_field = commonName

#ssl_parameters_regenerate = 168

ssl_parameters_regenerate = 0

ssl_protocols = !SSLv2

#ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

#ssl_crypto_device =


/etc/dovecot/conf.d/10-tcpwrapper.conf :

# service name for hosts.{allow|deny} are those defined as

# inet_listener in master.conf

#

#login_access_sockets = tcpwrap

#

#service tcpwrap {

#  unix_listener login/tcpwrap {

#    group = $default_login_user

#    mode = 0600

#    user = $default_login_user

#  }

#}


/etc/dovecot/conf.d/15-lda.conf :

postmaster_address = postmaster@domain.tld

hostname = domain.tld

#quota_full_tempfail = no

#sendmail_path = /usr/sbin/sendmail

#submission_host =

#rejection_subject = Rejected: %s

#  %n = CRLF, %r = reason, %s = original subject, %t = recipient

rejection_reason = Your message to <%t> was automatically rejected:%n%r

#recipient_delimiter = +

#lda_original_recipient_header =

#lda_mailbox_autocreate = no

#lda_mailbox_autosubscribe = no

protocol lda {

  mail_plugins = sieve virtual

#  log_path = /var/log/mail-dovecot-lda-errors.log

#  info_log_path = /var/log/mail-dovecot-lda.log

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

#  auth_socket_path = auth-userdb

#  global_script_path = /var/lib/dovecot/sieve/global/globalsieverc

}


Отключим следующий конфиг, поскольку он не используется (в консоли):

# mv /etc/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf_


Продолжим.

/etc/dovecot/conf.d/20-imap.conf :

protocol imap {

  mail_plugins = $mail_plugins imap_acl imap_quota mail_log notify acl quota virtual

  ssl_cert = </etc/dovecot/ssl.cert.pem

  ssl_key = </etc/dovecot/ssl.key.pem

  info_log_path = /var/log/dovecot-imap.log

  #imap_max_line_length = 64k

  #mail_max_userip_connections = 10

  # IMAP logout format string:

  # %i - total number of bytes read from client

  # %o - total number of bytes sent to client

  #imap_logout_format = bytes=%i/%o

  #imap_capability =

  #imap_idle_notify_interval = 2 mins

  #imap_id_send =

  #imap_id_log =

  # Workarounds for various client bugs:

  # delay-newmail:

  # tb-extra-mailbox-sep:

  # tb-lsub-flags:

  # The list is space-separated.

  #imap_client_workarounds =

}


/etc/dovecot/conf.d/20-lmtp.conf :

#lmtp_proxy = no

#lmtp_save_to_detail_mailbox = no

protocol lmtp {

  mail_plugins = $mail_plugins quota sieve virtual

  postmaster_address = postmaster@domain.tld

  #info_log_path = /var/log/dovecot-lmtp.log

}


/etc/dovecot/conf.d/20-managesieve.conf :

service managesieve-login {

  inet_listener sieve {

    address = 127.0.0.1

    port = 4190

  }

  service_count = 1

  #process_min_avail = 0

  vsz_limit = 64M

}

 

#service managesieve {

  # Max. number of ManageSieve processes (connections)

  #process_count = 1024

#}

 

mail_plugins = virtual

protocol sieve {

  #managesieve_max_line_length = 65536

  #mail_max_userip_connections = 10

  #mail_plugins = virtual

  # MANAGESIEVE logout format string:

  #  %i - total number of bytes read from client

  #  %o - total number of bytes sent to client

  #managesieve_logout_format = bytes=%i/%o

  #managesieve_implementation_string = Dovecot Pigeonhole

  #managesieve_sieve_capability =

  #managesieve_notify_capability =

  #managesieve_max_compile_errors = 5

}


ACL

См. заметку по теме.

/etc/dovecot/conf.d/90-acl.conf :

plugin {

  #acl = vfile:/etc/dovecot/acl/%d:cache_secs=300

  acl = vfile:/etc/dovecot/acl/%d

}

plugin {

  #acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes

}

Здесь "%d" - папка, совпадающая с доменным именем.
Чуть ниже - пара примеров настройки ACL для всех пользователей.

Следующая настройка запрещает пользователю всё, кроме чтения/просмотра/удаления, но разрешает сохранение для LDA.
В каталоге с именем домена указываем ACL для папки ".Sent".

# nano /etc/dovecot/acl/domain.tld/Sent :

owner lrwstpei

Аналогично можно настроить остальные папки (подробности - в заметке по ссылке чуть выше).

Закрываем доступ для всех кроме LDA к файлу ".dovecot.lda-dupes", который может быть виден в MUA как фантомная папка "lda-dupes":

# mkdir /etc/dovecot/acl/domain.tld/dovecot/

ВАЖНО! - точка воспринимается как маркер вложенной папки.

# nano /etc/dovecot/acl/domain.tld/dovecot/lda-dupes :

anyone rp


Продолжим.

/etc/dovecot/conf.d/90-plugin.conf :

plugin {

# mail_plugins = $mail_plugins mail_log notify acl quota

# For Plugin mail_log:

  mail_log_events = copy

  mail_log_fields = uid box msgid size

}


/etc/dovecot/conf.d/90-quota.conf :

plugin {

  quota = dict:user::file:/home/vmail/%d/%n/dovecot-quota

  quota_rule = *:storage=1GB

  quota_rule2 = Trash:storage=+10%%

}

# Note that % needs to be escaped as %%, otherwise "% " expands to empty.

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 = dovecot

#  unix_listener quota-warning {

#    user = vmail

#  }

#}

plugin {

  #quota = dirsize:User quota

  #quota = maildir:User quota

  #quota = dict:User quota::proxy::quota

  #quota = fs:User quota

}

plugin {

  #quota = dict:user::proxy::quota

  #quota2 = dict:domain:%d:proxy::quota_domain

  #quota_rule = *:storage=102400

  #quota2_rule = *:storage=1048576

}

Здесь указана квота для пользователя 1 ГБ, а для Корзины - 10 процентов от общей квоты.


Sieve

См. заметку по теме.

Конфиг для managesieve - см. выше.

Все глобальные скрипты и конфигурационные файлы будут находится в соответствующих папках в: /var/lib/dovecot/sieve/global/

Все персональные настройки и файлы будут находится либо в папках пользователей, либо в каталоге: /var/lib/dovecot/sieve/private/ - в соответствующих папках.

В консоли:

# mkdir /var/lib/dovecot/sieve/

# mkdir /var/lib/dovecot/sieve/global/

# mkdir /var/lib/dovecot/sieve/private/

# chown -hR root:root /var/lib/dovecot/sieve/

# chown -hR root:root /var/lib/dovecot/sieve/global/

# chown -hR vmail:root /var/lib/dovecot/sieve/private/

# chmod -R 755 /var/lib/dovecot/sieve/

# chmod -R 755 /var/lib/dovecot/sieve/global/

# chmod -R 700 /var/lib/dovecot/sieve/private/

После всех остальных настроек (в конфиге ниже), папки в каталоге "/var/lib/dovecot/sieve/private/" будут создаваться автоматически (включая каталог домена) при первом доступе пользователя к фильтру в настройках MUA RoundCube.

/etc/dovecot/conf.d/90-sieve.conf :

plugin {

#  sieve_user_log = /var/lib/dovecot/sieve/private/%d/%n/.main.peronal.log

  sieve = /var/lib/dovecot/sieve/private/%d/%n/.main.personal.sieve

  #sieve_default = /var/lib/dovecot/sieve/default.sieve

  sieve_dir = /var/lib/dovecot/sieve/private/%d/%n/

  sieve_global_dir = /var/lib/dovecot/sieve/global/

  #sieve_before2 =

  sieve_before = /var/lib/dovecot/sieve/global/incoming_deduplicate.sieve

  #sieve_after =

  #sieve_after2 =

  sieve_extensions = +editheader

  sieve_global_extensions = +vnd.dovecot.duplicate

  sieve_duplicate_period = 1d

  #sieve_plugins =

  recipient_delimiter = +

  #sieve_max_script_size = 1M

  #sieve_max_actions = 32

  #sieve_max_redirects = 4

  #sieve_quota_max_scripts = 0

  #sieve_quota_max_storage = 0

}

Теперь подробнее о глобальном sieve-скрипте "incoming_deduplicate.sieve" и контроле всех отправляемых писем.

В этой конфигурации реализовано сохранение всей исходящей почты - в т.ч. отправленной с неучтенных ящиков или из внешнего MUA. Реализация включает в себя Sieve-скрипты в Dovecot, а также некоторые настройки Postfix.
В этой заметке - подробности метода (настоятельно рекомендую прочитать).

Суть метода в том, что для любых писем отправленных через Postfix создается дополнительная копия, доставляемая отправителю (только если отправитель в "родном" домене). При этом, если отправитель неучтенный (отсутствует в базе Postfixadmin), то BCC-копия доставляется в единый ящик для неизвестных отправителей. Эта копия маркируется прямо в Postfix - в заголовке письма модифицируется адрес доставки "Delivered-To" примерно так: "user+bccflag@domain.tld" (либо "bccsnd+bccflag@domain.tld" - для неучтенных отправителей). При доставке письма в ящик (через Dovecot) Sieve-скрипт отлавливает эти маркированные письма и пропускает их через временную базу учета дубликатов с помощью расширения vnd.dovecot.duplicate (дубликаты отслеживаются по уникальному ID письма). Кроме того, проверке подвергаются письма, принудительно "перепосланные" из папки "Отправленные" - пропускаются через ту же базу дубликатов. Для этого, письма, отправленные "родным" MUA, проверяются (с помощью incron они "ловятся" при появлении в папке "Отправленные") и, если нет маркера - маркируются (заголовок модифицируется - добавляется "X-Deduplicate: IMAP refiltering") и пересылаются через Dovecot-LDA во "Входящие", где распознаются как подлежащие проверке на предмет дублирования. Какое из маркированных (с помощью Postfix или incron) писем придет первым - то и сохранится окончательно в "Отправленные" (последующие дубликаты уничтожаются).
Побочным эффектом всей схемы является проблема при принудительном перемещении писем в Отправленные через MUA (например мышью в web-интерфейсе) - некоторые из таких писем просто попадают во "Входящие". Эта проблема может быть частично решена через Dovecot-ACL.

За подробностями еще раз настоятельно рекомендую обратиться к этой заметке.

В этом процессе задействованы:

  • Posfix - параметр sender_bcc_maps, конфига "main.cf" см. выше
  • Posfix - файлы /etc/postfix/mysql_bcc_mailbox_maps.cf и /etc/postfix/mysql_bcc_domain_maps.cf - для параметра sender_bcc_maps см. выше
  • Posfix - параметр recipient_delimiter (конфиг "main.cf") см. выше
  • Dovecot - параметры sieve_before, sieve_extensions, sieve_global_extensions и прочие конфига "90-sieve.conf" см. выше
  • Dovecot - параметр recipient_delimiter (конфиг "15-lda.conf") см. выше
  • Dovecot - параметр recipient_delimiter (конфиг "90-sieve.conf") см. выше
  • Dovecot - Sieve-скрипт "incoming_deduplicate.sieve" контроля дубликатов во входящих.
  • Dovecot - Sieve-скрипт "move_to_lda_refiltering.sieve" переотправки письма из "Отправленные" во "Входящие" через Dovecot-LDA.
  • Roundcube - распознавание маркированного "двойного" адреса, параметр: "$CONF['recipient_delimiter']" см. ниже
  • Postfixadmin - скрипты постобработки добавления/удаления ящика, для файлов в служебной папке "incron_mailuser_monitor" см. выше
  • incron - задание "/etc/incron.d/00-del_mailuser_dir_monitor" наблюдения за удалением файлов из служебной папки "/home/vmail/incron_mailuser_monitor".
  • incron - задание "/etc/incron.d/00-add_mailuser_dir_monitor" наблюдения за добавлением файлов в служебную папку "/home/vmail/incron_mailuser_monitor".
  • Скрипт - "/etc/dovecot/add_del_mailuser_monitor.sh" запускающийся из заданий "/etc/incron.d/00-del_mailuser_dir_monitor" и "/etc/incron.d/00-add_mailuser_dir_monitor".
  • incron - файлы заданий "/etc/incron.d/maildomain@mailuser" наблюдения за папками пользователей "Отправленные" (каждому ящику - в отдельном файле). Эти задания создаются/удаляются скриптом "add_del_mailuser_monitor.sh".
  • Скрипт - "/etc/dovecot/sent_refilter.sh" запускающийся из заданий наблюдения за папками пользователей "Отправленные".

ВАЖНО! Рекомендую изменить названия служебных папок для большей безопасности.

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

Sieve-скрипт для sieve_before конфига "90-sieve.conf"

# nano /var/lib/dovecot/sieve/global/incoming_deduplicate.sieve :

require ["vnd.dovecot.duplicate", "editheader", "fileinto", "envelope", "subaddress", "imap4flags"];

if allof (not exists "X-Deduplicate", anyof (envelope :detail "to" "bccflag", not exists "Delivered-To")) {

    if duplicate {

        discard;

        stop;

    }

    else {

        if not exists "Delivered-To" {

            # addheader :last "X-Deduplicate" "IMAP refiltering";

            addheader "X-Deduplicate" "IMAP refiltering";

            setflag "\\flagged";

        }

        else {

            # addheader :last "X-Deduplicate" "bccflag";

            addheader "X-Deduplicate" "bccflag";

        }

        fileinto "Sent";

    }

}

Создадим Sieve-скрипт для обработки виртуальных почтовых папок "Sent", который будет запускаться с помощью инструмента sieve-test
(подробнее о sieve-test см. раздел в этой заметке, а также пример использования в этой заметке)

# nano /var/lib/dovecot/sieve/global/move_to_lda_refiltering.sieve :

if not exists "X-Deduplicate" {
	discard;
	stop;
}

Компилируем скрипты (в консоли), проверяя, чтобы не было никаких ошибок:

# sievec /var/lib/dovecot/sieve/global/incoming_deduplicate.sieve

# sievec /var/lib/dovecot/sieve/global/move_to_lda_refiltering.sieve

Установим incron (в консоли):

# apt-get install incron

Дадим разрешение root (в консоли)

# nano /etc/incron.allow :

root

Создадим служебную папку. В папке PostfixAdmin будет создавать/удалять пустые файлы с соответствующим именем, при создании/удалении почтовых ящиков. После этого установим наблюдение за этой служебной папкой (через incron).

В консоли:

# mkdir /home/vmail/incron_mailuser_monitor

Установим права (пользователь root, группа www-data)

# chmod 670 /home/vmail/incron_mailuser_monitor

# chown root:www-data /home/vmail/incron_mailuser_monitor

Формат файла для каждого ящика в этой папке должен быть следующий:

"maildomain@mailuser".

Т.е. это почтовый адрес, в котором домен и пользователь поменяны местами (например для "user@domain.tld", имя файла будет "domain.tld@user").

Теперь раскомментируем последние строки в скриптах пост-обработки PostfixAdmin, отвечающие за добавление/удаление файлов-пустышек в служебной папке параллельно с добавлением/удалением ящиков (см. выше).

# nano /etc/postfixadmin/scripts/addmail.sh :

...

 

if [[ -d /home/vmail/incron_mailuser_monitor/ ]]

then

    userdomain=(${1//@/ })

    touch /home/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]}

fi

# nano /etc/postfixadmin/scripts/delmail.sh :

...

 

if [[ -d /home/vmail/incron_mailuser_monitor/ ]]

then

    userdomain=(${1//@/ })

    if [[ -f /home/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]} ]]

    then

        rm /home/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]}

    fi

fi

При появлении/удалении в служебной папке "incron_mailuser_monitor" файла с именем почтового ящика (описанного выше формата) будет запускаться скрипт "add_del_mailuser_monitor.sh", в аргументах которого будет присутствовать имя файла. Главное же здесь то, что этот скрипт будет запускаться от "root" - ради этого и реализована идея промежуточной т.н. "служебной папки".

Создаем задание наблюдения за удалением файлов в служебной папке в incron

# nano /etc/incron.d/00-del_mailuser_dir_monitor :

/home/vmail/incron_mailuser_monitor/ IN_DELETE /etc/dovecot/add_del_mailuser_monitor.sh $# del

Создаем задание наблюдения за добавлением файлов в служебной папке в incron

# nano /etc/incron.d/00-add_mailuser_dir_monitor :

/home/vmail/incron_mailuser_monitor/ IN_CREATE /etc/dovecot/add_del_mailuser_monitor.sh $# add

В консоли:

# /etc/init.d/incron reload

ВАЖНО! Появление файла в служебной папке будет вызывать появление задания наблюдения за папкой "Отправленные" соответствующего ящика через incron, а удаление файла в служебной папке будет вызывать не только удаления задания наблюдения за "Отправленные", но и автоматическое удаление Maildir-папки со всеми письмами этого ящика!

Создадим теперь сам скрипт "add_del_mailuser_monitor.sh". Этот скрипт будет, при появлении нового ящика, добавлять задание в incron - наблюдать за папкой "Отправленные" (".../.Sent/cur/") этого ящика. А при удалении ящика - удалять это задание из incron.

# nano /etc/dovecot/add_del_mailuser_monitor.sh :

#!/bin/bash

if [[ "$2" == del ]]

then

       userdomain=(${1//@/ })

       if [[ -f /etc/incron.d/$1 ]]

       then

              `rm /etc/incron.d/$1`

              `/etc/init.d/incron reload`

       fi

 

       if [[ -d /home/vmail/${userdomain[0]}/ ]]

       then

              if [[ -d /home/vmail/${userdomain[0]}/${userdomain[1]}/ ]]

              then

                      `rm -rf /home/vmail/${userdomain[0]}/${userdomain[1]}`

              fi

       fi

fi

 

if [[ "$2" == add ]]

then

       userdomain=(${1//@/ })

       # /usr/lib/dovecot/dovecot-lda -d ${userdomain[1]}@${userdomain[0]} -p /etc/dovecot/mail_for_new

       `sleep 3s`

 

       printf "/home/vmail/${userdomain[0]}/${userdomain[1]}/.Sent/cur/ IN_MOVED_TO /etc/dovecot/sent_refilter.sh /home/vmail/${userdomain[0]}/${userdomain[1]} ${userdomain[1]}@${userdomain[0]} \$#" >> /etc/incron.d/$1

 

       `/etc/init.d/incron reload`

fi

"printf ..." - должен быть одной строкой без переносов!!!

sleep 3s - 3 секундная задержка нужна, чтобы Dovecot успел создать Maildir-папки.
Если Maildir-папки не успеют создаться, то новое задание наблюдения за папкой "Отправленные" будет выдавать ошибку о том. что incron не может найти наблюдаемую папку. В этом случае необходимо было бы каждый раз перезапускать incron ("reload" здесь не помогает).

/usr/lib/dovecot/dovecot-lda ... - закоментированная строка отправляет приветственное письмо через Dovecot-LDA. Если это будет использовано, то такое письмо нужно будет создать (в файле "/etc/dovecot/mail_for_new").

ВАЖНО! Строки, отвечающие за удаление Maildir-каталога стоит использовать только если есть уверенность в полной безопасности.

Создадим скрипт, который будет вызываться по событию в папках "Отправленные"

# nano /etc/dovecot/sent_refilter.sh :

#!/bin/bash

qresult="$(sieve-test -l $1 /var/lib/dovecot/sieve/global/move_to_lda_refiltering.sieve $1/.Sent/cur/$3)"

if [[ "$qresult" == *discard* ]]

then

       /usr/lib/dovecot/dovecot-lda -d $2 -p $1/.Sent/cur/$3

       rm $1/.Sent/cur/$3

       doveadm index -u $2 mailbox Sent

fi

Отредактируем права (в консоли):

# chmod 700 /etc/dovecot/add_del_mailuser_monitor.sh

# chmod 700 /etc/dovecot/sent_refilter.sh

Теперь все отправляемые письма, как и чем бы они не отправлялись (в т.ч. внешним MUA) - попадут в папку "Отправленные" к тому, от чьего имени они были отправлены. А письма, которые были отправлены от незарегистрированных пользователей - попадут в специальный ящик для таких писем. Это позволит четко контролировать отправляемую почту, в т.ч. и контролировать возможный захват почтовых инструментов спамерами.

Для проверки можно завести ящик пользователя "www-data@domain.tld" и отправить кому-нибудь тестовое письмо из PHP-скрипта. Письмо должно появиться в папке "Отправленные" почтового ящика. После чего следует удалить ящик и отправить письмо из PHP-скрипта еще раз. Теперь оно должно появиться в ящике, предназначенном для отправленных писем неучтенных (без ящика) пользователей "bccsnd@domain.tld".


Продолжим.

/etc/dovecot/conf.d/auth-sql.conf.ext :

#passdb {

#  driver = passwd-file

#  args = username_format=%u /var/vmail/auth.d/%d/passwd

#}

# Master-user:

auth_master_user_separator = *

#auth_debug = yes

passdb {

  driver = sql

  args = /etc/dovecot/dovecot-sql-master.conf.ext

  master = yes

  pass = yes

}

passdb {

  driver = sql

  args = /etc/dovecot/dovecot-sql.conf.ext

#  default_fields = userdb_gid=5000 userdb_uid=5000

}

userdb {

  driver = prefetch

}

 

userdb {

  driver = sql

  args = /etc/dovecot/dovecot-sql.conf.ext

#  default_fields = uid=5000 gid=5000

}


SQL-конфиги.

/etc/dovecot/dovecot-sql.conf.ext :

driver = mysql

 

connect = host=127.0.0.1 dbname=_POSTFIXADMIN_SQL_BASE_ user=_POSTFIXADMIN_SQL_USER_ password=_POSTFIXADMIN_SQL_PASSWORD_

 

default_pass_scheme = PLAIN-MD5

 

#   %u = entire user@domain

#   %n = user part of user@domain

#   %d = domain part of user@domain

 

password_query = SELECT username as user, password, '%u' AS userdb_master_user, CONCAT('/home/vmail/', maildir) AS userdb_home, 5000 AS userdb_uid, 5000 AS userdb_gid, CONCAT('*:storage=', quota, 'B') as userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1'

 

user_query = SELECT CONCAT('/home/vmail/', maildir) AS home, 5000 AS uid, 5000 AS gid, CONCAT('*:storage=', quota, 'B') as quota_rule FROM mailbox WHERE username = '%u' AND active = '1'

 

ВАЖНО!
password_query = ..., user_query = ... - должны быть ОДНОЙ строкой (без переносов)!
Кроме того, в этом конфиге надо использовать только "127.0.0.1"! При использования "localhost", коннект происходит на файловый сокет (обнаружено в результате экспериментов). Этот адрес должен совпадать с указанным в "/etc/misql/my.conf".

/etc/dovecot/dovecot-sql-master.conf.ext :

driver = mysql

default_pass_scheme = PLAIN-MD5

connect = host=127.0.0.1 dbname=_POSTFIXADMIN_SQL_BASE_ user=_POSTFIXADMIN_SQL_USER_ password=_POSTFIXADMIN_SQL_PASSWORD_

password_query = SELECT username AS user, password FROM admin WHERE username = '%u' AND active = '1'


Отключим неиспользуемые конфиги (в консоли):

# mv /etc/dovecot/conf.d/auth-checkpassword.conf.ext /etc/dovecot/conf.d/auth-checkpassword.conf.ext_
# mv /etc/dovecot/conf.d/auth-deny.conf.ext /etc/dovecot/conf.d/auth-deny.conf.ext_
# mv /etc/dovecot/conf.d/auth-ldap.conf.ext /etc/dovecot/conf.d/auth-ldap.conf.ext_
# mv /etc/dovecot/conf.d/auth-master.conf.ext /etc/dovecot/conf.d/auth-master.conf.ext_
# mv /etc/dovecot/conf.d/auth-passwdfile.conf.ext /etc/dovecot/conf.d/auth-passwdfile.conf.ext_
# mv /etc/dovecot/conf.d/auth-static.conf.ext /etc/dovecot/conf.d/auth-static.conf.ext_
# mv /etc/dovecot/conf.d/auth-system.conf.ext /etc/dovecot/conf.d/auth-system.conf.ext_
# mv /etc/dovecot/conf.d/auth-vpopmail.conf.ext /etc/dovecot/conf.d/auth-vpopmail.conf.ext_

Меняем права и владельца конфигов (в консоли):

# chgrp vmail /etc/dovecot/*.conf
# chmod g+r /etc/dovecot/*.conf
# chgrp vmail /etc/dovecot/*.ext
# chmod g+r /etc/dovecot/*.ext
# chgrp vmail /etc/dovecot/conf.d/*.conf
# chmod g+r /etc/dovecot/conf.d/*.conf
# chgrp vmail /etc/dovecot/conf.d/*.ext
# chmod g+r /etc/dovecot/conf.d/*.ext

Сертификаты

Сертификаты желательно всегда иметь правильные - валидные.

Но простой способ - тоже подойдет. :)

Для Postfix

В консоли:

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

# chmod o= /etc/postfix/ssl.key.pem

Для Dovecot

В консоли:

# openssl req -new -x509 -days 3650 -nodes -out /etc/dovecot/ssl.cert.pem -keyout /etc/dovecot/ssl.key.pem

# chmod 444 /etc/dovecot/ssl.cert.pem

# chmod 400 /etc/dovecot/ssl.key.pem

# chown root:root /etc/dovecot/ssl.cert.pem

# chown root:root /etc/dovecot/ssl.key.pem

Проверка SSL

В консоли:

# openssl s_client -tls1 -crlf -connect localhost:25

# openssl s_client -tls1 -crlf -connect mail.domain.tld:25

 

# openssl s_client -starttls smtp -showcerts -connect localhost:25

# openssl s_client -starttls smtp -showcerts -connect mail.domain.tld:25

 

# openssl s_client -starttls smtp -crlf -connect mail.domain.tld:25

 

# openssl s_client -starttls imap -crlf -connect localhost:143

Последняя команда может выдавать ошибку, если IMAP на 143 порту для localhost настроен без TLS.


На всякий случай сделаем полный перезапуск Dovecot (в консоли):

# service dovecot restart

Проверка Dovecot

Проверка авторизации, где _USER_ - полностью имя ящика, а _PASSWORD_ - пароль (в консоли):

# doveadm auth -x service=imap -x rip=127.0.0.1 _USER_ _PASSWORD_

Следующая строка не должна выдать ошибок в конце:

# doveconf -a

Roundcube

Скачиваем с сайта последнюю версию (та что в репозитариях сильно устаревшая + она раскидывается по всей системе). В момент установки это была версия 0.92.

Установка

Понадобятся также некоторые дополнительные пакеты

# apt-get install php5-mcrypt php5-intl

Распаковываем архив сюда: /var/www/html/ssl/roundcubemail-0.9.2/

В консоли переименовываем каталог:
# mv /var/www/html/ssl/roundcubemail-0.9.2/ /var/www/html/ssl/roundcubemail/

ВАЖНО! После распаковки необходимо проверить у всех файлов и папок владельца!
Должен быть "www-data".

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


Дополнительные плагины из репозитарного пакета

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

Для того, кому этот путь покажется приемлемым - следующая информация.

Перед установкой проверить - присутствует ли пакет javascript-common
/usr/share/javascript/

Итак, устанавливаем дополнительные плагины (одновременно подтянет старую репозитарную версию roundcube):

# apt-get install roundcube-plugins-extra

(на вопрос реконфигурирования базы, отвечать - НЕТ!)

Список дополнительных плагинов из репозитарного пакета:

- compose_addressbook

- contextmenu

- copymessage

- dkimstatus

- dovecot_impersonate

- fail2ban

- keyboard_shortcuts

- listcommands

- markasjunk2

- message_highlight

- quickrules

- sauserprefs

- sieverules

- zipdownload

(некоторые уже и так есть и в стандартной установке, скачанной с сайта).

Будут затронуты следующие папки:

/usr/share/roundcube/

/etc/roundcube/

/var/lib/roundcube/

/usr/share/javascript/

/usr/share/tinymce/www/

+ Файлы:

/etc/apache2/@roundcube (ссылка на /etc/roundcube/apache.conf)

/etc/apache2/conf.d/javascript-common.conf (ссылка на /etc/javascript-common/javascript-common.conf)

Так же, по-видимому установятся такие пакеты:

php-net-smtp

php-auth-sasl

php-auth

php-mdb2

php-mdb2-driver-mysql

php-net-sieve

libaspell15

php5-pspell

aspell

aspell-en

javascript-common

libjs-jquery

libjs-jquery-mousewheel

libjs-jquery-ui

tinymce

roundcube-mysql

roundcube-core

roundcube-plugins-extra

ВАЖНО! Я не советую проделывать вышеуказанные действия. Лучше ограничиться плагинами из пакета, скачанного напрямик из сайта.

Здесь используется только один плагин из указанного выше списка - dkimstatus. Ради него, видимо, не стоит возиться с указанными выше пакетами, поскольку этот плагин можно отдельно найти и скачать в Интернет.


Конфиги

Мне сразу понадобилась некоторая подрихтовка:

# cp -r /var/www/html/ssl/roundcubemail/skins/classic/ /var/www/html/ssl/roundcubemail/skins/default

Еще пару штрихов.

# /var/www/html/ssl/roundcubemail/.htaccess :

...

php_value upload_max_filesize 20M

php_value post_max_size 20M

...

ВАЖНО! Все указанные ниже параметры необходимо заменить, а остальные оставить как были

/var/www/html/ssl/roundcubemail/config/main.inc.php :

...

$rcmail_config['debug_level'] = 8;

...

$rcmail_config['log_driver'] = 'syslog';

...

//$rcmail_config['syslog_facility'] = LOG_USER;

...

$rcmail_config['smtp_log'] = false;

...

$rcmail_config['log_logins'] = false;

...

$rcmail_config['log_session'] = false;

 

// Log SQL queries to <log_dir>/sql or to syslog

$rcmail_config['sql_debug'] = false;

 

// Log IMAP conversation to <log_dir>/imap or to syslog

$rcmail_config['imap_debug'] = false;

 

// Log LDAP conversation to <log_dir>/ldap or to syslog

$rcmail_config['ldap_debug'] = false;

 

// Log SMTP conversation to <log_dir>/smtp or to syslog

$rcmail_config['smtp_debug'] = false;

...

$rcmail_config['default_host'] = array('localhost', 'domain');

...

$rcmail_config['smtp_server'] = 'tls://127.0.0.1';

...

$rcmail_config['smtp_port'] = '587';

...

$rcmail_config['smtp_helo_host'] = 'mail.domain.tld';

...

$rcmail_config['support_url'] = 'roundcubemail';

...

$rcmail_config['auto_create_user'] = true;

...

// This is used by the 'file' log driver.

$rcmail_config['log_dir'] = 'logs/';

...

$rcmail_config['force_https'] = true;

...

$rcmail_config['use_https'] = true;

...

$rcmail_config['login_autocomplete'] = 1;

...

$rcmail_config['ip_check'] = true;

...

$rcmail_config['referer_check'] = true;

...

$rcmail_config['username_domain'] = 'domain.tld';

...

$rcmail_config['mail_domain'] = 'domain.tld';

...

$rcmail_config['password_charset'] = 'UTF-8';

...

//$rcmail_config['product_name'] = 'Roundcube Webmail';

$rcmail_config['product_name'] = '';

...

$rcmail_config['plugins'] = array();

 

$rcmail_config['plugins'][] = 'acl';

$rcmail_config['plugins'][] = 'additional_message_headers';

$rcmail_config['plugins'][] = 'archive';

$rcmail_config['plugins'][] = 'help';

$rcmail_config['plugins'][] = 'hide_blockquote';

$rcmail_config['plugins'][] = 'jqueryui';

$rcmail_config['plugins'][] = 'managesieve';

$rcmail_config['plugins'][] = 'markasjunk';

$rcmail_config['plugins'][] = 'newmail_notifier';

$rcmail_config['plugins'][] = 'show_additional_headers';

//$rcmail_config['show_additional_headers'] = array('User-Agent', 'Subject');

$rcmail_config['show_additional_headers'] = array('Subject');

$rcmail_config['plugins'][] = 'userinfo';

$rcmail_config['plugins'][] = 'vcard_attachments';

//$rcmail_config['plugins'][] = 'virtuser_file';

//$rcmail_config['plugins'][] = 'virtuser_query';

 

// ADD Extra plugin:

$rcmail_config['plugins'][] = 'dkimstatus';

//$rcmail_config['plugins'][] = 'sauserprefs'; // Spamassassin Edit

 

// ADD other plugins:

$rcmail_config['plugins'][] = 'serverinfo';

$rcmail_config['plugins'][] = 'special_folders';

 

// ADD Dummy Luck plugins:

$rcmail_config['plugins'][] = 'login_view'; // <<-- My Plugin! :)

$rcmail_config['plugins'][] = 'new_user_autosubscribe'; // <<-- My Plugin! :)

 

// AFTER ALL PLUGIN:

//$rcmail_config['plugins'][] = 'dovecot_impersonate'; // Change Mail From

 

...

$rcmail_config['date_format'] = 'd/m/Y';

...

$rcmail_config['drafts_mbox'] = '.Drafts';

...

//$rcmail_config['junk_mbox'] = 'Junk';

$rcmail_config['junk_mbox'] = '.Spam';

...

$rcmail_config['sent_mbox'] = '.Sent';

...

$rcmail_config['trash_mbox'] = '.Trash';

// !!! Need Archive-plugin !!!

$rcmail_config['archive_mbox'] = '.Archive';

...

//$rcmail_config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');

$rcmail_config['default_folders'] = array('INBOX', '.Sent', '.Drafts', '.Spam', '.Trash', '.Archive');

...

$rcmail_config['create_default_folders'] = false;

...

//$rcmail_config['skin'] = 'larry';

$rcmail_config['skin'] = 'classic';

...

//$rcmail_config['default_charset'] = 'ISO-8859-1';

$rcmail_config['default_charset'] = 'UTF-8';

...

$rcmail_config['mime_param_folding'] = 1;

...

$rcmail_config['skip_deleted'] = false;

...

$rcmail_config['flag_for_deletion'] = false;

...

$rcmail_config['check_all_folders'] = true;

...

RoundCube плагины

Необходимо, чтобы папка плагина находилась в соответствующем каталоге:

/var/www/html/ssl/roundcubemail/plugins/

При этом, наличие в папке не означает его включение (т.е. он может присутствовать в папке, но не работать). Чтобы он заработал его и нужно - "включить".

Включаются плагины в файле /var/www/html/ssl/roundcubemail/config/main.inc.php (см. выше) в строке:

...

$rcmail_config['plugins'][] = '...';

...

При этом имя папки плагина полностью совпадает с именем, включенным в конфиге Roundcube (см. выше).


login_view

Мой плагин. Страница плагина.

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


new_user_autosubscribe

Мой плагин. Страница плагина.

Автоматически подписывает (привязывает) определенные папки у нового юзера (при первом входе) без необходимости делать это в настройках в web-интерфейсе. Можно также задать очередность отображения этих папок (одинаковую для всех) в файле:

/var/www/html/ssl/roundcubemail/plugins/new_user_autosubscribe/config.inc.php

По умолчанию стоит привязка к стандартным папкам в стандартной настройке RoundCube.

Если будет использован плагин archive, то имеет смысл изменить стандартную автоподписку

/var/www/html/ssl/roundcubemail/plugins/new_user_autosubscribe/config.inc.php :

...

 

// Default folders + "Archive" (if use plugin "archive")

$rcmail_config['new_user_autosubscribe'] = array('sent_mbox'=>'Sent', 'drafts_mbox'=>'Drafts', 'junk_mbox'=>'Spam', 'trash_mbox'=>'Trash', 'archive_mbox'=>'Archive',

      'default_folders'=>array('INBOX', 'Sent', 'Drafts', 'Spam', 'Trash', 'Archive') );

 

// Default folders only

/*

$rcmail_config['new_user_autosubscribe'] = array('sent_mbox'=>'Sent', 'drafts_mbox'=>'Drafts', 'junk_mbox'=>'Spam', 'trash_mbox'=>'Trash',

      'default_folders'=>array('INBOX', 'Sent', 'Drafts', 'Spam', 'Trash') );

*/

 

...


acl

После установки, в настройках появляется дополнительная вкладка "Совместный доступ" у свойств любой папки. Автозаполнение, используя LDAP addressbook.
Может быть полезен для админа, который хочет не только иметь возможность наблюдать (с помощью специальной настройки Dovecot), но и иметь доступ к ящикам разных (или всех) пользователей в вебинтерфейсе своего почтового аккаунта.

# cd /var/www/html/ssl/roundcubemail/plugins/acl/

# cp config.inc.php.dist config.inc.php

/var/www/html/ssl/roundcubemail/plugins/acl/config.inc.php :

...
//$rcmail_config['acl_advanced_mode'] = false;
$rcmail_config['acl_advanced_mode'] = true;
...

additional_message_headers

Плагин заменяет/добавляет заголовки в исходящие сообщения.

# cd /var/www/html/ssl/roundcubemail/plugins/additional_message_headers/

# cp config.inc.php.dist config.inc.php

После строки добавления плагинов можно указать нужные заголовки примерно так

/var/www/html/ssl/roundcubemail/plugins/additional_message_headers/config.inc.php :

...
$rcmail_config['additional_message_headers']['X-Remote-Browser'] = $_SERVER['HTTP_USER_AGENT'];
...

или так

/var/www/html/ssl/roundcubemail/plugins/additional_message_headers/config.inc.php :

...
$rcmail_config['additional_message_headers'] = array('X-Remote-Browser' => $_SERVER['HTTP_USER_AGENT']);
...

archive

Плагин добавляет кнопку "Поместить выбранное в архив". Нужно сделать так, чтобы папка создавалась автоматически и подписывалась. Автосоздание, в числе прочих, стандартных папок, можно обеспечить с помощью приветственного письма, отсылаемого при создании в PostfixAdmin и соотв. настройки Dovecot. Автоподписку можно обеспечить моим плагином new_user_autosubscribe (см. выше).


help

Создает ссылку "Помощь".

# cd /var/www/html/ssl/roundcubemail/plugins/help/

# cp config.inc.php.dist config.inc.php

/var/www/html/ssl/roundcubemail/plugins/help/config.inc.php :

$rcmail_config['help_source'] = 'http://trac.roundcube.net/wiki';

hide_blockquote

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


jqueryui

Единая jquery-ui, - может понадобится для других плагинов.

# cd /var/www/html/ssl/roundcubemail/plugins/jqueryui/

# cp config.inc.php.dist config.inc.php

/var/www/html/ssl/roundcubemail/plugins/jqueryui/config.inc.php :

...
//$rcmail_config['jquery_ui_i18n'] = array('datepicker');
$rcmail_config['jquery_ui_i18n'] = array('datepicker-ru');
...
$rcmail_config['jquery_ui_skin_map'] = array(
  'larry' => 'larry',
  'classic' => 'classic',
  'default' => 'classic',
  'groupvice4' => 'redmond',
);
...

managesieve

Ручная правка пользовательских Sieve правил. В настройках появится вкладка "Фильтры".

Хотя и требует переименования и настройки файла config.inc.php.dist , но работает и без него.


markasjunk

Добавляет кнопку "Переместить в СПАМ". Настройки не требует - только включения.

Нужно немного допилить локализацию (убрать лишние кавычки)

/var/www/html/ssl/roundcubemail/plugins/markasjunk/localization/ru_RU.inc :

...
$labels['buttontitle'] = 'Переместить в СПАМ';
$labels['reportedasjunk'] = 'Перемещено в СПАМ';
...

newmail_notifier

Сообщает о новом письме. Звуком, всплывающим окном, перемещением фокуса.

# cd /var/www/html/ssl/roundcubemail/plugins/newmail_notifier/

# cp config.inc.php.dist config.inc.php

/var/www/html/ssl/roundcubemail/plugins/newmail_notifier/config.inc.php :

// Enables basic notification
$rcmail_config['newmail_notifier_basic'] = true;
// Enables sound notification
$rcmail_config['newmail_notifier_sound'] = true;
...

Звуковой файл можно изменить - он находится в папке плагина.


show_additional_headers

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

/var/www/html/ssl/roundcubemail/config/main.inc.php :

$rcmail_config['show_additional_headers'] = array('User-Agent');

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


userinfo

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


vcard_attachments

Обнаруживает VCard вложение и выводит кнопку добавления информации в адресную книгу. Настройки не требует - только включения.


dkimstatus

Показывает в области просмотра, возле заголовка "От", иконку, информирующую о DKIM-статусе письма. Настройки не требует - только включения.


serverinfo

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

Установка:

# cd /var/www/html/ssl/roundcubemail/plugins/

# wget http://axel.sjostedt.no/misc/files/rcube_plg_serverinfo.tar.gz

# tar xfz rcube_plg_serverinfo.tar.gz

# rm rcube_plg_serverinfo.tar.gz

Настройка:

# cd /var/www/html/ssl/roundcubemail/plugins/serverinfo/

# cp config.inc.php.dist config.inc.php

/var/www/html/ssl/roundcubemail/plugins/serverinfo/config.inc.php :

...

$serverinfo_config['hostname_smtp'] = 'mail.domain.tld';

$serverinfo_config['hostname_imap'] = 'mail.domain.tld';

$serverinfo_config['hostname_pop'] = '<disable>';

...

//$serverinfo_config['port_pop'] = array('110');

$serverinfo_config['port_pop'] = '';

//$serverinfo_config['port_smtp-ssl'] = array('465');

$serverinfo_config['port_smtp-ssl'] = '';

//$serverinfo_config['port_imap-ssl'] = array('993');

$serverinfo_config['port_imap-ssl'] = '';

//$serverinfo_config['port_pop-ssl'] = array('995');

$serverinfo_config['port_pop-ssl'] = '';

...

//$serverinfo_config['recommendssl'] = false;

$serverinfo_config['recommendssl'] = true;

...

$serverinfo_config['customfields_webmail'][] = array('type' => 'title', 'text' => $this->gettext('webmailsystem'));

$serverinfo_config['customfields_webmail'][] = array('type' => 'value', 'text' => 'Roundcube ' . RCMAIL_VERSION);

...


special_folders

Позволяет добавлять специальные папки, назначать им свои иконки и т.п.

Качаем, распаковываем в папку плагинов: http://sourceforge.net/projects/roundcubespecia/

Небольшие допилы:

# cd /var/www/html/ssl/roundcubemail/plugins/special_folders/

# cp -r skins/default/ skins/classic

# cp config.inc.php.dist config.inc.php

В файле конфигурации можно указать свои настройки.


dovecot_impersonate

Выдает себя за другого пользователя, используя особенности Dovecot master-user. Полезно для helpdesk и поддержки. У меня не получилось главного - отправлять письма от имени пользователя, поскольку Postfix требует полноценной SMTP-авторизации при отправке. Но если настроить так, что авторизация для доверенных сетей не будет требоваться, то эта проблема отпадет.

Качаем, распаковываем в папку плагинов:

# cd /var/www/html/ssl/roundcubemail/plugins/

# wget https://github.com/corbosman/dovecot_impersonate/archive/master.zip

# unzip master.zip

# rm master.zip

# mv plugins/dovecot_impersonate-master/ dovecot_impersonate/

# cp dovecot_impersonate/config.inc.php.dist dovecot_impersonate/config.inc.php

/var/www/html/ssl/roundcubemail/plugins/dovecot_impersonate/config.inc.php :

...
//$rcmail_config['dovecot_impersonate_seperator'] = '*';
$rcmail_config['dovecot_impersonate_seperator'] = '*';
...

Потом настраиваем Dovecot. Потребуется там указать параметр "auth_master_user_separator" для корректной работы по IMAP.


Полезные команды

Процессы Postfix:

# ps aux | grep postfix

Проверка конфигурации Postfix:

# postfix check

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

# postconf -d smtpd_sasl_auth_enable

smtpd_sasl_auth_enable = no

Вывод текущего значения параметра:

# postconf smtpd_sasl_auth_enable

smtpd_sasl_auth_enable = no

Вывод версии postfix:

# postconf | grep ^mail_version

mail_version = 2.8.5

Просмотр текущей очереди сообщений:

# postqueue -p

Удаление всех писем из очереди:

# postsuper -d ALL

Повторная отправка сообщений, которые находятся в очереди:

# postqueue -f

Узнать поддерживаемые методы аутентификации:

# telnet domain.tld 25

...

ehlo mail.domain.tld

...

quit

250-AUTH PLAIN LOGIN - говорит о том, что данный сервер поддерживает два метода аутентификации - PLAIN и LOGIN

250-SIZE 5242880 - максимальный размер письма ~5 Mb

250-STARTTLS - включена поддержка SSL/TLS для передачи писем с помощью шифрования

250 DSN - данный сервер поддерживает DSN (Delivery Status Notifications), - уведомление о доставке для принятых писам

Узнать форматы данных, которые поддерживает сервер (btree, cidr, hash, MySQL, LDAP и т.п.):

# postconf -m

На каких интерфейсах слушается порт 25:

# netstat -an | grep 25

Статистика по сокетам:

# sockstat -lp 25

Может понадобиться: # apt-get install sockstat

Процесс Postfix master:

# pgrep -fl postfix

Список запущенных демонов:

# ps axl | awk '$4=="1"&&$11=="?"{print}'

Источники

Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
Установка и настройка почтового сервера

Рекламные ссылки:
Комментариев: 25 RSS
алексей1
2015-11-13 в 09:23:01

Добрый день. есть проблема в roundcubemail не подключаются plugins не один не работает. в чем может быть дело? Все кроме plugins функционирует нормально.

2 алексей

Трудно сказать, слишком много может быть причин. Посмотрите логи Apache и самого roundcube (предварительно только пропишите параметр $rcmail_config['debug_level'] = 1;)

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

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

Борис.

Видимо здесь /var/log/mail.log

Настраивая php Вы должны указывать как он будет отправлять почту (например через Sendmail, или скорее всего его эмуляцию в Postfix).

См.:

dummyluck.com/page/postfix_konfiguracia_nastroika#postfix_sendamil_php

dummyluck.com/page/pochta_primer_nastroiki#mail_from_php

Кроме того например Roundcube может сохранять свои логи у себя в каталоге.

Спасибо, Dummy Luck!

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

myhostname = testrelease.ispsystem.net

mydomain = ispsystem.net

Остается только вопрос почему именно на ящик virtuser_501 домена testrelease.ispsystem.net, где это прописывается?

Борис.

Судя по домену это панель управления сервером (ISPmanager?) прописала себя в конфигах (видимо там же создавался и ящик).

Письма "от сайта" скорее всего изначально отправляются от имени пользователя "www-data".

Т.е. надо искать где происходит подмена адреса пользователя www-data.

Посмотрите здесь: dummyluck.com/page/postfix_konfiguracia_nastroika#address_before_after_queue

Рекомендую сразу посмотреть содержимое файлов, указанных в "alias_maps" + "alias_database", "smtp_generic_maps" и "canonical_maps" в конфиге main.cf Postfix

Не забывайте, что после изменений в файлах указанных в упомянутых параметрах необходимо выполнить команду "postmap ..." для соответствующих файлов в "smtp_generic_maps" и "canonical_maps", или команду "newaliases" (без параметров) для файлов "alias_maps" + "alias_database".

Добавлено:

Выше речь шла об отправителе.

А получателя (адресата) надо искать в скриптах сайта.

Здравствуйте! Спасибо.

А если я просто поменяю значение mydomain и myhostname, почта не станет отправляться правильно, без подмен?

Вот логи по двум генерируем после заказа письмам:

May 15 15:12:12 server1 postfix/pickup[19046]: 77FE83A24807: uid=500 from=

May 15 15:12:12 server1 postfix/cleanup[19315]: 77FE83A24807: message-id=

May 15 15:12:12 server1 postfix/qmgr[2638]: 77FE83A24807: from=, size=1271, nrcpt=1 (queue active)

May 15 15:12:12 server1 postfix/pickup[19046]: A94533A24808: uid=500 from=

May 15 15:12:12 server1 postfix/cleanup[19315]: A94533A24808: message-id=

May 15 15:12:12 server1 postfix/qmgr[2638]: A94533A24808: from=, size=1411, nrcpt=1 (queue active)

May 15 15:12:12 server1 postfix/local[19320]: 77FE83A24807: to=, orig_to=, relay=local, delay=0.45, delays=0.31/0.01/0/0.12, dsn=2.0.0, status=sent (delivered to command: /usr/bin/procmail)

May 15 15:12:12 server1 postfix/qmgr[2638]: 77FE83A24807: removed

May 15 15:12:15 server1 postfix/smtp[19322]: A94533A24808: to=, relay=mxs.mail.ru[217.69.139.150]:25, delay=3.4, delays=0.28/0.07/0.32/2.8, dsn=2.0.0, status=sent (250 OK id=1b1uu5-0003Gt-Gf)

May 15 15:12:15 server1 postfix/qmgr[2638]: A94533A24808: removed

Письмо на email1@inbox.ru проходит, а уведомление на доменную почту сайта, на ящик info@somesite.ru не проходит

Спасибо.

Нашёл файл etc/mail/virtusertable, в котором была запись вида info@somesite.ru virtuser_501

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

Обновил virtusertable.db.

Теперь новая ситуация :) Попробовал отправить письмо на info@somesite.ru с обычного yandex-го ящика - в логах появляется такое:

[QUOTE]

May 17 17:56:33 server1 postfix/smtpd[19508]: NOQUEUE: reject: RCPT from forward9p.cmail.yandex.net[87.250.241.194]: 550 5.1.1 : Recipient address rejected: User unknown in local recipient table; from= to= proto=ESMTP helo=

[/QUOTE]

Периодически также мелькает unknown user: "info"

Как можно создать этого неизвестного юзера в локальной таблице реципиентов?

Борис.

Судя по всему у Вас настройка почты была сделана с помощью панели ISPmanager.

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

А вообще, если сможете, лучше пройтись по всей этой статье, по всем нужным конфигам и настроить почту нормально вручную (т.е. не только mydomain и myhostname, но и все остальное).

Попробовал пошаманить в ISP. Теперь письма на info@somesite.ru отправляются, по крайней мере в логах такое

May 18 12:51:38 f postfix/local[10672]: 33D173A24537: to=, relay=local, delay=0.97, delays=0.93/0/0/0.04, dsn=2.0.0, status=sent (delivered to command: /usr/bin/procmail)

и ответных сообщений о недоставке не приходит. Но почему-то писем не видно в интерфейсе SquirellMail.

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

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

Борис

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

Очевидно почтовый клиент (MUA) должен быть правильно настроен. Если он настроен на доступ по IMAP, то посмотрите в его конфигах имя хоста на который он подключается для доступа к почте. Порт должен быть 143.

После этого Вам нужно проверить что слушает этот порт на той машине где обслуживается нужный хост.

Выполните там команду в консоли "sockstat -l | grep 143"

Далее уже по ситуации

Спасибо. Да, почтовый сервер и сайт на одном VPS.

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

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

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

Вот какой почтовый лог генерит один заказ на сайте:

[SPOILER][QUOTE]

May 21 09:02:33 f postfix/pickup[23370]: 985DC3A2484D: uid=500 from=

May 21 09:02:33 f postfix/cleanup[24768]: 985DC3A2484D: message-id=

May 21 09:02:36 f postfix/qmgr[21364]: 985DC3A2484D: from=, size=1322, nrcpt=1 (queue active)

May 21 09:02:36 f postfix/pickup[23370]: 2F0B03A25195: uid=500 from=

May 21 09:02:36 f postfix/cleanup[24782]: 2F4283A25197: message-id=

May 21 09:02:36 f postfix/cleanup[24716]: 2F0B03A25195: message-id=

May 21 09:02:36 f postfix/qmgr[21364]: 2F4283A25197: from=, size=1459, nrcpt=1 (queue active)

May 21 09:02:36 f postfix/local[24772]: 985DC3A2484D: to=, orig_to=, relay=local, delay=2.6, delays=2.6/0/0/0.04, dsn=2.0.0, status=sent (forwarded as 2F4283A25197)

May 21 09:02:36 f postfix/qmgr[21364]: 985DC3A2484D: removed

May 21 09:02:36 f postfix/qmgr[21364]: 2F0B03A25195: from=, size=1421, nrcpt=1 (queue active)

May 21 09:02:36 f postfix/smtp[24835]: 2F4283A25197: to=, orig_to=, relay=mxs.mail.ru[217.69.139.150]:25, delay=0.56, delays=0.04/0.07/0.19/0.27, dsn=5.7.1, status=bounced (host mxs.mail.ru[217.69.139.150] said: 550 5.7.1 This message was not accepted due to domain owner DMARC policy (RFC 7489) [url]https://help.mail.ru/mail-help/postmaster/dmarc[/url] (in reply to end of DATA command))

May 21 09:02:36 f postfix/cleanup[24768]: C15CA3A2484D: message-id=

May 21 09:02:36 f postfix/qmgr[21364]: C15CA3A2484D: from=, size=3653, nrcpt=1 (queue active)

May 21 09:02:36 f postfix/bounce[24781]: 2F4283A25197: sender non-delivery notification: C15CA3A2484D

May 21 09:02:36 f postfix/qmgr[21364]: 2F4283A25197: removed

May 21 09:02:38 f postfix/smtp[24835]: C15CA3A2484D: to=, relay=mxs.mail.ru[94.100.180.150]:25, delay=1.5, delays=0.03/0/0.34/1.2, dsn=2.0.0, status=sent (250 OK id=1b3zzh-0005bE-5u)

May 21 09:02:38 f postfix/qmgr[21364]: C15CA3A2484D: removed

May 21 09:02:39 f postfix/smtp[24836]: 2F0B03A25195: to=, relay=mxs.mail.ru[94.100.180.150]:25, delay=5.9, delays=2.7/0.02/0.58/2.7, dsn=2.0.0, status=sent (250 OK id=1b3zzi-0006de-5y)

May 21 09:02:39 f postfix/qmgr[21364]: 2F0B03A25195: removed

[/QUOTE][/SPOILER]

Интересует ответ серверов mail.ru

status=bounced (host mxs.mail.ru[217.69.139.150] said: 550 5.7.1 This message was not accepted due to domain owner DMARC policy (RFC 7489) [url]https://help.mail.ru/mail-help/postmaster/dmarc[/url] (in reply to end of DATA command)), когда в параметре from значится customer@inbox.ru, а в to и orig_to соответственно резервный_ящик@bk.ru и info@somesite.ru.

Такой ответ возвращается из-за того, что программа сайта пытается послать письмо от имени стороннего почтового ящика customer@inbox.ru, а не от info@somesite.ru?

Борис.

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

Спасибо за документацию.

Пробую настроить сервер и получил ошибку:

DED94402A03 774 Sat May 21 02:36:01 root@something.com

(delivery temporarily suspended: connect to mail.something.com[private/dovecot-lmtp]: No such file or directory)

bccsnd+bccflag@something.com

root@something.com

в конфига вроде све правильно. Но где копать о [private/dovecot-lmtp]: No such file or directory) ?

Проверьте, есть ли в /etc/postfix/main.cf строки

...
mailbox_transport = lmtp:unix:private/dovecot-lmtp
...
virtual_transport = lmtp:unix:private/dovecot-lmtp
...

Так же проверьте /etc/dovecot/conf.d/10-master.conf

service lmtp {
  unix_listener lmtp {
  path = /var/spool/postfix/private/dovecot-lmtp
...
  }
 #unix_listener /var/spool/postfix/private/dovecot-lmtp {
 #  ...
 # }
...
}

Перезапустите posfix и dovecot

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

Посмотрите https://letsencrypt.org/ и поправьте пример для получения сертификатов. Работает отлично.

В принципе все работает если на UBUNTU 16.04 вот только надо Roundcube Webmail 1.2.0 а значит и доку надо поправить хотя там все при инсталяции все можно сделать а не руками (очень удобно).Вот бы с Postfix`oм и Dovecot`ом так.

Webmin тоже стоит упомянуть.

Где-то читал что gid и uid нужно меньше 5000.

поменяйте в /etc/postfixadmin/scripts/addmail.sh

на

#!/bin/bash

daten=`date -R`

printf "$daten \n CREATE mailbox: $1\n Domain: $2\n MailDir: $3\n Quota: $4 B\n\n" >> /var/www/html/ssl/postfixadmin-log/addmailbox.log

if [[ -d '/storages/storage1/vmail/incron_mailuser_monitor/' ]]

then

userdomain=(${1//@/ })

touch /storages/storage1/vmail/incron_mailuser_monitor/${userdomain[1]}@${userdomain[0]}

printf "Successfull\n\n" >> /var/www/html/ssl/postfixadmin-log/addmailbox.log

else

printf "Error file creation: in /storages/storage1/vmail/incron_mailuser_monitor/ for $1 \n ${userdomain[1]}@${userdomain[0]} \n\n " >> /var/www/html/ssl/postfixadmin-log/addmailbox.log

fi

глючит ;)

Замена Junk на Spam спорно, тем более что Round Cube 1.2 создает директории .Junk и т.д.

Спасибо за доку.

Vladimir

Доработка скрипта возможно оправдана, но тогда "userdomain=(${1//@/ })" имеет смысл вынести перед "if [[..."

Сертификаты здесь без ошибок.

Webmin напрямую не относится к теме этой заметки.

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

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

https://letsencrypt.org/ делает сертификат который авторизуется другой компанией на весь сервер для почти любых сервисов на сервере. Очень удобно.

Для Ubuntu 16.04 есть еще фича с MySQL он уже 5.7 и нужно:

в /etc/mysql/conf.d/mysql.cnf добавить:

[mysqld] - этого нет в фале надо добавить

.....

sql_mode = 'NO_ENGINE_SUBSTITUTION' - до добавить именно в mysqld

Народ сильно ругался по этому поводу.

Vladimir

Не могли бы Вы поподробнее рассказать про MySQL.

Не совсем понятно о чем речь.

В скрипте "/etc/dovecot/add_del_mailuser_monitor.sh" есть маленькая ошибка из за которой не срабатывает скрипт " /etc/dovecot/sent_refilter.sh". А точнее в строке "printf "/home/vmail/${userdomain[0]}/${userdomain[1]}/.Sent/cur/ IN_MOVED_TO /etc/dovecot/sent_refilter.sh /home/vmail/${userdomain[0]}/${userdomain[1]}/ ${userdomain[1]}@${userdomain[0]} \$#" >> /etc/incron.d/$1" после "/home/vmail/${userdomain[0]}/${userdomain[1]}" слеш не нужен. А так материал очень полезный, огромное спасибо.

Еще хотел добавить что в "/etc/dovecot/acl/domain.tld/Sent" все же должно быть owner lrwstpei, а не owner lrwstpe. Иначе Roundcube, и не только, при отправке письма ругается что не может сохранить письмо в отправленные.

Kostya

Спасибо за замечания.

По поводу "owner lrwstpei" - принимается (исправил).

По поводу слеша - странно, должно работать со слешем.

Хотя видимо Вы все таки правы, т.к. это аргумент скрипта /etc/dovecot/sent_refilter.sh в котором получится двойной слеш.

Спасибо!

Вопросы по теме статьи (просьба - без личностей), - присутствует премодерация:
   - регистрироваться НЕ обязательно! -

Комментарий будет опубликован только после проверки

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

(обязательно)