Полный пример установки всех пакетов и настройки конфигурационных файлов
Пример настройки всех основных конфигов всех элементов рассматриваемой в этой серии заметок почтовой системы. Список всех пакетов для установки в Debian. Этот пример - всего лишь частный случай, для определенных конкретных задач.
Речь идет о такой конфигурации:
Postfix + Dovecot 2 + MySQL + PostfixAdmin + Postgrey + Postscreen + ClamAV + DKIM + Sieve + RoundCube (+плагины к RoundCube, включая парочку, написанных тут же, "с лету", своих экспериментальных). OC - Debian.
ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы.
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера
Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).
Эта заметка имеет характер исследования. Пожалуйста не используйте слепое копирование примеров. Автор не гарантирует, что применение изложенной здесь информации не приведет к потере данных.
Содержание
- Описание конфигурации
- Настройка операционной системы (Debian)
- PTR
- DKIM и SPF
- MySQL
- PostfixAdmin
- Установка Postfix и Dovecot
- Postfix - конфигурационные файлы
- Dovecot - конфигурационные файлы
- Основные конфиги Dovecot:
- dovecot.conf
- 10-auth.conf
- 10-director.conf
- 10-logging.conf
- 10-mail.conf
- 10-master.conf
- 10-ssl.conf
- 10-tcpwrapper.conf
- 15-lda.conf
- 15-mailboxes.conf
- 20-imap.conf
- 20-lmtp.conf
- 20-managesieve.conf
- 90-acl.conf
- 90-plugin.conf
- 90-quota.conf
- 90-sieve.conf
- auth-sql.conf.ext
- dovecot-sql.conf.ext
- dovecot-sql-master.conf.ext
- Основные конфиги Dovecot:
- Сертификаты
- Roundcube
- Полезные команды
- Источники
Описание конфигурации
Здесь рассматривается случай, когда всё находится на одном сервере.
RoundCube будет настроен так, что админ будет видеть ящики остальных пользователей в списке папок.
PostfixAdmin будет использовать два порта: 25 - для коннекта с другими MTA, 587 - для подключения пользователей при отправке почты.
Dovecot будет использовать только IMAP для MUA. Протоколы: LMTP, IMAP, Sieve.
Dovecot-LDA будет использоваться только для рефильтеринга уже полученной ранее почты. Формат почтовых ящиков - Maildir.
- имя машины.domain
- домен в примере.domain.tld
- почтовый субдомен.mail.domain.tld
- левая часть логина почтового ящика админа и мастер-пользователя postmaster@domain.tld.postmaster
- левая часть логина почтового ящика для авто-BCC неизвестных пользователей родных доменов bccsnd@domain.tld.bccsnd
- IP адрес домена, и он же IP адрес почтового субдомена.ip1.ip2.ip3.ip4
,5000
- GUID, группа пользователей виртуальных ящиков.vmail
,5000
- UID, системный пользователь виртуальных ящиков.vmail
- базовый каталог почты Maildir. Формат:/home/vmail/
"/home/vmail/domain.tld/_пользователь_/" . - каталог глобальных ACL./etc/dovecot/acl/%d
- каталог, в котором будет создан вложенный подкаталог "sieve" с глобальными (каталог "global") и персональными (каталог "personal") Sieve-скриптами./var/lib/dovecot/
- каталог виртуальных папок плагина "virtual" Dovecot./var/lib/dovecot/virtual
- порт OpenDKIM.8891
- порт ClamAV-Milter.7357
- порт Postgrey.10023
- порт ManageSieve.4190
- файл SQL-запроса виртуального почтового ящика./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-запроса для авто-BCC в ящики зарегистрированных отправителей./etc/postfix/mysql_bcc_mailbox_maps.cf
- файл SQL-запроса ящика для авто-BCC не зарегистрированных отправителей родных доменов./etc/postfix/mysql_bcc_domain_maps.cf
- Postfix SSL ключ./etc/postfix/ssl.key.pem
- Postfix SSL сертификат./etc/postfix/ssl.cert.pem
- Dovecot SSL ключ./etc/dovecot/ssl.key.pem
- Dovecot SSL сертификат./etc/dovecot/ssl.cert.pem
- Количество дней на которые действительны SSL-сертификаты.3650
- путь к папке с пост-скриптами PostfixAdmin./etc/postfixadmin/scripts/
- размер почтового ящика (в байтах).1024000000
- максимальный размер письма (в байтах).20480000
- путь к корневой папке с web-файлами для https Apache2/var/www/html/ssl/
-
- имя MySQL базы PostfixAdmin_POSTFIXADMIN_SQL_BASE_
-
- имя пользователя MySQL базы PostfixAdmin_POSTFIXADMIN_SQL_USER_
-
- пароль пользователя MySQL базы PostfixAdmin_POSTFIXADMIN_SQL_PASSWORD_
-
- имя MySQL базы Roundcube_ROUNDCUBE_SQL_BASE_
-
- имя пользователя MySQL базы Roundcube_ROUNDCUBE_SQL_USER_
-
- пароль пользователя MySQL базы Roundcube_ROUNDCUBE_SQL_PASSWORD_
# 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
Проверка 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, в этом примере, указан не домен, а IP.
/etc/mysql/my.cnf
... bind-address = 127.0.0.1 ...
Важно, чтобы этот параметр совпадал с настройками в почтовых программах. Если здесь будет указано localhost
127.0.0.1
PostfixAdmin
Postfixadmin лучше установить до Postfix, чтобы потом сразу использовать правильные имена MySQL-таблиц Postfixadmin в конфигах Postfix.
Предполагается, что
Нужно в 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 суперадмина (
Там же (здесь указаны только ключевые строки файла конфигурации):
/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/
Вкатаем в нее сортировку по дате для файлов
# 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
#!/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
#!/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
#!/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". Если что не так - смотреть
Исправляем перекос в дизайне для таблицы списка ящиков:
# 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.
Предполагается, что
Удаляем 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
Предполагается, что
В процессе установки будут заданы вопросы - о них в следующем разделе.
Проверяем Postfix (в консоли):
# postconf -a cyrus dovecot
Postfix - конфигурационные файлы
ВАЖНО! На вопросы установки Postfix нужно хоть что-нибудь ответить, иначе могут быть проблемы с файлами конфигурации.
Ответы на вопросы установки Postfix могут быть примерно такими:
- General type of mail configuration — Internet Site
- System mail name — mail.domain.tld
- Root and postmaster mail recipient — postmaster@domain.tld
- Other destinations to accept mail for (blank for none) - оставляем пустым (все равно это перекрывается виртуальными обработчиками)
- Форсировать изменения? - Нет
- Local networks — 127.0.0.0/32
- Mailbox size limit — 1024000000 (1 гиг)
- Local address extension character — пустое поле
- 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 =
# 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-интерфейс по адресу:
- Внесем свой новый домен - domain.tld
- Временно внесем еще один тестовый домен - test.com (его потом надо будет удалить !!!)
- Алиас ДЛЯ домена domain.tld - вся почта домена test.com перенаправляется на domain.tld
- Создаем ящик - postmaster@domain.tld
- Превращаем ящик postmaster@domain.tld в алиас для test@domain.tld (этот ящик заводить не нужно - достаточно вписать его, как целевой для
ящика-алиаса postmaster@domain.tld). - Обязательно (!) создаем ящик - bccsnd@domain.tld
* Тут важно не запутаться. В редактировании домена создется алиас ДЛЯ редактируемого домена, а в редактировании ящика - уже сам редактируемый ящик превращается в алиас для перечисленных.
** Кстати при создании ящика обязательно надо слать приветственное письмо, т.к. за создание папки отвечает Dovecot (Posfix вообще к этим папкам не имеет доступа - любой физический доступ осуществляется ЧЕРЕЗ Dovecot).
*** Аутентификация будет происходить очень интересно. Наличие/отсутствие имен ящиков, Postfix будет проверять сам в таблицах PostfixAdmin. Пароли Postfix в своих таблицах запрашивать не будет - они будут проверяться средствами Dovecot, но... в таблицах PostfixAdmin. :)
Проверка
Домен:
# postmap -q domain.tld mysql:/etc/postfix/mysql_virtual_domains.cf
Юзер@домен найден:
# postmap -q postmaster@domain.tld mysql:/etc/postfix/mysql_virtual_maps.cf
BCC - Юзер@домен найден:
# postmap -q postmaster@domain.tld mysql:/etc/postfix/mysql_bcc_mailbox_maps.cf
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
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
Для домена-алиаса:
В данном экзотическом варианте - вернет список рассылки ящика-алиаса, ДЛЯ которого запрашиваемый ящик является алиасом.
* К алиас-домену привязываются имена ВСЕХ ящиков основного домена, но ТОЛЬКО те, что есть в основном домене. # postmap -q postmaster@test.com mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf
См. также заметку про использование 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.
Настройка в конфигах
Там же - описание
Policyd-SPF
SPF - это TXT-запись в DNS, в которой, в простейшем варианте должен быть указан IP сервера, которому разрешено отправлять почту.
Описание того как это должно выглядеть в DNS см. выше.
Заметка с описанием SPF.
Соответственно, Policyd-SPF - это проверка для входящих писем на наличие такой записи. Результат этой проверки дописывается в заголовок письма. В дальнейшем это можно использовать для подсчета оценки вероятности спама или просто наблюдать результат в почтовом клиенте (при наличии такой возможности у него).
Есть разные реализации, - здесь использован скрипт на Python.
Установка (в консоли):
# apt-get install postfix-policyd-spf-python
Настройка в конфигах
Кроме того в файле
/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
Ответы на вопросы могут быть такими:
- Handle the configuration file automaticaly? - Yes
- User tu run clamav-milter as: - clamav
- Groups for clamav-milter (space-separated): - (ничего - просто Enter)
- Communications interface with Sendmail - inet:7357@127.0.0.1
- Group owner of clamav-milter local (UNIX) socket: - clamav
- Creation mode for clamav-milter local (UNIX) socket: - 600
- Remove stale socket after unclean shutdown - Yes
- Wait timeout for data coming from clamd - 120 (можно увеличить, например до 240)
- Should clamav-milter stay in foreground (not forking)? - No
- Chroot to directory - (ничего - просто Enter)
- Pid file (оставляем как есть) - /var/run/clamav/clamav-milter.pid
- Temporary directory path (предлагает "/tmp") - очищаем предложенное и Enter. Будет используется $TEMPDIR или $TEMP.
- Clamav socket to connect to for scanning: - unix:/var/run/clamav/clamd.ctl
- Host excludes for scanning: - хосты, которые исключить из сканирования. Если оставить пустым, то вся почта будет сканироваться, - оставляем пустым.
- Mail address whitelist: - пусто
- Action to perform on infected messages (что делать если найдено зараженное письмо): - Reject (550)
- Action to perform on error conditions (если ошибка: таймаут, ошибка сканера, нарушение структуры данных и т.п.) - Reject
- Specific rejection reason for infected messages (сообщение для ответа на зараженное письмо): Virus detected: "%v". Mail delivery error (reject from virus scanner).
- Add headers to processed messages? - Add
- Log-file for clamav-milter: - /var/log/clamav/clamav-milter.log
- Disable log file locking? - Yes
- Maximum size of the log file (MB) - 50
- Log time with each message? - Yes
- Use system logger? - No
- Type of the syslog messages - LOG_LOCAL6
- Enable verbose logging? (подробное логгирование) - No
- Information to log on infected messages - Full
- Information to log if no threat is found - Off
- 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 = 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. А теперь добавилось "
В письме присланном снаружи должны присутствовать строки заголовка подобные следующим:
...
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
/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
Файлы
Комментируем один из них (в том же конфиге):
... #mail.info -/var/log/mail.info ...
Отключение логгирования почтовых событий в syslog (тот же конфиг):
... #*.*;auth,authpriv.none -/var/log/syslog *.*;auth,authpriv,mail.none -/var/log/syslog ...
После этого в консоли:
Создадим скрипт ротации логов
# 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.
В следующем конфиге (
- 20-imap.conf
- 20-lmtp.conf
- 15-lda.conf
- 20-managesieve.conf
ВАЖНО! В конфигах
В конфиге
Но сначала создадим необходимые каталоги (в консоли):
# 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/
После всех остальных настроек (в конфиге ниже), папки в каталоге
/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), то
Побочным эффектом всей схемы является проблема при принудительном перемещении писем в Отправленные через MUA (например мышью в web-интерфейсе) - некоторые из таких писем просто попадают во "Входящие". Эта проблема может быть частично решена через
За подробностями еще раз настоятельно рекомендую обратиться к этой заметке.
В этом процессе задействованы:
- 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" файла с именем почтового ящика (описанного выше формата) будет запускаться скрипт
Создаем задание наблюдения за удалением файлов в служебной папке в 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 - наблюдать за папкой "Отправленные" (
# 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 успел создать
Если
/usr/lib/dovecot/dovecot-lda ... - закоментированная строка отправляет приветственное письмо через
ВАЖНО! Строки, отвечающие за удаление
Создадим скрипт, который будет вызываться по событию в папках "Отправленные"
# 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) - попадут в папку "Отправленные" к тому, от чьего имени они были отправлены. А письма, которые были отправлены от незарегистрированных пользователей - попадут в специальный ящик для таких писем. Это позволит четко контролировать отправляемую почту, в т.ч. и контролировать возможный захват почтовых инструментов спамерами.
Для проверки можно завести ящик пользователя
Продолжим.
/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 = ... - должны быть ОДНОЙ строкой (без переносов)!
Кроме того, в этом конфиге надо использовать только
/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 требует полноценной
Качаем, распаковываем в папку плагинов:
# 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}'
Источники
Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
Установка и настройка почтового сервера
2015-11-13 в 09:23:01
Добрый день. есть проблема в roundcubemail не подключаются plugins не один не работает. в чем может быть дело? Все кроме plugins функционирует нормально.
2015-11-13 в 11:52:35
2 алексей
Трудно сказать, слишком много может быть причин. Посмотрите логи Apache и самого roundcube (предварительно только пропишите параметр $rcmail_config['debug_level'] = 1;)
2016-05-14 в 21:57:07
Здравствуйте.
У нас сервер на Debian 7, используется dovecot и postfix. Скажите, пожалуйста, где в этом случае стоит искать логи по всей отправляемой через функцию php mail почте?
2016-05-15 в 06:21:17
Борис.
Видимо здесь /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 может сохранять свои логи у себя в каталоге.
2016-05-16 в 16:06:49
Спасибо, 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, где это прописывается?
2016-05-16 в 18:18:41
Борис.
Судя по домену это панель управления сервером (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".
Добавлено:
Выше речь шла об отправителе.
А получателя (адресата) надо искать в скриптах сайта.
2016-05-17 в 09:23:34
Здравствуйте! Спасибо.
А если я просто поменяю значение 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 не проходит
2016-05-17 в 14:29:12
Спасибо.
Нашёл файл etc/mail/virtusertable, в котором была запись вида info@somesite.ru virtuser_501
затёр её, сохранил файл, но в логах всё равно пишется что отсылается абоненту virtuser_501somesite.ru. Надо etc/mail/virtusertable.db обновить? Как?
2016-05-17 в 18:15:37
Обновил 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"
Как можно создать этого неизвестного юзера в локальной таблице реципиентов?
2016-05-17 в 20:28:38
Борис.
Судя по всему у Вас настройка почты была сделана с помощью панели ISPmanager.
Наверное имело бы смысл сделать перенастройку через нее же.
А вообще, если сможете, лучше пройтись по всей этой статье, по всем нужным конфигам и настроить почту нормально вручную (т.е. не только mydomain и myhostname, но и все остальное).
2016-05-18 в 13:43:04
Попробовал пошаманить в 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 и дело с концом? :)
2016-05-18 в 15:38:24
Вы знаете, письма в файле var/mail/info есть, видимо squirellmail неправильно настроен. С чего бы начать проверки?
2016-05-18 в 18:13:07
Борис
У Вас не совсем та конфигурация, которой посвящена эта статья. Трудно сказать что-то определенное, слишком много важных деталей требуют уточнения. Не понятно находится ли Ваш почтовый сервер обслуживающий домен "somesite.ru" там же где и сам сайт, или они на разных машинах в разных местах.
Очевидно почтовый клиент (MUA) должен быть правильно настроен. Если он настроен на доступ по IMAP, то посмотрите в его конфигах имя хоста на который он подключается для доступа к почте. Порт должен быть 143.
После этого Вам нужно проверить что слушает этот порт на той машине где обслуживается нужный хост.
Выполните там команду в консоли "sockstat -l | grep 143"
Далее уже по ситуации
2016-05-21 в 10:35:38
Спасибо. Да, почтовый сервер и сайт на одном 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?
2016-05-21 в 17:25:07
Борис.
По Вашему последнему вопросу - да, сервер судя по всему видит в письме подмену отправителя. Вам нужно настроить все так, чтобы чтобы отправитель был корректный, из Вашего домена.
2016-05-24 в 13:25:23
Спасибо за документацию.
Пробую настроить сервер и получил ошибку:
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) ?
2016-05-24 в 15:44:34
Проверьте, есть ли в /etc/postfix/main.cf строки
Так же проверьте /etc/dovecot/conf.d/10-master.conf
Перезапустите posfix и dovecot
2016-05-31 в 16:39:21
Здравствуйте.
Посмотрите 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 и т.д.
Спасибо за доку.
2016-05-31 в 21:34:06
Vladimir
Доработка скрипта возможно оправдана, но тогда "userdomain=(${1//@/ })" имеет смысл вынести перед "if [[..."
Сертификаты здесь без ошибок.
Webmin напрямую не относится к теме этой заметки.
Но в любом случае спасибо за дополняющий комментарий.
2016-05-31 в 22:03:25
Скрипт доработан с целью вылавливания отсутствия прав на запись файла. У меня такое было.Скрип выполнился а что сделал не понятно.
https://letsencrypt.org/ делает сертификат который авторизуется другой компанией на весь сервер для почти любых сервисов на сервере. Очень удобно.
Для Ubuntu 16.04 есть еще фича с MySQL он уже 5.7 и нужно:
в /etc/mysql/conf.d/mysql.cnf добавить:
[mysqld] - этого нет в фале надо добавить
.....
sql_mode = 'NO_ENGINE_SUBSTITUTION' - до добавить именно в mysqld
Народ сильно ругался по этому поводу.
2016-05-31 в 22:50:56
Vladimir
Не могли бы Вы поподробнее рассказать про MySQL.
Не совсем понятно о чем речь.
2017-10-28 в 01:30:45
В скрипте "/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]}" слеш не нужен. А так материал очень полезный, огромное спасибо.
2017-10-28 в 01:37:01
Еще хотел добавить что в "/etc/dovecot/acl/domain.tld/Sent" все же должно быть owner lrwstpei, а не owner lrwstpe. Иначе Roundcube, и не только, при отправке письма ругается что не может сохранить письмо в отправленные.
2017-10-28 в 03:51:59
Kostya
Спасибо за замечания.
По поводу "owner lrwstpei" - принимается (исправил).
По поводу слеша - странно, должно работать со слешем.
2017-10-28 в 03:59:33
Хотя видимо Вы все таки правы, т.к. это аргумент скрипта /etc/dovecot/sent_refilter.sh в котором получится двойной слеш.
Спасибо!