В этой статье я опишу свой мануал по установке почтовика Postfix в связке с базой юзеров MySql и виртуальными почтовыми ящиками. Статья может быть не точная,но я буду по мере выяснения неточностей добавлять и исправлять ее. И так начнем с установки основных компонентов,считаем что Mysql сервер у нас уже установлен и работает:
apt-get install postfix postfix-mysql postfix-doc mysql-client libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql courier-pop courier-authlib-mysql
После установки основных компонентов, приступаем к настройки конфигов:
1)Идем в /etc/default/ и открываем файл saslauthd. В нем исправляем строчку START=no на START=yes
2)Создадим базу данных.Например с помощью PhpMyAdmin.Создадим базу с именем например mail. Перейдем в нее и выполним там след запросы(вырезаны из дампа):
CREATE TABLE IF NOT EXISTS `admin` ( `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `superadmin` tinyint(1) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Admins'; CREATE TABLE IF NOT EXISTS `alias` ( `address` varchar(255) NOT NULL, `goto` text NOT NULL, `domain` varchar(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`address`), KEY `domain` (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Aliases'; CREATE TABLE IF NOT EXISTS `alias_domain` ( `alias_domain` varchar(255) NOT NULL, `target_domain` varchar(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`alias_domain`), KEY `active` (`active`), KEY `target_domain` (`target_domain`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Aliases'; CREATE TABLE IF NOT EXISTS `config` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL DEFAULT '', `value` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='PostfixAdmin settings' AUTO_INCREMENT=2 ; INSERT INTO `config` (`id`, `name`, `value`) VALUES (1, 'version', '1284'); CREATE TABLE IF NOT EXISTS `domain` ( `domain` varchar(255) NOT NULL, `description` varchar(255) CHARACTER SET utf8 NOT NULL, `aliases` int(10) NOT NULL DEFAULT '0', `mailboxes` int(10) NOT NULL DEFAULT '0', `maxquota` bigint(20) NOT NULL DEFAULT '0', `quota` bigint(20) NOT NULL DEFAULT '0', `transport` varchar(255) NOT NULL, `backupmx` tinyint(1) NOT NULL DEFAULT '0', `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Domains'; INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `maxquota`, `quota`, `transport`, `backupmx`, `created`, `modified`, `active`) VALUES ('ALL', '', 0, 0, 0, 0, '', 0, '2012-03-15 11:41:59', '2012-03-15 11:41:59', 1); CREATE TABLE IF NOT EXISTS `domain_admins` ( `username` varchar(255) NOT NULL, `domain` varchar(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Domain Admins'; CREATE TABLE IF NOT EXISTS `fetchmail` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `mailbox` varchar(255) NOT NULL, `src_server` varchar(255) NOT NULL, `src_auth` enum('password','kerberos_v5','kerberos','kerberos_v4','gssapi','cram-md5','otp','ntlm','msn','ssh','any') DEFAULT NULL, `src_user` varchar(255) NOT NULL, `src_password` varchar(255) NOT NULL, `src_folder` varchar(255) NOT NULL, `poll_time` int(11) unsigned NOT NULL DEFAULT '10', `fetchall` tinyint(1) unsigned NOT NULL DEFAULT '0', `keep` tinyint(1) unsigned NOT NULL DEFAULT '0', `protocol` enum('POP3','IMAP','POP2','ETRN','AUTO') DEFAULT NULL, `usessl` tinyint(1) unsigned NOT NULL DEFAULT '0', `extra_options` text, `returned_text` text, `mda` varchar(255) NOT NULL, `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `log` ( `timestamp` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `username` varchar(255) NOT NULL, `domain` varchar(255) NOT NULL, `action` varchar(255) NOT NULL, `data` text NOT NULL, KEY `timestamp` (`timestamp`), KEY `domain_timestamp` (`domain`,`timestamp`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Log'; CREATE TABLE IF NOT EXISTS `mailbox` ( `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `name` varchar(255) CHARACTER SET utf8 NOT NULL, `maildir` varchar(255) NOT NULL, `quota` bigint(20) NOT NULL DEFAULT '0', `local_part` varchar(255) NOT NULL, `domain` varchar(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`username`), KEY `domain` (`domain`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes'; CREATE TABLE IF NOT EXISTS `quota` ( `username` varchar(255) NOT NULL, `path` varchar(100) NOT NULL, `current` bigint(20) DEFAULT NULL, PRIMARY KEY (`username`,`path`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `quota2` ( `username` varchar(100) NOT NULL, `bytes` bigint(20) NOT NULL DEFAULT '0', `messages` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE IF NOT EXISTS `vacation` ( `email` varchar(255) NOT NULL, `subject` varchar(255) CHARACTER SET utf8 NOT NULL, `body` text CHARACTER SET utf8 NOT NULL, `activefrom` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00', `activeuntil` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00', `cache` text NOT NULL, `domain` varchar(255) NOT NULL, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`email`), KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Vacation'; CREATE TABLE IF NOT EXISTS `vacation_notification` ( `on_vacation` varchar(255) CHARACTER SET latin1 NOT NULL, `notified` varchar(255) CHARACTER SET latin1 NOT NULL, `notified_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`on_vacation`,`notified`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Postfix Admin - Virtual Vacation Notifications'; ALTER TABLE `vacation_notification` ADD CONSTRAINT `vacation_notification_pkey` FOREIGN KEY (`on_vacation`) REFERENCES `vacation` (`email`) ON DELETE CASCADE;
Не забудьте создать пользователя для нашей базы и задать ему права на базу.
Далее будем считать что база наша называется mail, пользователь БД postfix и пароль 123456
3)Настраиваем сам Postfix. Переходим в папку /etc/postfix и правим файл main.cf примерно до такого вида:
mail_owner = postfix myhostname = dmail.lan mydomain = dmail.lan myorigin = /etc/mailname unknown_local_recipient_reject_code = 550 mynetworks_style = host mynetworks = 127.0.0.0/8, 192.168.0.4 smtpd_helo_required = yes smtpd_delay_reject = yes virtual_gid_maps = static:5000 virtual_mailbox_base = /home/vmail virtual_uid_maps = static:5000 virtual_transport = virtual transport_maps = mysql:/etc/postfix/mysql-virtual_transports.cf virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_base = /home/vmail smtpd_client_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_reverse_client_hostname permit smtpd_helo_restrictions = permit_mynetworks permit_sasl_authenticated reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname permit smtpd_sender_restrictions = permit_mynetworks reject_non_fqdn_sender reject_unlisted_sender reject_unknown_sender_domain reject_sender_login_mismatch permit_sasl_authenticated permit smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_pipelining reject_non_fqdn_recipient reject_unknown_recipient_domain reject_unauth_destination reject_unlisted_recipient permit smtpd_data_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_pipelining permit smtpd_end_of_data_restrictions = permit_mynetworks permit_sasl_authenticated reject_multi_recipient_bounce permit smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = smtp_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtp_use_tls = no smtpd_sasl_path = smtpd smtpd_use_tls = yes disable_vrfy_command = yes smtp_tls_note_starttls_offer = yes smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.cert smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom readme_directory = /usr/share/doc/postfix html_directory = /usr/share/doc/postfix/html smtpd_helo_required = yes relayhost = mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = inet_interfaces = all inet_protocols = ipv4
Меняем имя почтовой системы и адреса сетевых интерфейсов на свои!
Теперь создаем там же файлы с содержимым(не забываем свои данные подставлять):
а)mysql_virtual_alias_maps.cf
user = mail_admin password = 1234321 hosts = 127.0.0.1 dbname = mail table = alias select_field = goto where_field = address
б)mysql_virtual_mailbox_limit_maps.cf
user = mail_admin password = 1234321 hosts = 127.0.0.1 dbname = mail table = mailbox select_field = quota where_field = username #additional_conditions = and active = '1'
в)mysql-virtual_transports.cf
user = mail_admin password = 1234321 hosts = 127.0.0.1 dbname = mail table = domain select_field = transport where_field = domain
г)mysql_relay_domains_maps.cf
user = mail_admin password = 1234321 hosts = 127.0.0.1 dbname = mail table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '1'
д)mysql_virtual_domains_maps.cf
user = mail_admin password = 1234321 hosts = 127.0.0.1 dbname = mail table = domain select_field = domain where_field = domain additional_conditions = and backupmx = '0' and active = '1'
е)mysql_virtual_mailbox_maps.cf
user = mail_admin password = 1234321 hosts = 127.0.0.1 dbname = mail table = mailbox select_field = maildir where_field = username additional_conditions = and active = '1'
В папке /etc/postfix/sasl/ создаем файл smtpd.conf
pwcheck_method: saslauthd. mech_list: plain login cram-md5 digest-md5 log_level: 7
Создадим пользователей и группы:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
Для работы Saslauthd:
mkdir -p /var/spool/postfix/var/run/saslauthd
В файле /etc/default/saslauthd строчка OPTIONS=»-c -m /var/spool/postfix/var/run/saslauthd» должна выглядеть так.
Создаем или правим файл /etc/pam.d/smtp:
auth required pam_mysql.so user=mail_admin passwd=1234321 host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=1234321 host=localhost db=mail table=mailbox usercolumn=username passwdcolumn=password crypt=1
4)Для получения почты через РОР3 идем в папку /etc/courier и там правим файл authdaemonrc — находим строчку authmodulelist= и приводим ее к виду authmodulelist=»authmysql»
Затем тут в папке правим (если нет — создаем) файл authmysqlrc и приводим к виду(не забываем свои данные писать):
MYSQL_SERVER 127.0.0.1 MYSQL_USERNAME mail_admin MYSQL_PASSWORD 1234321 MYSQL_PORT 3306 MYSQL_DATABASE mail MYSQL_USER_TABLE mailbox MYSQL_CRYPT_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD username MYSQL_HOME_FIELD '/home/vmail' MYSQL_NAME_FIELD name MYSQL_QUOTA_FIELD quota MYSQL_MAILDIR_FIELD maildir
5) Перезагружаем Postfix, sasauthd и courier-pop.
6) Для удобной работы с ящиками рекомендую установить пакет Postfixadmin.Качайте и настраивайте.
По сути,уже должно все работать. Создайте домены и ящики через postfixadmin и пробуйте отправить и принять почту. Для настройки авторизации SMTP через Mysql читайте тут. Простой антиспам для почтового сервер читайте тут.