CREATE TABLE postfix_virtual (
id int(11) unsigned NOT NULL auto_increment,
email varchar(128) NOT NULL default '',
destination varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE postfix_access (
id int(10) unsigned NOT NULL auto_increment,
source varchar(128) NOT NULL default '',
access varchar(128) NOT NULL default '',
type enum('recipient','sender','client') NOT NULL default 'recipient',
PRIMARY KEY (id)
) TYPE=MyISAM ;
Копируем в MySQL содержимое /etc/postfix/aliases:
INSERT INTO postfix_alias VALUES (1,'MAILER-DAEMON','postmaster');
INSERT INTO postfix_alias VALUES (2,'info','postmaster');
INSERT INTO postfix_alias VALUES (3,'marketing','postmaster');
INSERT INTO postfix_alias VALUES (4,'sales','postmaster');
INSERT INTO postfix_alias VALUES (5,'support','postmaster');
INSERT INTO postfix_alias VALUES (6,'abuse','postmaster');
INSERT INTO postfix_alias VALUES (7,'noc','postmaster');
INSERT INTO postfix_alias VALUES (8,'security','postmaster');
INSERT INTO postfix_alias VALUES (9,'daemon','postmaster');
INSERT INTO postfix_alias VALUES (10,'ftp','postmaster');
INSERT INTO postfix_alias VALUES (11,'hostmaster','postmaster');
INSERT INTO postfix_alias VALUES (12,'lp','postmaster');
INSERT INTO postfix_alias VALUES (13,'mail','postmaster');
INSERT INTO postfix_alias VALUES (14,'news','postmaster');
INSERT INTO postfix_alias VALUES (15,'usenet','news');
INSERT INTO postfix_alias VALUES (16,'uucp','postmaster');
INSERT INTO postfix_alias VALUES (17,'webmaster','postmaster');
INSERT INTO postfix_alias VALUES (18,'www','webmaster');
INSERT INTO postfix_alias VALUES (19,'root','yourmail@yourdomain.ru');
Теперь создадим пользователя, от которого будет работать вся наша виртуальная почта:
# The above line must be fitted in one line DONT FORGET
smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-sender.cf
smtpd_client_restrictions = check_client_access mysql:/etc/postfix/mysql-client.cf
# If you want to use TLS add three lines below
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/postfix.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: vmailuser
sql_passwd: password123
sql_database: mail
sql_select: select clear from postfix_users where email='%u@%r' and smtpaccess='Y'
Отправляем письмо куда-нибудь (echo test|mail -s test root), убеждаемся что связь с MySQL работает.
Локальная доставка
ujo@ujo ~ $ telnet hermesus 25
Trying 192.168.0.10...
Connected to hermesus.
Escape character is '^]'.
220 supermail.domain.ru ESMTP Postfix
EHLO guys
250-supermail.domain.ru
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250 8BITMIME
MAIL FROM: <ujo@domain.ru>
250 Ok
RCPT TO: <ujo@test.com>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
test
.
250 Ok: queued as 92541152023
quit
221 Bye
Connection closed by foreign host.
Здесь всё намного проще: база MySQL у нас уже есть, осталось только настроить Courier-IMAP.
Также вписываем в /etc/courier-imap/authdaemon.conf
authmodulelist="authmysql"
и редактируем /etc/courier-imap/authdaemon-mysql.conf:
И — специфика ALT — висываем в /etc/sysconfig/courier-imap
DEFAULT_AUTHD=mysql
Редактируем файлы pop3d, imapd, pop3d-ssl, imapd-ssl в /etc/courier-imap. Везде вписываем нужный нам ADDRESS и меняем строчки вида POP3DSTART=no на POP3DSTART=yes
запускаем authdaemon и другие:
service courier-authdaemon start
service courier-pop3d start
service courier-pop3d-ssl start
service courier-imapd start
service courier-imapd-ssl start
Проверка:
ujo@ujo ~ $ telnet 192.168.0.13 110
Trying 192.168.0.13...
Connected to 192.168.0.13.
Escape character is '^]'.
+OK Hello there.
user ujo@test.com
+OK Password required.
pass mypassword
+OK logged in.
quit
+OK Bye-bye.
POP3 работает.
ujo@ujo ~ $ telnet 192.168.0.13 143
Trying 192.168.0.13...
Connected to 192.168.0.13.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998–2004 Double Precision, Inc. See COPYING for distribution information.
0 login ujo@test.com mypassword
0 OK LOGIN Ok.
1 logout
* BYE Courier-IMAP server shutting down
1 OK LOGOUT completed
IMAP тоже.
FAM
Для полноценной работы Courier-IMAP нужен демон FAM. Редактируем /etc/xinetd.d/sgi_fam, исправляем disable = yes на disable = no, и — это ошибка fam или xinetd — закомментируем строку only_from в /etc/xinetd.conf3
Отстрел проблем
maildrop не умеет делать chdir в директорию пользователя, если там есть хоть малейшая ошибка. Даже если это впередистоящий пробел.
В случае каких-либо проблем хорошо смотреть в /var/lib/mysql/log/queries — туда MySQL пишет все проходящие через него запросы. Как правило, это даёт понимание, что пошло не так.
1 Так как MySQL и Postfix у нас оба работает в chroot, то следует писать именно 127.0.0.1, а не localhost. Не забудьте закомментировать строку skip-networking в /var/lib/mysql/my.cnf и прикрыть MySQL от внешнего доступа. 2 Строка для авторизации получается так: perl -MMIME::Base64 -e 'print encode_base64(«ujo\@test.com\0ujo\@test.com\0mypassword»),"\n";' 3 На самом деле, это снижает безопасность xinetd, ведь с этой строкой все сервисы xinetd по умолчанию слушают только адрес 127.0.0.1, а не все доступные адреса. Однако, из-за досадной ошибки fam не желает работать со строкой only_from.