Авг 182011
 

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