Сб. Дек 14th, 2024

В этой статье я опишу свой мануал по установке почтовика 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 читайте тут. Простой антиспам для почтового сервер читайте тут.

 

 

 

от RUSUA

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Анти-спам: выполните заданиеWordPress CAPTCHA