Описание настройки связки "Exim + MySQL +Courier-Imap"
Ставим exim с поддержкой mysql
#cd /usr/ports/mail/exim-mysql #make && make install && make clean |
Создаём базу и таблицы для работы сервиса exim по прилагаемым дампам
mysql>CREATE DATABASE exim; |
Дамп базы с таблицами в exim сохраним в файле /usr/local/etc/exim/exim.sql:
-- MySQL dump 10.13 Distrib 6.0.11-alpha, for portbld-freebsd8.0 (i386) -- -- Host: localhost Database: exim -- ------------------------------------------------------ -- Server version 6.0.11-alpha /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `aliases` -- DROP TABLE IF EXISTS `aliases`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `aliases` ( `to_user` varchar(128) NOT NULL DEFAULT '', `recipients` text, PRIMARY KEY (`to_user`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `aliases` -- LOCK TABLES `aliases` WRITE; /*!40000 ALTER TABLE `aliases` DISABLE KEYS */; INSERT INTO `aliases` VALUES ('admin@exim.local','serge@exim.local'); /*!40000 ALTER TABLE `aliases` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `domains` -- DROP TABLE IF EXISTS `domains`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `domains` ( `domainname` varchar(128) NOT NULL DEFAULT '', `type` enum('LOCAL','RELAY','VIRTUAL') DEFAULT 'LOCAL', PRIMARY KEY (`domainname`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `domains` -- LOCK TABLES `domains` WRITE; /*!40000 ALTER TABLE `domains` DISABLE KEYS */; INSERT INTO `domains` VALUES ('exim.local','LOCAL'),('local','LOCAL'),('exim','LOCAL'); /*!40000 ALTER TABLE `domains` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `users` -- DROP TABLE IF EXISTS `users`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `users` ( `id` varchar(64) NOT NULL DEFAULT '', `full_name` varchar(128) NOT NULL DEFAULT '', `passwd` varchar(64) NOT NULL DEFAULT '', `uid` int(5) unsigned DEFAULT '26', `gid` int(5) unsigned DEFAULT '26', `home` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '/var/mail/exim/', `active` enum('Y','N') DEFAULT 'Y', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `users` -- LOCK TABLES `users` WRITE; /*!40000 ALTER TABLE `users` DISABLE KEYS */; INSERT INTO `users` VALUES ('skuleshov@exim.local','eto Ja','1234567',26,26,'/var/mail/exim/','Y'),('skuleshov@local','JA','1234567',26,26,'/var/mail/exim/','Y'),('skuleshov@exim','JA','1234567',26,26,'/var/mail/exim/','Y'),('serega@local','JA','1234567',26,26,'/var/mail/exim/','Y'); /*!40000 ALTER TABLE `users` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2010-10-13 20:31:54 |
Создаем наши таблички в базе:
mysql>mysql -hlocalhost -utoot -ppassword exim < exim.sql |
Создаем пользователя sqlmail и присваиваем ему полные права на базу exim:
mysql>GRANT ALL PRIVILEGES ON exim.* TO exim@localhost IDENTIFIED BY 'exim' WITH GRANT OPTION; |
После чего редактируем конфиг exim - /usr/local/etc/exim/configure:
primary_hostname = exim.local hide mysql_servers = localhost/exim/exim/exim domainlist local_domains = ${lookup mysql{SELECT domainname FROM domains WHERE domainname='${domain}' AND (type='LOCAL' OR type='VIRTUAL')}} domainlist relay_to_domains = ${lookup mysql{SELECT domainname FROM domains WHERE domainname='${domain}' AND type='RELAY'}} hostlist relay_from_hosts = localhost : 127.0.0.1 : 192.168.0.0/24 : 10.0.2.15 acl_smtp_rcpt = acl_check_rcpt acl_smtp_data = acl_check_data qualify_domain = local allow_domain_literals = false exim_user = mailnull exim_group = mail #never_users = host_lookup = * rfc1413_hosts = * rfc1413_query_timeout = 5s ignore_bounce_errors_after = 2d timeout_frozen_after = 7d begin acl acl_check_rcpt: accept hosts = : deny message = Restricted characters in address domains = +local_domains local_parts = ^[.] : ^.*[@%!/|] deny message = Restricted characters in address domains = !+local_domains local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ accept domains = +local_domains endpass message ="Tut net takogo" verify = recipient accept domains = +relay_to_domains endpass message = unknown user verify = recipient accept hosts = +relay_from_hosts # control = submission accept authenticated = * # control = submission accept acl_check_data: accept begin routers dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : 10.0.2.15 no_more system_aliases: driver = redirect allow_fail allow_defer data = ${lookup{$local_part}lsearch{/etc/aliases}} user = mailnull group = mail file_transport = address_file pipe_transport = address_pipe userforward: driver = redirect check_local_user # local_part_suffix = +* : -* # local_part_suffix_optional file = $home/.forward # allow_filter no_verify no_expn check_ancestor file_transport = address_file pipe_transport = address_pipe reply_transport = address_reply condition = ${if exists{$home/.forward} {yes} {no} } mysqluser: driver = accept condition = ${if eq{} {${lookup mysql{SELECT home FROM users WHERE id='${quote_mysql:$local_part@$domain}' OR id='${quote_mysql:@$domain}'}}}{no}{yes}} transport = mysql_delivery
#localuser: # driver = accept # check_local_user # local_part_suffix = +* : -* # local_part_suffix_optional # transport = local_delivery # cannot_route_message = Unknown user begin transports remote_smtp: driver = smtp mysql_delivery: driver = appendfile check_string = "" create_directory delivery_date_add directory = ${lookup mysql{SELECT CONCAT(home, '${local_part}@${domain}') FROM users WHERE id='${local_part}@${domain}'}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0600 #local_delivery: # driver = appendfile # file = /var/mail/$local_part # delivery_date_add # envelope_to_add # return_path_add # group = mail # user = $local_part # mode = 0660 # no_mode_fail_narrower address_pipe: driver = pipe return_output address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add address_reply: driver = autoreply begin authenticators auth_plain: driver = plaintext public_name = PLAIN server_condition = ${lookup mysql{SELECT id FROM users \ WHERE id = '${quote_mysql:$1}' \ AND passwd = '${quote_mysql:$2}' \ AND active ='Y'}{yes}{no}} server_prompts = : server_set_id = $2 auth_login: driver = plaintext public_name = LOGIN server_condition = ${lookup mysql{SELECT id FROM users \ WHERE id = '${quote_mysql:$1}' \ AND passwd = '${quote_mysql:$2}' \ AND active = 'Y'}{yes}{no}} server_prompts = Username:: : Password:: server_set_id = $1 auth_cram_md5: driver = cram_md5 public_name = CRAM-MD5 server_secret = ${lookup mysql{SELECT passwd FROM users \ WHERE id = '${quote_mysql:$1}' \ AND active = 'Y'}{$value}fail} server_set_id = $1
# End of Exim configuration file |
Проверим корректность конфига командой exim -bV.
Если нет ошибок - то продолжаем, если есть - исправлям.
Добавляем в /etc/rc.conf строку exim_enable="YES" и sendmail_enable="NONE"(не использовать sendmail), после чего стартуем exim:
#/usr/local/etc/rc.d/exim start |
Теперь сервер готов принимать почту. Для проверки можно отправить самому себе письмо с консоли:
#mail -s test_e_mail skuleshov@local < /usr/local/etc/exim/configure |
После чего надо идем в папку /var/mail/exim и смотрим наличие внутри папки с именем пользователя, а в ней файл письма в папке NEW. Если всё нормально - идём дальше, нет - смотрим логи - /var/log/exim/maillog и устраняем ошибки.
Теперь осталось научить его отдавать почту клиентам. Для этого ставим courier-imap:
#cd /usr/ports/mail/courier-imap #make && make install && make clean |
В появившемся окошке с опциями нам нужно только одно - поддержка авторизации MySQL. По окончании настройки настраиваем, но не сам courier-imap, a courier-authlib которого он за собой тащит при установке.
Редактируем файл /usr/local/etc/authlib/authmysqlrc. Должно получится так:
MYSQL_SERVER localhost MYSQL_USERNAME exim MYSQL_PASSWORD exim MYSQL_PORT 3306 MYSQL_DATABASE exim MYSQL_USER_TABLE `users` MYSQL_CLEAR_PWFIELD `passwd` MYSQL_UID_FIELD 26 MYSQL_GID_FIELD 26 MYSQL_LOGIN_FIELD `id` MYSQL_NAME_FIELD `full_name` MYSQL_MAILDIR_FIELD CONCAT('/var/mail/exim/', `id`) DEFAULT_DOMAIN local |
После чего добавляем следующие строки в /etc/rc.conf для запуска imap и pop:
courier_imap_pop3d_enable="YES" courier_imap_imapd_enable="YES" courier_authdaemond_enable="YES" |
И запускаем службы:
#cd /usr/local/etc/rc.d #./courier-authdaemond start #./courier-imap-imapd start #./courier-imap-pop3d start |
Всё, готово.