В данной статье мы установим и настроим связку Postfix + Dovecot + Postfixadmin. Пользователи будут храниться в MySQL, авторизация пользователей для отправки почты будет осуществляться через Dovecot.
Установка Postfix + Dovecot
Идем в порты
mx# cd /usr/ports/mail/postfix mx# make config
В дополнение к предложенным опциям включаем DOVECOT и MYSQL
---------------------------------------------------------------------¬ ¦ Options for postfix 2.8.2,1 ¦ ¦ -----------------------------------------------------------------¬ ¦ ¦ ¦[X] PCRE Perl Compatible Regular Expressions ¦ ¦ ¦ ¦[ ] SASL2 Cyrus SASLv2 (Simple Auth. and Sec. Layer) ¦ ¦ ¦ ¦[X] DOVECOT Dovecot 1.x SASL authentication method ¦ ¦ ¦ ¦[ ] DOVECOT2 Dovecot 2.x SASL authentication method ¦ ¦ ¦ ¦[ ] SASLKRB5 If your SASL req. Kerberos5 select this option ¦ ¦ ¦ ¦[ ] SASLKMIT If your SASL req. MIT Kerberos5 select this optio¦ ¦ ¦ ¦[ ] TLS Enable SSL and TLS support ¦ ¦ ¦ ¦[ ] BDB Berkeley DB (choose version with WITH_BDB_VER) ¦ ¦ ¦ ¦[X] MYSQL MySQL maps (choose version with WITH_MYSQL_VER) ¦ ¦ ¦ ¦[ ] PGSQL PostgreSQL maps (pick ver. with DEFAULT_PGSQL_VER¦ ¦ ¦ ¦[ ] SQLITE SQLite maps ¦ ¦ ¦ ¦[ ] OPENLDAP OpenLDAP maps (choose ver. with WITH_OPENLDAP_VER¦ ¦ ¦ ¦[ ] LDAP_SASL Enable OpenLDAP client-to-server auth via SASL ¦ ¦ ¦ ¦[ ] CDB CDB maps lookups ¦ ¦ ¦ ¦[ ] NIS NIS maps lookups ¦ ¦ ¦ ¦[ ] VDA VDA (Virtual Delivery Agent 32Bit) ¦ ¦ ¦ ¦[ ] TEST SMTP/LMTP test server and generator ¦ ¦ ¦ ¦[ ] SPF SPF support (via libspf2 1.2.x) ¦ ¦ ¦ ¦[ ] INST_BASE Install into /usr and /etc/postfix ¦ ¦ +-L------------------------------------------------------------------+ ¦ [ OK ] Cancel ¦ L---------------------------------------------------------------------
Далее будет предложено выбрать опции для Dovecot. В дополнение к стандартным включаем MYSQL
---------------------------------------------------------------------¬ ¦ Options for dovecot 1.2.16 ¦ ¦ -----------------------------------------------------------------¬ ¦ ¦ ¦ [X] KQUEUE kqueue(2) support ¦ ¦ ¦ ¦ [X] SSL SSL support ¦ ¦ ¦ ¦ [X] MANAGESIEVE ManageSieve support ¦ ¦ ¦ ¦ [ ] GSSAPI GSSAPI support ¦ ¦ ¦ ¦ [ ] VPOPMAIL VPopMail support ¦ ¦ ¦ ¦ [ ] BDB BerkleyDB support ¦ ¦ ¦ ¦ [ ] LDAP OpenLDAP support ¦ ¦ ¦ ¦ [ ] PGSQL PostgreSQL support ¦ ¦ ¦ ¦ [X] MYSQL MySQL support ¦ ¦ ¦ ¦ [ ] SQLITE SQLite support ¦ ¦ ¦ ¦ ¦ ¦ +-L------------------------------------------------------------------+ ¦ [ OK ] Cancel ¦ L---------------------------------------------------------------------
В конце установки нужно ответить на 2 вопроса Postfix’а
You need user "postfix" added to group "mail". Would you like me to add it [y]? y Would you like to activate Postfix in /etc/mail/mailer.conf [n]? n
Делаем
mx# rehash
Приступаем к редактированию конфига
mx# ee /usr/local/etc/postfix/main.cf
Приводим конфиг к следующему виду
queue_directory = /var/spool/postfix command_directory = /usr/local/sbin daemon_directory = /usr/local/libexec/postfix data_directory = /var/db/postfix mail_owner = postfix myhostname = mx.xxx.org.ua mydomain = xxx.org.ua myorigin = $myhostname inet_interfaces = all mydestination = $myhostname, localhost.$mydomain, localhost local_recipient_maps = unix:passwd.byname $alias_maps unknown_local_recipient_reject_code = 550 mynetworks_style = host mynetworks = 127.0.0.0/8 alias_maps = hash:/etc/mail/aliases alias_database = hash:/etc/mail/aliases smtpd_banner = $myhostname ESMTP $mail_name debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/local/sbin/sendmail newaliases_path = /usr/local/bin/newaliases mailq_path = /usr/local/bin/mailq setgid_group = maildrop html_directory = /usr/local/share/doc/postfix manpage_directory = /usr/local/man sample_directory = /usr/local/etc/postfix readme_directory = /usr/local/share/doc/postfix virtual_mailbox_base = /usr/mail/ virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_minimum_uid = 65534 virtual_uid_maps = static:65534 virtual_gid_maps = static:65534 virtual_transport = dovecot dovecot_destination_recipient_limit = 1 smtpd_sasl_auth_enable = yes smtpd_sasl_exceptions_networks = $mynetworks smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
Создаем директорию для клиентских почтовых ящиков и необходимые файлы
mx# mkdir /usr/mail mx# chmod -R 777 /usr/mail mx# touch /usr/local/etc/postfix/mysql_virtual_alias_maps.cf mx# touch /usr/local/etc/postfix/mysql_virtual_domains_maps.cf mx# touch /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
Редактируем mysql_virtual_alias_maps.cf
user = postfix password = postfixpass hosts = localhost dbname = postfix query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
Редактируем mysql_virtual_domains_maps.cf
user = postfix password = postfixpass hosts = localhost dbname = postfix query = SELECT domain FROM domain WHERE domain='%u'
Редактируем mysql_virtual_mailbox_maps.cf
user = postfix password = postfixpass hosts = localhost dbname = postfix query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'
Инициализируем базу данных алиасов
mx#newaliases
Остается добавить в master.cf dovecot транспорт
mx# ee /usr/local/etc/postfix/master.cf
Добавляем в конец файла
dovecot unix - n n - - pipe flags=DRhu user=nobody:nobody argv=/usr/local/libexec/dovecot/deliver -d ${recipient}
Теперь нужно сделать еще несколько шагов. Отключаем запуск SendMail. Добавляем в /etc/rc.conf
sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO"
Отключаем специфические для Sendmail опции. Создаем файл
mx# touch /etc/periodic.conf
И вносим в него
daily_clean_hoststat_enable="NO" daily_status_mail_rejects_enable="NO" daily_status_include_submit_mailq="NO" daily_submit_queuerun="NO"
После этого перегружаем машину
mx# shutdown -r now
Теперь разрешим автозапуск Postfix’a. Добавим в /etc/rc.conf
postfix_enable="YES"
Стартуем Postfix
mx# /usr/local/etc/rc.d/postfix start
Смотрим логи, чтобы удостровериться что все ОК
mx# tail -F /var/log/maillog
На этом установка и настройка Postfix завершена. Переходим к настройке Dovecot Редактируем /usr/local/etc/dovecot.conf и приводим его к следующему виду:
base_dir = /var/run/dovecot protocols = imap pop3 disable_plaintext_auth = no mail_location = maildir:/usr/mail/%d/%u/ mail_privileged_group = mail dotlock_use_excl = yes verbose_proctitle = yes first_valid_gid = 65534 maildir_copy_with_hardlinks = yes ssl = no protocol imap { imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep } protocol pop3 { pop3_uidl_format = %08Xu%08Xv pop3_client_workarounds = outlook-no-nuls oe-ns-eoh } protocol lda { postmaster_address = [email protected] sendmail_path = /usr/sbin/sendmail } auth_username_format = %Lu auth default { mechanisms = plain login passdb sql { args = /usr/local/etc/dovecot-sql.conf } userdb sql { args = /usr/local/etc/dovecot-sql.conf } user = nobody socket listen { master { path = /var/run/dovecot/auth-master mode = 0666 } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } } dict { } plugin { }
Создадим файл настроек подключения к MySQL
mx# touch /usr/local/etc/dovecot-sql.conf
Отредактируем его
driver = mysql connect = host=localhost dbname=postfix user=postfix password=postfixpass default_pass_scheme = MD5-CRYPT password_query = SELECT password FROM mailbox WHERE username = '%u' user_query = SELECT CONCAT('/usr/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 65534 AS uid, 65534 AS gid FROM mailbox WHERE username = '%u'
Разрешим автозапуск Dovecot’а
dovecot_enable="YES"
Для проверки стартуем Dovecot
mx# /usr/local/etc/rc.d/dovecot start
Далее смотрим логи, в которых мы увидим ошибку коннекта к MySQL, т.к. мы еще не создали необходимые базы
mx# tail -F /var/log/maillog Apr 16 00:05:25 mx dovecot: Dovecot v1.2.16 starting up Apr 16 00:05:25 mx dovecot: auth-worker(default): mysql: Connect failed to localhost (postfix): Access denied for user 'postfix'@'localhost' (using password: YES) - waiting for 1 seconds before retry
Останавливаем Dovecot
mx# /usr/local/etc/rc.d/dovecot stop
Переходим к установке Postfixadmin.
Установка Postfixadmin
mx# cd /usr/ports/mail/postfixadmin mx# make install clean
Опции оставляем по умолчанию
---------------------------------------------------------------------¬ ¦ Options for postfixadmin 2.3.3 ¦ ¦ -----------------------------------------------------------------¬ ¦ ¦ ¦ [X] MYSQL MySQL back-end (use mysql PHP extension) ¦ ¦ ¦ ¦ [ ] MYSQLI MySQL 4.1+ back-end (use mysqli PHP extension) ¦ ¦ ¦ ¦ [ ] PGSQL PostgreSQL back-end (use pgsql PHP extension) ¦ ¦ ¦ ¦ ¦ ¦ +-L------------------------------------------------------------------+ ¦ [ OK ] Cancel ¦ L---------------------------------------------------------------------
Создаем виртуалхост для Postfixadmin’a. Добавляем в /usr/local/etc/apache22/extra/httpd-vhosts.conf
<VirtualHost *:80> ServerAdmin [email protected] DocumentRoot /usr/local/www/postfixadmin ServerName postfixadmin.xxx.org.ua CustomLog /var/log/postfixadmin.xxx.org.ua.access.log combined ErrorLog /var/log/postfixadmin.xxx.org.ua.error.log <Directory /usr/local/www/postfixadmin> Options none AllowOverride AuthConfig Order Deny,Allow Deny from all Allow from all </Directory> </VirtualHost>
Рестартуем apache
mx# /usr/local/etc/rc.d/apache22 restart
Теперь создаем базу и пользователя MySQL
mx# mysql -uroot -p mysql> create database postfix; mysql> grant all on postfix.* to 'postfix'@'localhost' identified by 'postfixpass'; mysql> quit;
Теперь можно стартовать Dovecot, т.к. необходимая база уже создана
mx# /usr/local/etc/rc.d/dovecot start
Идем в /usr/local/www/postfixadmin. Приступаем к редактированию config.inc.php. В данном файле для того, чтобы запустился postfixadmin достаточно изменить следующие секции и привести их к виду:
$CONF['configured'] = true; $CONF['postfix_admin_url'] = 'http://postfixadmin.xxx.org.ua'; $CONF['default_language'] = 'ru'; $CONF['database_type'] = 'mysql'; $CONF['database_host'] = '127.0.0.1'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'postfixpass'; $CONF['database_name'] = 'postfix'; $CONF['database_prefix'] = '';
Остальные опции можно подправить под свои нужды позже. На всякий случай приведу свой полный конфиг этого файла (без комментариев)
<?php $CONF['configured'] = true; $CONF['setup_password'] = 'changeme'; $CONF['postfix_admin_url'] = 'http://postfixadmin.xxx.org.ua'; $CONF['postfix_admin_path'] = dirname(__FILE__); $CONF['default_language'] = 'ru'; $CONF['database_type'] = 'mysql'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfix'; $CONF['database_password'] = 'postfixpass'; $CONF['database_name'] = 'postfix'; $CONF['database_prefix'] = ''; $CONF['database_prefix'] = ''; $CONF['database_tables'] = array ( 'admin' => 'admin', 'alias' => 'alias', 'alias_domain' => 'alias_domain', 'config' => 'config', 'domain' => 'domain', 'domain_admins' => 'domain_admins', 'fetchmail' => 'fetchmail', 'log' => 'log', 'mailbox' => 'mailbox', 'vacation' => 'vacation', 'vacation_notification' => 'vacation_notification', 'quota' => 'quota', 'quota2' => 'quota2', ); $CONF['admin_email'] = '[email protected]'; $CONF['smtp_server'] = 'localhost'; $CONF['smtp_port'] = '25'; $CONF['encrypt'] = 'md5crypt'; $CONF['authlib_default_flavor'] = 'md5raw'; $CONF['dovecotpw'] = "/usr/sbin/dovecotpw"; $CONF['min_password_length'] = 5; $CONF['generate_password'] = 'NO'; $CONF['show_password'] = 'NO'; $CONF['page_size'] = '20'; $CONF['default_aliases'] = array ( 'abuse' => '[email protected]', 'hostmaster' => '[email protected]', 'postmaster' => '[email protected]', 'webmaster' => '[email protected]', 'noc' => '[email protected]', 'root' => '[email protected]', 'admin' => '[email protected]', 'support' => '[email protected]', ); $CONF['domain_path'] = 'YES'; $CONF['domain_in_mailbox'] = 'YES'; $CONF['maildir_name_hook'] = 'NO'; $CONF['aliases'] = '0'; $CONF['mailboxes'] = '0'; $CONF['maxquota'] = '0'; $CONF['quota'] = 'NO'; $CONF['quota_multiplier'] = '1024000'; $CONF['transport'] = 'NO'; $CONF['transport_options'] = array ( 'virtual', // for virtual accounts 'local', // for system accounts 'relay' // for backup mx ); $CONF['transport_default'] = 'virtual'; $CONF['vacation'] = 'NO'; $CONF['vacation_domain'] = 'autoreply.xxx.org.ua'; $CONF['vacation_control'] ='NO'; $CONF['vacation_control_admin'] = 'YES'; $CONF['alias_control'] = 'YES'; $CONF['alias_control_admin'] = 'YES'; $CONF['special_alias_control'] = 'YES'; $CONF['alias_goto_limit'] = '0'; $CONF['alias_domain'] = 'YES'; $CONF['backup'] = 'YES'; $CONF['sendmail'] = 'YES'; $CONF['logging'] = 'YES'; $CONF['fetchmail'] = 'YES'; $CONF['fetchmail_extra_options'] = 'NO'; $CONF['show_header_text'] = 'NO'; $CONF['header_text'] = ':: Postfix Admin ::'; $CONF['user_footer_link'] = "http://postfixadmin.xxx.org.ua/main"; $CONF['show_footer_text'] = 'NO'; $CONF['footer_text'] = 'Go to PhpMyAdmin'; $CONF['footer_link'] = 'http://pma.xxx.org.ua'; $CONF['welcome_text'] = <<<EOM Welcome! Your mailbox was created Best regards, ASY EOM; $CONF['emailcheck_resolve_domain']='YES'; $CONF['show_status']='NO'; $CONF['show_status_key']='NO'; $CONF['show_status_text']=' '; $CONF['show_undeliverable']='NO'; $CONF['show_undeliverable_color']='tomato'; $CONF['show_undeliverable_exceptions']=array("unixmail.domain.ext","exchangeserver.domain.ext","gmail.com"); $CONF['show_popimap']='NO'; $CONF['show_popimap_color']='darkgrey'; $CONF['show_custom_domains']=array("subdomain.domain.ext","domain2.ext"); $CONF['show_custom_colors']=array("lightgreen","lightblue"); $CONF['recipient_delimiter'] = ""; $CONF['create_mailbox_subdirs_prefix']='INBOX.'; $CONF['used_quotas'] = 'NO'; $CONF['new_quota_table'] = 'NO'; $CONF['theme_logo'] = 'images/logo-default.png'; $CONF['theme_css'] = 'css/default.css'; $CONF['xmlrpc_enabled'] = false; if (file_exists(dirname(__FILE__) . '/config.local.php')) { include(dirname(__FILE__) . '/config.local.php'); }
Открываем в браузере http://postfixadmin.xxx.org.ua/setup.php.
Если все правильно настроили, то везде должно быть «OK» и «Done«. В самом низу увидим окно создания админа. Заполняем поля Нажимаем «Добавить администратора«, после чего увидим Копируем последнюю строку, выделенную красным и заменяем ею аналогичную в config.inc.php.
Сохраняем изменения в конфиге.
После этого повторяем процедуру создания аккаунта админа с теми же данными, которые были введены в предыдущем шаге.
Нажимаем «Добавить администратора» и видим сообщение о том, что админ успешно создан.
Открываем в браузере http://postfixadmin.xxx.org.ua и авторизируемся указанием e-mail’а и пароля админа, только что созданного. Войдя в Postfixadmin создаем свой домен, потом своих пользователей. При добавлении пользователя выбираем «Отправить приветственное письмо» для того, чтобы автоматически создалась папка пользователя в /usr/mail.
На этом установка и настройка связки Postfix + Dovecot + Postfixadmin завершена!