В /etc/hostname – имя сервера БЕЗ имени домена
1 |
# cat /etc/hostname |
1 |
app02 |
В /etc/mailname – полное доменное имя(FQDN)
1 |
# cat /etc/mailname |
1 |
app02.example.com |
1.Установка необходимого программного обеспечения
Ubuntu
1 |
# apt-get install mail-server^ |
1 |
Postfix->Internet site->FQDN |
1 |
Dovecot –>Yes(создаем SSL-сертификат)->FQDN |
Устанавливаем поддержку MySQL для Postfix и Dovecot.
Пакет php5-imap нужен для PostfixAdmin.
Пакет php5-mcrypt – для Roundcube.
1 |
# apt-get install postfix-mysql dovecot-mysql php5-imap php5-mcrypt |
Debian
1 |
# apt-get install postfix postfix-mysql libsasl2-modules libsasl2-modules-sql |
1 |
# apt-get install dovecot-mysql dovecot-pop3d dovecot-imapd |
1 |
# apt-get install php5-imap php5-mcrypt |
Включаем/проверяем поддержку IMAP-модуля в php
1 |
# php5enmod imap |
1 |
# ls -al /etc/php5/fpm/conf.d/ | grep imap |
1 |
lrwxrwxrwx 1 root root 26 Май 15 14:26 20-imap.ini -> ../mods-available/imap.ini |
Аналогично для модуля mcrypt
1 |
# php5enmod mcrypt |
1 |
# ls -al /etc/php5/fpm/conf.d/ | grep mcrypt |
1 |
lrwxrwxrwx 1 root root 28 Июн 11 2014 20-mcrypt.ini -> ../mods-available/mcrypt.ini |
1 |
# service php5-fpm restart |
2.Создание пользователя для обработки почтовых каталогов виртуальных пользователей
1 |
# useradd -r -u 1150 -g mail -d /var/vmail -s /sbin/nologin -c "Virtual maildir handler" vmail |
1 |
# mkdir /var/vmail |
1 |
# chmod 770 /var/vmail/ |
1 |
# chown vmail:mail /var/vmail/ |
3.Установка и настройка PostfixAdmin
Создаем базу и пользователя с доступом к этой базе
1 |
# mysql -u root –p |
1 |
mysql> create database postfix; |
1 |
mysql> grant all privileges on postfix.* to postfixuser@'localhost' identified by 'postfixpassword'; |
1 |
mysql> flush privileges; |
Загружаем,распаковываем и переименовываем Postfixadmin
1 |
# cd /usr/share/nginx/html/ |
1 |
wget -O postfixadmin.tar.gz https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.93/postfixadmin-2.93.tar.gz/download |
1 |
# tar xvfz postfixadmin.tar.gz |
1 |
# mv postfixadmin-2.93 postfixadmin |
1 |
# cp postfixadmin/config.inc.php postfixadmin/config.inc.php~ |
Владельца и группу изменяем на пользователя, под которым запускается php-процесс.
1 |
# chown -R nginx:nginx postfixadmin/ |
Настройка конфигурационного файла PostfixAdmin config.inc.php
1 |
# nano postfixadmin/config.inc.php |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$CONF['configured'] = true; $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfixuser'; $CONF['database_password'] = 'postfixpassword'; $CONF['database_name'] = 'postfix'; $CONF['admin_email'] = 'admin@example.com'; $CONF['smtp_server'] = 'localhost'; $CONF['smtp_port'] = '25'; $CONF['encrypt'] = 'md5crypt'; $CONF['dovecotpw'] = "/usr/bin/doveadm pw"; $CONF['default_aliases'] = array ( 'abuse' => 'admin@example.com', 'hostmaster' => 'admin@example.com', 'postmaster' => 'admin@example.com', 'webmaster' => 'admin@example.com' ); $CONF['vacation_domain'] = 'autoreply. example.com'; $CONF['footer_text'] = 'Return to app02.example.com'; $CONF['footer_link'] = 'http://app02.example.com'; |
http://app02.example.com /postfixadmin/setup.php
Вводим пароль, получаем hash-пароля типа
a4f398dccd5fa03bf91a9dc09989d450:dcad5f57fcce7d27fbc62e7314ac91061337328
и вводим его в конфиге postfixadmin
1 |
# nano postfixadmin/config.inc.php |
1 |
$CONF['setup_password'] = 'a4f398dccd5fa03bf91a9dc09989d450:dcad5f57fcce7d27fbc62e7314ac91061337b297'; |
После чего по ссылке http://app02.example.com/postfixadmin/setup.php
Вводим установочный пароль в строке Setup password
В строке Administrator – вводим учетную запись админиcтратора admin@example.com
В строках пароль и подтверждение пароля вводим пароль админской учетки
После чего заходим под админской учеткой
http://app02.example.com /postfixadmin/login.php
На вкладке сборщик почты/fetchmail может возникнуть ошибка:
1 2 3 4 |
DEBUG INFORMATION: Invalid query: FUNCTION postfix.FROM_BASE64 does not exist Check your error_log for the failed query. Please check the documentation and website for more information |
Решение которой приведено здесь
https://sourceforge.net/p/postfixadmin/discussion/676076/thread/38548a28/
В файле model/PFAHandler.php строку
1 2 |
$base64_decode = "FROM_BASE64(###KEY###)"; заменить на строку |
1 |
$base64_decode = "###KEY###"; |
Создаем тестовый
Домен — virtualdomain.com
Email ящик — user1@virtualdomain.com
После установки PostfixAdmin удаляем/переименовываем файл setup.php
1 |
# rm -f /usr/share/nginx/html/postfixadmin/setup.php |
4.Настройка Dovecot
Настройка Dovecot на использование MySQL
1 |
# cp /etc/dovecot/conf.d/auth-sql.conf.ext /etc/dovecot/conf.d/auth-sql.conf.ext~ |
1 |
# nano /etc/dovecot/conf.d/auth-sql.conf.ext |
1 2 3 4 5 6 7 8 9 |
passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } |
Настройка параметров соединения с базой данных MySQL
1 |
# cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext~ |
1 |
# nano /etc/dovecot/dovecot-sql.conf.ext |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
driver = mysql connect = host=localhost dbname=postfix user=postfixuser password=postfixpassword default_pass_scheme = MD5-CRYPT user_query = \ SELECT '/var/vmail/%d/%n' as home, 'maildir:/var/vmail/%d/%n' as mail, \ 1150 AS uid, 8 AS gid, concat('dirsize:storage=', quota) AS quota \ FROM mailbox WHERE username = '%u' AND active = '1' password_query = \ SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, \ 'maildir:/var/vmail/%d/%n' as userdb_mail, 1150 as userdb_uid, 8 as userdb_gid \ FROM mailbox WHERE username = '%u' AND active = '1' |
1150 – uid пользователя vmail
1 |
# cat /etc/passwd | grep vmail |
1 |
vmail:x:1150:8:Virtual maildir handler:/var/vmail:/sbin/nologin |
8 – gid группы mail
1 |
# cat /etc/group | grep mail |
1 |
mail:x:8: |
Настройка Dovecot на чтение SQL-конфигурации
1 |
# cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf~ |
1 |
# nano /etc/dovecot/conf.d/10-auth.conf |
1 2 3 4 |
disable_plaintext_auth = no auth_mechanisms = plain login #!include auth-system.conf.ext !include auth-sql.conf.ext |
Настройка Dovecot – в каком формате хранить почту виртуальных пользователей
1 |
# cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf~ |
1 |
# nano /etc/dovecot/conf.d/10-mail.conf |
1 2 3 |
mail_location = maildir:/var/vmail/%d/%n mail_uid = vmail mail_gid = mail |
Настройка Dovecot на поддержку SSL-шифрования
1 |
# cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf~ |
1 |
# nano /etc/dovecot/conf.d/10-ssl.conf |
1 2 3 4 5 6 |
ssl = yes ssl_cert = </etc/dovecot/dovecot.pem ssl_key = </etc/dovecot/private/dovecot.pem # Отключаем небезопасные протоколы ssl_protocols = !SSLv2 !SSLv3 ssl_cipher_list = ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS |
Проверка наличия ключа и сертификата Dovecot(создаются автоматически при установке Dovecot сроком действия на 10 лет)
1 |
# ls -al /etc/dovecot/private/ | grep .pem |
1 |
-rw------- 1 root dovecot 1708 Май 15 14:24 dovecot.pem |
1 |
# ls -al /etc/dovecot/ | grep .pem |
1 |
-rw-r--r-- 1 root dovecot 1379 Май 15 14:24 dovecot.pem |
Настройка Dovecot для
1 |
# cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf~ |
1 |
# nano /etc/dovecot/conf.d/10-master.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
service auth { unix_listener auth-userdb { mode = 0666 user = vmail group = mail } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } } |
Устновка postmaster-адреса
1 |
# nano /etc/dovecot/conf.d/15-lda.conf |
1 |
postmaster_address = postmaster@example.com |
Отключаем прослушивание ipv6 интерфейсов
1 |
# nano /etc/dovecot/dovecot.conf |
1 2 3 4 |
!include_try /usr/share/dovecot/protocols.d/*.protocol listen = * base_dir = /var/run/dovecot/ login_greeting = Dovecot ready |
Настройка логирования Dovecot(включаем yes на время тестирования)
1 |
# cp /etc/dovecot/conf.d/10-logging.conf /etc/dovecot/conf.d/10-logging.conf~ |
1 |
# nano /etc/dovecot/conf.d/10-logging.conf |
1 2 3 4 5 |
log_path = /var/log/dovecot.log auth_verbose = yes auth_debug = yes mail_debug = yes verbose_ssl = yes |
1 |
# chown -R vmail:dovecot /etc/dovecot/ |
1 |
# chmod -R o-rwx /etc/dovecot/ |
1 |
# touch /var/log/dovecot.log |
1 |
# chmod 664 /var/log/dovecot.log |
1 |
# chown dovecot:mail /var/log/dovecot.log |
1 |
# service dovecot status |
1 |
dovecot is running |
.
1 |
# service dovecot restart |
1 |
Restarting IMAP/POP3 mail server: dovecot. |
1 |
# ps ax | grep dovecot |
1 2 3 4 5 |
41081 ? Ss 0:00 /usr/sbin/dovecot -c /etc/dovecot/dovecot.conf 41084 ? S 0:00 dovecot/anvil 41085 ? S 0:00 dovecot/log 41087 ? S 0:00 dovecot/config 41092 pts/3 S+ 0:00 grep dovecot |
1 |
# doveconf –n |
– просмотр сделанных изменений в конфигцрационных файлах Dovecot
1 |
# doveconf –a |
– просмотр всех настроек Dovecot
5.Настрйока Postfix
1 |
# cp /etc/postfix/main.cf /etc/postfix/main.cf~ |
1 |
# nano /etc/postfix/main.cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no append_dot_mydomain = no #delay_warning_time = 4h readme_directory = no # SASL settings # Use Dovecot to authenticate. smtpd_sasl_type = dovecot # Referring to /var/spool/postfix/private/auth smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = smtpd_sasl_exceptions_networks = $mynetworks smtpd_sasl_authenticated_header = yes # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3 smtp_tls_note_starttls_offer = yes smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom smtpd_tls_security_level = may smtp_tls_security_level = may #SMTPD parameters unknown_local_recipient_reject_code = 450 maximal_queue_lifetime = 7d minimal_backoff_time = 1000s maximal_backoff_time = 8000s smtp_helo_timeout = 60s smtpd_recipient_limit = 16 smtpd_soft_error_limit = 3 smtpd_hard_error_limit = 12 ## Requirements for the HELO statement #smtpd_helo_restrictions = permit_mynetworks, # warn_if_reject reject_non_fqdn_hostname, # reject_invalid_hostname, # permit ## Requirements for the sender details smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit ## Requirements for the connecting server smtpd_client_restrictions = reject_rbl_client sbl.spamhaus.org, reject_rbl_client blackholes.easynet.nl #smtpd_data_restrictions = reject_unauth_pipelining smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, permit # This is a new option as of Postfix 2.10, and is required in addition to # smtpd_recipient_restrictions for things to work properly in this setup. smtpd_relay_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, permit #smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination |
Эта настройка
1 |
smtpd_relay_restrictions |
применима только для Postfix начиная с версии 2.10
т.е она применима для Ubuntu
1 |
# cat /etc/issue |
1 |
Ubuntu 14.04.2 LTS \n \l |
1 |
# postconf mail_version |
1 |
mail_version = 2.11.0 |
и НЕ применима для Debian 7
1 |
# cat /etc/issue |
1 |
Debian GNU/Linux 7 \n \l |
1 |
# postconf mail_version |
1 |
mail_version = 2.9.6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
myhostname = app02.example.com alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = app02.example.com, localhost.example.com, , localhost relayhost = #mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mynetworks = 127.0.0.0/8 mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = ipv4 #Virtual users virtual_mailbox_domains = mysql:/etc/postfix/sql/vdomains.cf virtual_mailbox_base = /var/vmail virtual_mailbox_maps = mysql:/etc/postfix/sql/vmailbox.cf virtual_alias_maps = mysql:/etc/postfix/sql/valias.cf virtual_minimum_uid = 1150 virtual_uid_maps = static:1150 virtual_gid_maps = static:8 # Tell postfix to hand off mail to the definition for dovecot in master.cf virtual_transport = dovecot dovecot_destination_recipient_limit = 1 |
1 |
# cp /etc/postfix/master.cf /etc/postfix/master.cf~ |
1 |
# nano /etc/postfix/master.cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
smtp inet n - - - - smtpd submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject # -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination -o milter_macro_daemon_name=ORIGINATING smtps inet n - - - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject # -o smtpd_relay_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING # Integration with Dovecot - hand mail over to it for local delivery, and # run the process under the vmail user and mail group. dovecot unix - n n - - pipe flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(recipient) |
1 |
# mkdir /etc/postfix/sql |
1 |
# nano /etc/postfix/sql/vdomains.cf |
1 2 3 4 5 6 7 8 9 |
user = postfixuser password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '0' and active = '1' #query = select domain from domain where domain='%s' and backupmx = 0 and active = 1 |
1 |
# nano /etc/postfix/sql/valias.cf |
1 2 3 4 5 6 7 8 9 |
user = postfixuser password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = alias select_field = goto where_field = address additional_conditions = and active = '1' #query = select goto from alias where address='%s' AND active = 1 |
1 |
# nano /etc/postfix/sql/vmailbox.cf |
1 2 3 4 5 6 7 8 9 |
user = postfixuser password = postfixpassword hosts = 127.0.0.1 dbname = postfix table = mailbox select_field = CONCAT(domain,'/',maildir) where_field = username additional_conditions = and active = '1' #query = select username from mailbox where username='%s' AND active = '1' |
Проверем синтаксис Postfix, перезапускаем Postfix
1 |
# postfix check |
1 |
# service postfix restart |
1 2 |
Stopping Postfix Mail Transport Agent: postfix. Starting Postfix Mail Transport Agent: postfix. |
1 |
# ps ax | grep postfix |
1 2 |
20202 ? Ss 0:00 /usr/lib/postfix/master 20208 pts/1 S+ 0:00 grep postfix |
Проверяем корректность выборки
1 |
# postmap -q user1@virtualdomain.com mysql:/etc/postfix/sql/vmailbox.cf |
1 |
virtualdomain .com/virtualdomain.com/user1/ |
1 |
# postmap -q virtualdomain.com mysql:/etc/postfix/sql/vdomains.cf |
1 |
virtualdomain.com |
После отладки выключаем подробное логирование в Dovecot
1 |
# nano /etc/dovecot/conf.d/10-logging.conf |
1 2 3 4 |
auth_verbose = no auth_debug = no mail_debug = no verbose_ssl = no |
1 |
# service dovecot restart |
6.Установка и настройка Roundcube
Создаем базу и пользователя с доступом к этой базе
1 |
mysql> create database roundcube; |
1 |
mysql> grant all privileges on roundcube.* to roundcubeuser@'localhost' identified by 'roundcubepassword'; |
1 |
mysql> flush privileges; |
1 |
mysql> exit |
Загружаем,распаковываем и переименовываем Roundcube
1 |
# cd /usr/share/nginx/html/ |
wget -O roundcube.tar.gz http://sourceforge.net/projects/roundcubemail/files/latest/download?source=files
1 |
# tar xvfz roundcube.tar.gz |
1 |
# mv roundcubemail-* roundcube |
Владельца и группу изменяем на пользователя, под которым запускается php-процесс.
1 |
# chown -R nginx:nginx /usr/share/nginx/html/roundcubemail/ |
Импортируем базу roundcube
1 |
# mysql -u root -p roundcube < roundcubemail/SQL/mysql.initial.sql |
Начинаем установку через Web-интерфейс
http://<ip-adress server>/roundcube/installer/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
localhost – database server roundcube – database name roundcubeuser – database user name roundcubepassword – database password . IMAP Setting IMAP host – localhost Default_port – 143 SMTP Settings Smtp_server – localhost Smtp_port 25 |
CREATE Config
The config file was saved successfully into RCMAIL_CONFIG_DIR directory of your Roundcube installation.
Continue
Далее тестируем SMTP и IMAP конфигурации
С созданным ранее через PostfixAdmin аккаунтом user1@virtualdomain.com
После чего удаляем папку установки Roundcube
1 |
# rm -rf /usr/share/nginx/html/roundcube/installer/ |
Доступ к Roundcube
http://app02.example.com/roundcube
Для переноса PostfixAdmin и/или Roundcube на https в вирт.хосте Nginx хоста по умолчанию,который обслуживает имя сервера/IP-адрес сервера добавляем принудительное перенаправление с http на https
1 2 3 4 5 6 7 |
server { …………. if ( $scheme = "http" ) {rewrite ^/(.*)$ https://$host/$1 permanent; } ……. } |
После установки Roundcube присутствует только папка «Входящие». Для полноценной работы не хватает папок «Удаленные», «Исходящие», и т.д. Это создает определенные проблемы. Например, при удалении письма, получаем следующее сообщение о ошибке: «Не удалось переместить сообщение».
Добавить необходимые папки можно в настройках. Там же можно указать, какие папки использовать как специальные («особые папки»).
Однако это не очень удобно, необходимо эти манипуляции выполнять с каждым аккаунтом. Необходимо как-то автоматизировать этот процесс. Для этого необходимо немного поправить конфигурационный файл config.inc.php, добавив в него такую строку:
|
1 |
# nano /etc/dovecot/conf.d/20-imap.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
protocol imap { ................. mail_plugins = $mail_plugins autocreate } # At the end of file paste following code plugin { autocreate = Trash autocreate2 = Junk autocreate3 = Drafts autocreate4 = Sent autosubscribe = Trash autosubscribe2 = Junk autosubscribe3 = Drafts autosubscribe4 = Sent } |
1 |
# service dovecot restart |
Источники:
https://www.exratione.com/2014/05/a-mailserver-on-ubuntu-1404-postfix-dovecot-mysql/
http://thelinuxforce.org/article/7
https://wiki.archlinux.org/index.php/Virtual_user_mail_system
http://serion.co.nz/howto/howto-setup-mailserver-using-postfix-mysql-dovecot-postfixadmin-amavis-new
http://muff.kiev.ua/content/roundcube-avtomaticheskoe-sozdanie-papok