В этой статье мы рассмотрим настройку полноценного почтового сервера.
В качестве связки я выбрал exim+dovecot+mysql+roundcube+spamprobe.
Связка довольно таки мощная, на настройку у меня ушло 3 дня 🙂 А все началось с того что мой postfix начал меня сильно раздражать.
Итак приступим.
Домен: slik45.kiev.ua
IP сервера: 193.110.79.79
Обратите внимание согласно RFC, необходимо, чтобы «прямая» и «обратная» запись в ДНС совпадали. Тоесть в нашем случае, необходимо чтобы запись slik45.kiev.ua «резолвилась» в IP-адресс сервера 193.110.79.79, а PTR-запись 193.110.79.79 была установлена в slik45.kiev.ua.
#host slik45.kiev.ua slik45.kiev.ua has address 193.110.79.79
#host 193.110.79.79 79.79.110.193.in-addr.arpa domain name pointer slik45.kiev.ua.
Тут у нас все отлично, теперь проверям чтобы были прописаны mx-записи
#dig MX slik45.kiev.ua ; <<>> DiG 9.6.-ESV-R3 <<>> MX slik45.kiev.ua ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29509 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 8 ;; QUESTION SECTION: ;slik45.kiev.ua. IN MX ;; ANSWER SECTION: slik45.kiev.ua. 14195 IN MX 10 <strong>mail.slik45.kiev.ua</strong>. ;; AUTHORITY SECTION: slik45.kiev.ua. 26038 IN NS ns11.uadns.com. slik45.kiev.ua. 26038 IN NS ns10.uadns.com. slik45.kiev.ua. 26038 IN NS ns12.uadns.com. ;; ADDITIONAL SECTION: mail.slik45.kiev.ua. 5361 IN A <strong>193.110.79.79</strong> ns10.uadns.com. 332 IN A 213.186.114.9 ns10.uadns.com. 60 IN AAAA 2002:d5ba:7209::2131:8611:4009 ns11.uadns.com. 332 IN A 82.144.221.156 ns11.uadns.com. 60 IN AAAA 2002:5290:dd9c::821:4422:1156 ns12.uadns.com. 332 IN A 85.10.199.46 ns12.uadns.com. 332 IN A 46.38.174.75 ns12.uadns.com. 60 IN AAAA 2a01:4f8:62:2123::2 ;; Query time: 19 msec ;; SERVER: 193.93.160.1#53(193.93.160.1) ;; WHEN: Thu Aug 18 18:05:20 2011 ;; MSG SIZE rcvd: 283
Вот мы все проверили, все записи у нас в полном порядке.
Приступаем к установке и настройке почты.
cd /usr/ports/mail/exim-mysql/ && make install clean
У нас появляется окно с выбором опций
Options for exim 4.76 [ ] ALT_CONFIG_PREFIX Restrict the set of configuration files [X] AUTH_CRAM_MD5 Enable CRAM-MD5 authentication mechanisms [X] AUTH_DOVECOT Enable Dovecot authentication mechanisms [X] AUTH_PLAINTEXT Enable plaintext authentication [ ] AUTH_RADIUS Enable radius (RFC 2865) authentication [ ] AUTH_SASL Enable use of Cyrus SASL auth library [X] AUTH_SPA Enable Secure Password Authentication [X] CDB Enable CDB-style lookups [Х] CONTENT_SCAN Enable exiscan email content scanner [X] DAEMON Install scripts to run as a daemon [ ] DCC Enable DCC at ACL support via dccifd [ ] DEBUG Build with debugging symbols [X] DISABLE_D_OPT Disable macros overrides using option -D [X] DNSDB Enable DNS-style lookups [X] DSEARCH Enable directory-list lookups [X] EMBEDDED_PERL Enable embedded Perl interpreter [ ] EXIMON Build eximon monitor (require XFree86!) [X] ICONV Enable header charset conversion [ ] IPV6 Enable IPv6 support [ ] KAS Build with Kaspersky AntiSpam local scan [X] LMTP RFC2033 SMTP over command pipe transport [X] LSEARCH Enable wildcarded-file lookups [X] MAILDIR Enable Maildir mailbox format [X] MAILSTORE Enable Mailstore mailbox format [X] MBX Enable MBX mailbox format [X] MYSQL Link against libmysqlclient library [X] NIS Enable NIS-style lookups [X] OLD_DEMIME Enable old, deprecated demime ACL [ ] OPENLDAP Link against libldap [X] PAM Enable PAM authentication mechanisms [ ] PASSWD Enable /etc/passwd lookups [ ] PGSQL Link against libpq [X] READLINE Enable readline(3) library [ ] SASLAUTHD Enable use of Cyrus SASL auth daemon [ ] SA_EXIM SA-Exim support [ ] SO_1024 Build with Spamooborona-1024 local scan [X] SPF Enable Sender Policy Framework checking [ ] SQLITE Enable SQLite lookups [X] SRS Enable Sender Rewriting Scheme [ ] SRS_ALT Enable alternative SRS library [X] SUID Install the exim binary suid root [ ] TCP_WRAPPERS Enable /etc/hosts.allow access control [X] TLS Link against OpenSSL [ ] WISHLIST Include the unsupported patches [ ] XCLIENT Enable XCLIENT command in exim
Выбрали необходимые нам параметры и продолжаем установку.
После того как exim скомпилился, идем в его домашний каталог, и правим конфиг до такого состояния.
cd /usr/local/etc/exim/ && ee configure ############################################################################ # Runtime configuration file for Exim # # MAIN CONFIGURATION SETTINGS # ############################################################################ primary_hostname = slik45.kiev.ua # Список доменов, которые будут жить у нас на сервере. Выборка доменов у нас будет идти из базы данных domainlist local_domains = ${lookup mysql{SELECT domain FROM domains WHERE domain='${domain}' AND (type='LOCAL' OR type='VIRTUAL')}} # Список доменов, для которых разрешен релей через данный сервер. Выборка делается из БД MySQL. domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains WHERE domain='${domain}' AND type='RELAY'}} # Черный список, проще говоря спамеры 🙂 hostlist spamers = ${lookup mysql{SELECT senders FROM blacklist_host WHERE senders='${sender_host_address}'}} # Список сетей, которым будет разрешена отправка без авторизации. hostlist relay_from_hosts = localhost : 127.0.0.1 : 192.168.0.0/24 : 1.1.1.0/24 : 192.168.162.94 : 193.110.79.79 # Квота для почтовых ящиков, мало ли что может случиться, может кто то захочет фильм по почте отправить. GET_QUOTA=${lookup mysql{SELECT quota FROM users WHERE login='${local_part}' AND domain='${domain}'}{${value}M}} # Задаем квотирование. MAILDIR_SIZE=${eval:${sg{${sg{${readfile{/var/exim/$domain/$local_part/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}0+500K} # Тут мы указываем какие порты слушает <strong>Exim</strong>. daemon_smtp_ports = 25 : 465 # Указываем, что на порту 465 будет TLS-шифрование. tls_on_connect_ports = 465 # Перечисляем, для каких хостов будет доступно TLS-шифрование. tls_advertise_hosts = * # Указываем путь к сертификату и ключу шифрования. tls_certificate = /etc/ssl/certs/mail.pem tls_privatekey = /etc/ssl/certs/mail.pem # Выбираем, что будем логировать # + - писать в логи, # - - Не писать в логи. # +all_parents - все входящие соединения # +lost_incoming_connections - потеряные входящие соединения # +received_sender - отправитель # +received_recipients - получатель # +smtp_confirmation - подтверждения SMTP # +smtp_syntax_error - ошибки синтаксиса SMTP # +smtp_connection - соединение SMTP # +smtp_protocol_error - ошибки протокола SMTP # -queue_run - работа очереди (замороженные мессаги) log_selector = +all_parents +lost_incoming_connection +received_sender +received_recipients +smtp_confirmation +smtp_syntax_error +smtp_connection +smtp_protocol_error -queue_run # Убираем из логов временную метку Exim`a - её ставит syslogd syslog_timestamp = no # Задаем acl для проверки почты. acl_smtp_rcpt = acl_check_rcpt acl_smtp_data = acl_check_data # "Цепляем" антивирус. Указываем путь к сокету Clamav. av_scanner = clamd:/var/run/clamav/clamd.sock # Доверенные пользователи. trusted_users = www # Имя домена добавляемое для локальных отправителей (пользователей системы). # Тоесть почта отправляемая от root, будет root@$qualify_domain. qualify_domain = slik45.kiev.ua # Cписок IP-адресов интерфейсов, которые ожидаются запросы. local_interfaces = 127.0.0.1 : 192.168.0.1 : 1.1.1.1 : 193.110.79.79 # Принимать ли почту вида имя_пользователя@IP-адрес. allow_domain_literals = false # Имя пользователя и групы, от имени которых будет работать Exim. exim_user = mailnull exim_group = mail # В целях безопасности запрещаем работу от root-а. never_users = root # Когда доставка сообщения задерживается, Exim посылает предупреждающее # письмо отправителю, с указанными интервалами. delay_warning = 4h:8h:24h:48h # При генерации сообщения об ошибка "вкладывать" не все сообщение, а # "кусок", указанного размера. return_size_limit = 50k # Резолвить DNS-имена перечисленных хостов. host_lookup = * # Таймаут для резолвинга идентификатора пользователя на удаленной машине. rfc1413_hosts = * rfc1413_query_timeout = 0s # Принудительна синхронизация команд. Не принимать команды от удаленного # сервера "потоком". smtp_enforce_sync = true # Контроль повторяющихся строк логов. syslog_duplication = false # Разрешить, чтобы МХ указывал на IP-адрес. allow_mx_to_ip # Уничтожать недоставленные рикошеты, если они "старше" указанного времени. ignore_bounce_errors_after = 2d # Какой промежуток времени хранить "замороженные" сообщения. timeout_frozen_after = 2d # Максимальный размер письма. message_size_limit = 10M # Ограничение на максимальной количество одновременных входящих сообщений. smtp_accept_max = 50 # Ограничение на максимальное количество сообщений в одной сесию. smtp_accept_max_per_connection = 20 # Ограничение на максимальное количество сообщений с одного хоста. smtp_accept_max_per_host = 20 # Количество соединений по стеку TCP/IP. smtp_connect_backlog = 50 # Класть в очередь, при большем числе сообщений за одну сесию. smtp_accept_queue_per_connection = 30 # Максимальное количество СМТП-доставок на одно сообщение. remote_max_parallel = 15 # Разбиение каталога спула. Увеличивает производительность. split_spool_directory = true # "Приветствие" сервера. smtp_banner = "$primary_hostname ESMTP Exim Mail Server" # Параметры соединения с БД MySQL: server/database/username/password. hide mysql_servers = localhost/exim/exim/<strong>ваш_пароль</strong> ############################################################################ # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ############################################################################ system_filter = /usr/local/etc/spamprobe/exim.filter begin acl acl_check_rcpt: # Запрещаем письма содержащие в локальной части символы @; %; !; /; |. deny message = "Illegal characters are in an address." domains = +local_domains local_parts = ^[.] : ^.*[@%!/|] # Запрещаем недопустимые символы для нелокальных получателей. deny message = "Illegal characters are in an address." domains = !+local_domains local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ # Запрещаем прием почты с определенных доменов. С них жестко СПАМ идет. # orange.fr deny message = "All email from *.orange.fr - discarded!" condition = ${if match{$sender_helo_name}{.orange.fr}{yes}{no}} # mdp2.net deny message = "All email from *.mdp2.net - discarded!" condition = ${if match{$sender_helo_name}{.mdp2.net}{yes}{no}} # mail.comcast.net deny message = "All email from *.mail.comcast.net - discarded!" condition = ${if match{$sender_helo_name}{.mail.comcast.net}{yes}{no}} # libero.it deny message = "All email from *.libero.it - discarded!" condition = ${if match{$sender_helo_name}{.libero.it}{yes}{no}} # ono.com deny message = "All email from *.ono.com - discarded!" condition = ${if match{$sender_helo_name}{.ono.com}{yes}{no}} # wanadoo.fr deny message = "All email from *.wanadoo.fr - discarded!" condition = ${if match{$sender_helo_name}{.wanadoo.fr}{yes}{no}} # Разрешаем отправку, если отправитель находится в "белом списке". accept senders=${lookup mysql{SELECT senders FROM whitelist WHERE senders='${quote_mysql:$sender_address}' OR senders='*@${quote_mysql:$sender_address_domain}' LIMIT 1}} # Запрещаем отправку тем, кто внесен в "черный список". deny message = "Your address in banlist!" senders=${lookup mysql{SELECT senders FROM blacklist WHERE senders='${quote_mysql:$sender_address}' OR senders='*@${quote_mysql:$sender_address_domain}' LIMIT 1}} # Запрещаем отправку тем, кто "достал" и приравнивается к спамеру. deny hosts = +spamers message = "Host rejected by spamers list on slik45.kiev.ua!" # Разрешаем отправку авторизованным пользователям accept authenticated = * # Запрещаем тех, кто не обменивается приветственными сообщениями (HELO/EHLO) deny message = "HELO/EHLO required by SMTP RFC" condition = ${if eq{$sender_helo_name}{}{yes}{no}} # Запрещаем тех, кто в HELO "отдаеат" только цифры deny condition = ${if match{$sender_helo_name}{\N^\d+$\N}{yes}{no}} hosts = !127.0.0.1:!localhost:* message = "There can not be only numbers in HELO!" # Запрещаем тех, кто не пишет отправителя. deny condition = ${if eq{$sender_address}{}{yes}{no}} hosts = +relay_from_hosts message = "Your message have not return address" # Запрещаем тех, кто подставляет свой IP в HELO. deny message = "The use of IP is forbidden in HELO!" hosts = *:!+relay_from_hosts condition = ${if eq{$sender_helo_name} {$sender_host_address}{true}{false}} # Запрещаем использовать наш IP в HELO. deny condition = ${if eq{$sender_helo_name} {$interface_address}{yes}{no}} hosts = !127.0.0.1 : !localhost : * message = "The use of my IP is forbidden!" # Запрещаем прием почты с динамических хостов. deny message = "Dynamic hosts is forbidden!" condition = ${if match{$sender_host_name} {adsl|dialup|pool|peer|dhcp} {yes}{no}} # Запрещаем прием почты с хостов, которые находятся в блэк-листах. deny message = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text hosts = !+relay_from_hosts !authenticated = * log_message = found in $dnslist_domain dnslists = bl.spamcop.net : cbl.abuseat.org : dnsbl.njabl.org : sbl-xbl.spamhaus.org : pbl.spamhaus.org # Проверка существования отправителя. drop message = Rejected - Sender Verify Failed log_message = Rejected - Sender Verify Failed hosts = * !verify = sender/no_details/callout=2m,defer_ok !condition = ${if eq{$sender_verify_failure}{}} # Проверка получателя в локальных доменах. accept domains = +local_domains endpass message = $acl_verify_message verify = recipient # Проверяем получателя в релейных доменах. accept domains = +relay_to_domains endpass message = "Unrouteable address!" verify = recipient/callout=30s,defer_ok,use_postmaster # Разрешаем почту от хостов в релейных доменах. accept hosts = +relay_from_hosts accept authenticated = * deny message = relay not permitted accept # ACL проверки "тела" письма. acl_check_data: # Проверка антивирусом. deny message = This message contains a virus ($malware_name). demime = * malware = */defer_ok accept ###################################################################### # ROUTERS CONFIGURATION # # Specifies how addresses are handled # ###################################################################### # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! # # An address is passed to each router in turn until it is accepted. # ###################################################################### begin routers ### Конфиг SpamProbe ### SP_spam_router: driver = accept domains = +local_domains local_part_prefix = spam transport = SP_spam_transport SP_no_spam_router: driver = accept domains = +local_domains local_part_prefix = no-spam transport = SP_no_spam_transport ### Конец SpamProbe ### # Поиск маршрута к хосту в DNS. Не проверяются 0.0.0.0 и 127.0.0.0/8! dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : 1.1.1.0/24 : 192.168.162.0/24 : 192.168.0.0/24 no_more ### Конфиг SpamProbe ### SP_check_router: driver = accept domains = +local_domains # Расскоментировать строку, если необходима проверка на СПАМ только для определенных пользователей #local_parts = lsearch;/usr/local/etc/spamprobe/users condition = ${if and {{match{$h_X-SpamProbe:}{SPAM}} {!match_address{$sender_address} {lsearch;/usr/local/etc/spamprobe/whitelist}}}} transport = SP_check_transport no_more ### Конец SpamProbe ### # Почтовые алиасы (виртуальные адреса). Выборка делается из БД MySQL. system_aliases: driver = redirect allow_fail allow_defer data = ${lookup mysql{SELECT recipients FROM aliases WHERE (local_part='${local_part}' AND domain='${domain}') OR (local_part='*' AND domain='$domain')ORDER BY local_part='*' LIMIT 1}} # Перенаправления почты в случае необходимости. userforward: driver = redirect check_local_user=false file = /var/exim/$domain/$local_part/forward user = mailnull group = mail allow_filter no_verify no_expn check_ancestor file_transport = address_file pipe_transport = address_pipe reply_transport = address_reply condition = ${if exists{/var/exim/$domain/$local_part/forward}{yes}{no}} # Настройка квотирования. virtual_user_quota_defer: driver = redirect domains = +local_domains condition = ${if and{\ {exists{/var/exim/$domain/$local_part}}\ {exists{/var/exim/$domain/$local_part/maildirsize}}\ {>{GET_QUOTA}{0}}\ {>={MAILDIR_SIZE}{GET_QUOTA}}\ } } data = :fail: Over quota! verify_sender = false allow_fail # Принимаем почту для валидного пользователя. Выборка делается из БД MySQL. virtual_localuser: driver = accept domains = ${lookup mysql{SELECT domain from domains WHERE domain='${domain}'}} local_parts = ${lookup mysql{SELECT login from users WHERE login='${local_part}' AND domain='${domain}'}} transport = local_delivery cannot_route_message = Unknown user ###################################################################### # TRANSPORTS CONFIGURATION # ###################################################################### # ORDER DOES NOT MATTER # # Only one appropriate transport is called for each delivery. # ###################################################################### begin transports ### Конфиг SpamProbe ### SP_check_transport: driver = appendfile maildir_format = true directory = /var/exim/slik45.kiev.ua/spamfilter SP_spam_transport: driver = pipe command = "/usr/local/bin/spamprobe -d /var/db/spamprobe spam" return_path_add = false return_fail_output = true log_output = true user = mailnull group = mail SP_no_spam_transport: driver = pipe command = "/usr/local/bin/spamprobe -d /var/db/spamprobe good" return_path_add = false return_fail_output = true log_output = true user = mailnull group = mail ### Конец SpamProbe### # Доставка на удалённые хосты. remote_smtp: driver = smtp # Локальная доставка. local_delivery: driver = appendfile maildir_use_size_file check_string = "" create_directory delivery_date_add directory = ${lookup mysql{SELECT LOWER(CONCAT('/var/exim/$domain/',login)) FROM users WHERE login='${local_part}' AND domain='${domain}';}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0660 quota = ${lookup mysql{SELECT quota FROM users WHERE login='${local_part}' AND domain='${domain}'}{${value}M}} quota_size_regex = S=(\d+)$ quota_warn_threshold = 80% return_path_add # Транспорт address_pipe: driver = pipe return_output # Запись в файл. address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add # Автоответчик. address_reply: driver = autoreply # В никуда... null_transport: driver = appendfile file = /dev/null ###################################################################### # RETRY CONFIGURATION # ###################################################################### begin retry # Настройка повтора недоставленных писем. * quota * * F,2h,15m; G,16h,1h,1.5; F,4d,6h ###################################################################### # REWRITE CONFIGURATION # ###################################################################### # Секция перезаписи адресов. Не использую. begin rewrite ###################################################################### # AUTHENTICATION CONFIGURATION # ###################################################################### begin authenticators # Секция авторизации. Разные типы авторизации для разных почтовых клиентов. fixed_login: driver = plaintext public_name = LOGIN server_prompts = Username:: : Password:: server_condition = "${if and { \ {!eq{$1}{}} \ {!eq{$2}{}} \ {crypteq{$2}{\\{crypt\\}${lookup mysql{SELECT \ password FROM users \ WHERE login='${local_part:$1}' \ AND domain='${domain:$1}' AND \ smtp_auth='1'}{$value}fail}}} \ } {yes}{no}}" server_set_id = $1 fixed_plain: driver = plaintext public_name = PLAIN server_prompts = : server_condition = "${if and { \ {!eq{$2}{}} \ {!eq{$3}{}} \ {crypteq{$3}{\\{crypt\\}${lookup mysql{SELECT \ password FROM users \ WHERE login='${local_part:$2}' \ AND domain='${domain:$2}' AND \ smtp_auth='1'}{$value}fail}}} \ } {yes}{no}}" server_set_id = $2
Вроде с конфигом все, далее приступаем к созданию базы данных.
mysql> create database exim; Query OK, 1 row affected (0.00 sec) mysql> grant all on exim.* to 'exim'@'localhost' identified by '<strong>Ваш_пароль</strong>'; Query OK, 1 row affected (0.00 sec)
Скачиваем дамп базы и заливаем его
# wget http://slik45.kiev.ua/files/exim.sql # mysql -u exim -p <strong>Ваш_Пароль</strong> exim < exim.sql
Структура БД у нас есть. Теперь заполним ее. По очереди внесем по одной записи в каждую из таблиц.
mysql> use exim; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> INSERT INTO `exim`.`aliases` (`local_part`, `domain`, `recipients`) VALUES ('root', 'slik45.kiev.ua', 'admin@slik45.kiev.ua'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `exim`.`blacklist` (`senders`, `when_added`) VALUES ('a2@socgazeta.com', CURDATE()); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `exim`.`blacklist_host` (`senders`, `when_add`) VALUES ('46.251.227.3', CURDATE()); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO `exim`.`domains` (`domain`, `type`) VALUES ('slik45.kiev.ua', 'LOCAL'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `exim`.`users` (`login`, `name`, `password`, `uid`, `gid`, `domain`, `quota`, `status`, `smtp_auth`) VALUES ('admin', 'admin', ENCRYPT('ваш_пароль'), '26', '6', 'slik45.kiev.ua', '150', '1', '1'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `exim`.`whitelist` (`senders`) VALUES ('not-reply@powertracker.org'); Query OK, 1 row affected (0.00 sec)
Какой же почтовый сервер без поддержки шифрования 🙂
Создадим самоподписной сертификат.
Создадим каталог для сертификата и создадим сертификат.
# mkdir /etc/ssl/certs && cd /etc/ssl/certs # openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/mail.pem -keyout /etc/ssl/certs/mail.pem Generating a 1024 bit RSA private key ...........................................................................................++++++ ....................++++++ writing new private key to '/etc/ssl/certs/mail.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:UA State or Province Name (full name) [Some-State]:Kiev region. Locality Name (eg, city) []:Kiev Organization Name (eg, company) [Internet Widgits Pty Ltd]:slik45.kiev.ua Organizational Unit Name (eg, section) []:IT Common Name (eg, YOUR name) []:slik45.kiev.ua Email Address []:root@slik45.kiev.ua # chown mailnull:mail mail.pem # chmod 440 mail.pem
Теперь пора создать каталог, где будет храниться почта. Ну и не нужно забывать о правах на каталог:
# mkdir /var/exim && chown mailnull:mail /var/exim
Далее редактируем файлик /etc/mail/mailer.conf до такого состояния:
sendmail /usr/local/sbin/exim send-mail /usr/local/sbin/exim mailq /usr/local/sbin/exim -bp newaliases /usr/local/sbin/exim -bi hoststat /usr/local/sbin/exim purgestat /usr/local/sbin/exim
Добавим exim в загрузку, и выключим штатный sendmail
# echo '# Mail Server' >> /etc/rc.conf # echo 'sendmail_enable="NONE"' >> /etc/rc.conf # echo 'exim_enable="YES"' >> /etc/rc.conf # killall sendmail # sh /usr/local/etc/rc.d/exim start
Если все сделали правильно, теперь можно запускать наш exim
#/usr/local/etc/rc.d/exim start
Теперь смотрим в логи и видим такую запись
2011-08-18 19:39:48 exim 4.76 daemon started: pid=56703, -q30m, listening for SMTP on [127.0.0.1]:25 [127.0.0.1]:465 [192.168.0.1]:25 [192.168.0.1]:465 [1.1.1.1]:25 [1.1.1.1]:465 [193.110.79.79]:25 [193.110.79.79]:465
Попробуем отправить тестовое письмо с консоли
# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 slik45.kiev.ua ESMTP Exim Mail Server ehlo slik45.kiev.ua 250-slik45.kiev.ua Hello localhost [127.0.0.1] 250-SIZE 20971520 250-PIPELINING 250-AUTH LOGIN PLAIN 250-STARTTLS 250 HELP mail from: root@slik45.kiev.ua 250 OK rcpt to: admin@slik45.kiev.ua 250 Accepted data 354 Enter message, ending with "." on a line by itself To: admin@slik45.kiev.ua From: root@slik45.kiev.ua Subject: TestMail Test mail. . 250 OK id=1Qu5MJ-0006Sl-00 quit 221 slik45.kiev.ua closing connection Connection closed by foreign host.
На этом этапе с настройкой exim’a заканчиваем, приступаем к настройке Dovecot-а