Конфиг практически один-в-один с твоим в статье "Exim+courier-imap". Привожу:
Код: Выделить всё
###############################################################################
# ОСНОВНЫЕ НАСТРОЙКИ #
###############################################################################
# Определите здесь полное каноническое имя хоста. Если опция не определена, то
# вернет значение, которое найдет функция uname(). В большинстве случаев она
# возвращает правильные значения, и здесь ничего менять не надо.
primary_hostname = mx.server.domain.ru
# Опции подключения к базе MySQL
# Поля: Хост/Имя БД/Пользователь/Пароль
hide mysql_servers = localhost/exim/exim/mailer
# Следующие три опции создают два списка доменов и один список хостов.
# Эти списки понадобятся нам позже, они будут фигурировать в переменных
# +local_domains, +relay_to_domains и +relay_from_hosts. Списки могут быть
# разделены двоеточием. В данном случае списки берутся из БД MySQL.
# Список локальных доменов:
domainlist local_domains = ${lookup mysql{SELECT `domain` FROM `domain` \
WHERE `domain`='${domain}' AND `active`='1'}}
# Список доменов, для которых ваш хост является incoming релеем (т.е., либо
# является шлюзом между доменами или резервным почтовиком):
domainlist relay_to_domains =
# Список хостов, с которых разрешён неавторизованый релей (локалхост и ЛВС):
hostlist relay_from_hosts = localhost : 127.0.0.0/8 : 192.168.0.0/24
# Названия ACL для проверки почты
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
# Если вы скомпилировали exim с поддержкой сканирования контента, то он будет
# автоматически проверять входящие письма на вирусы. Настройки антивируса
# можно поменять в двух местах. Первое - это здесь, где вы определяете,
# каким антивирусом exim будет проверять почту. Обычно используется ClamAV,
# однако, если вы желаете использовать другой антивирус, то обратитесь к
# документации, чтобы узнать как его настроить. Второе место - это опция
# acl_check_data (смотрите ниже).
# Указываем имя демона антивируса и расположение его сокета:
av_scanner = clamd:/var/run/clamav/clamd.sock
# Укажите доменную приставку, добавляемую для локальных отправителей (системных
# пользователей), то есть не содержащих символа @. Я указал в качестве приставки
# доменное имя данного хоста. Таким образом будет понятно, с какой машины было
# отправлено письмо. Мало ли, у меня много серваков, и все письма будут от рута,
# сиди потом думай, кто из них чей рут :)
qualify_domain = mx.server.domain.ru
# Ситуация, противоположная предыдущей - доменная приставка, добавляемая к почте
# для системных пользователей. Если не указана, то берется значение из предыдущего
# пункта.
qualify_recipient =
# Разрешать ли принимать почту с прямых адресов типа user@[10.11.12.13].
allow_domain_literals = false
# Имя, от которого работает процесс exim
exim_user = mailnull
# Группа, от которой работает процесс exim
exim_group = mail
# Запрет работы доставки/приема под пользователем root (можно не только его,
# тогда остальных пишите через двоеточие)
never_users = root : vitaliy
# Данная опция говорит exim'y преобразовывать IP-адреса отправителей в
# DNS-имена. Тут можно указать только определенную подсеть или вообще
# удалить эту настройку.
#host_lookup = 127.0.0.0/8 : 192.168.0.0/24 : *
# Это проверка. Ваш хост спрашивает у удалённого, с которого было подключение,
# а кто, собственно ко мне подключился на такой-то порт? Если на удалённом хосте
# работает identd - он может ответить (а может и не ответить - как настроить),
# скажет UID пользователя от которого установлено соединение, тип ОС, и имя
# пользователя.
# Короче, если rfc1413_hosts поставить * то будет проверять все.
# Если rfc1413_query_timeout поставить 0, то не будет ждать ответа ни от кого. По
# вышеописанным причинам - отключаем.
#rfc1413_hosts = *
rfc1413_query_timeout = 0s
# Если сообщение не было доставлено, то генерируется соощение об ошибке.
# Если же и сообщение об ошибке не удалось доставить, то оно "замораживается"
# на указанный в этом пункте срок, после чего снова следует попытка доставить
# его. При очередной неудаче сообщение удаляется.
ignore_bounce_errors_after = 1h
# Здесь указывается, через какое время удаляются "замороженные" сообщения
# (находящиейся в очереди), и отсылается сообщение об ошибке.
timeout_frozen_after = 1d
# Адреса (через запятую), на которые отсылаются уведомления о замороженных
# сообщениях.
freeze_tell = administrator@domain.ru
# Список хостов, почта от которых принимается несмотря на ошибки в HELO/EHLO.
helo_accept_junk_hosts = 192.168.0.0/24 : 127.0.0.0/8 : localhost
# Максимальное число сообщений, принимаемое за одно соединение от удалённого
# сервера (или пользователя).
smtp_accept_max_per_connection = 10
# Для увеличения производительности директория `spool` разбивается на 62
# субдиректории, имена которым 0-9, A-Z и a-z, - это ускоряет обработку.
split_spool_directory = true
# Если у сообщения много адресатов на удалённых хостах, то запускатеся (до
# указанного ниже значения) количество параллельных процессов доставки.
remote_max_parallel = 15
# Приветствие сервера
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
# При генерации сообщения об ошибке прикладывать не всё сообщение, а кусок
# (от начала письма) указанного размера.
return_size_limit = 50k
# Максимальный размер отправляемого сообщения
message_size_limit = 10M
# Разрешаем неположенные символы в HELO
helo_allow_chars = _
# Принудительное ожидание ответа от сервера. Если отправитель торопится
# подавать команды, не дождавшись ответа, то он посылается далеко и надолго.
# Тем самым можно зарезать некоторое количество спама.
smtp_enforce_sync = false
# Обозначим, что надо писать в лог ("+" - писать в лог, "-" - не писать):
# all_parents - все входящие
# connection_reject - разорванные соединения
# incoming_interface - IP-адрес отправителя
# lost_incoming_connections - потеряные входящие соединения
# received_sender - отправитель
# received_recipients - получатель
# smtp_confirmation - подтверждения SMTP
# smtp_syntax_error - ошибки синтаксиса SMTP
# smtp_protocol_error - ошибки протокола SMTP
# queue_run - сообщения в очереди (замороженные мессаги)
log_selector = \
+all_parents \
+connection_reject \
+incoming_interface \
+lost_incoming_connection \
+received_sender \
+received_recipients \
+smtp_confirmation \
+smtp_syntax_error \
+smtp_protocol_error \
-queue_run
# Убираем собственную временную метку exim`a из логов, её ставит
# сам syslogd.
syslog_timestamp = no
###############################################################################
# КОНФИГУРАЦИЯ ACL #
###############################################################################
### Определение списков контроля доступа для входящих SMTP сообщений
#------------------------------------------------------------------------------
begin acl
# Данный контроль используется для каждой RCPT-команды при входящем SMTP
# сообщении. Проверка запускается еще до того, как адрес отправителя будет принят
# или отвергнут.
acl_check_rcpt:
# Принимать все сообщения, которые пришли с локалхоста (не по TCP/IP).
# Символ ':' означает, что в списке один пустой элемент.
accept hosts = :
# Запрет письма, содержащие недопустимы символы в локальной части адреса
# получателя. В качестве получателя - адреса с локальными доменами.
deny message = "Недопустимые символы в адресе"
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
# То же самое, но для нелокальных получателей. И правило менее строгое.
deny message = "Недопустимые символы в адресе"
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
# Принимаем сообщения от хостов, которым разрешен релей через наш сервер.
# А также проверяем сообщения на правильность и, если надо, исправляем их.
# accept hosts = +relay_from_hosts
# control = submission
# Принимать письма только от пользователей, подтвердивших свою подлинность
# посредством аутентификации. Опять же, включена проверка сообщений.
# Включена потому, что в большинстве случаев пользователи отправляют письма
# с помощью MUA, которые делают ошибки при составлении письма. По умолчанию
# аутентификаторы не заданы, поэтому следует их задать, иначе все клиенты
# не смогут авторизоваться и, соответственно, отослать письмо.
accept authenticated = *
control = submission
# Запрещаем письма от тех, кто не пишет HELO/EHLO.
deny message = "HELO/EHLO обязано быть по SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}
# Запрещаем письма от тех, кто вместо HELO/EHLO подставляет свой IP-адрес.
deny message = "Не надо писать свой IP в качестве HELO!"
hosts = * : !+relay_from_hosts
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}
# Запрещаем письма от тех, кто вместо HELO/EHLO подставляет мой IP-адрес.
deny message = "Это мой IP-адрес! Попрошу не писать его в качестве HELO/EHLO."
hosts = !127.0.0.1 : !localhost : *
condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
# Запрещаем письма от тех, кто пишет в HELO/EHLO только цифры.
deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "В HELO/EHLO не могут быть только цифры!"
# Запрещаем письма от хостов с именами, содержащими adsl, dialup, ppp...
deny message = "Что-то не нравится мне имя вашего хоста..."
condition = ${if match{$sender_host_name}\
{adsl|dialup|pool|peer|dhcp}{yes}{no}}
# Запрещаем письма от тех, кто находится в блэк-листах.
deny message = "Ваш почтовый сервер находится в черном списке \
спам-рассылок - $dnslist_domain \n $dnslist_text"
hosts = !127.0.0.0/8 : !localhost : !192.168.0.0/24 : *
dnslists = dynablock.njabl.org : \
dnsbl.njabl.org : \
elays.ordb.org : \
bl-sbl.spamhaus.org : \
dnsbl.net.au : \
dul.ru
# Задержка. Отличный метод борьбы со спамом на не сильно загруженных серверах.
# Спасибо Лиссяре :)
# Задержка по умолчанию 20 секунд
warn
set acl_m0 = 20s
# Для своих доменов ставим задержку в 0 секунд, мы ж не спамеры;)
warn
set acl_m0 = 0s
hosts = +relay_from_hosts : 127.0.0.1 : localhost
# Теперь разрешаем почту для получателей в нашем(-их) домене(-ах).
accept domains = +local_domains
endpass
message = "В этом домене нет такого пользователя"
verify = recipient
# Разрешаем почту от доменов в списке relay_from_hosts
accept hosts = +relay_from_hosts
# Если не подошло ни одно правило - отправитель явно ищет открытый релей.
deny message = "Извините, но бесплатный сыр только в мышеловке. У нас не open relay."
### Определение ACL, проверяющих содержимое писем
#------------------------------------------------------------------------------
acl_check_data:
# Проверяем письма на вирусы
deny malware = *
message = "В теле письма обнаружен вирус - $malware_name"
# "Чистые" письма пропускаем
accept
###############################################################################
# ОПРЕДЕЛЕНИЕ РОУТЕРОВ #
###############################################################################
begin routers
# Поиск маршрута к хосту (не из локальных доменов) на серверах DNS. Если маршрут
# не найден, то получатель считается недействителен и письмо отбрасывается,
# дальнейшие роутеры не проходит (опция no_more).
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : 192.168.0.0/24
no_more
# Роутер проверяет для локальных получателей наличие альяса в указанном файле или
# в базе данных, и, если таковой имеется, то письмо переадресовывается согласно
# транспортам, указанным ниже. Если ничего не найдено, то письмо передается следующему
# роутеру.
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' \
OR `address`='${quote_mysql:@$domain}'}}
mysqluser:
driver = accept
condition = ${if eq{}{${lookup mysql{SELECT `maildir` FROM \
`mailbox` WHERE `username`='${quote_mysql:\
$local_part@$domain}'}}}{no}{yes}}
transport = mysql_delivery
###############################################################################
# КОНФИГУРАЦИЯ ТРАНСПОРТОВ #
###############################################################################
# Только один транспорт вызывается для каждой доставки сообщения.
# Транспорты вызываются роутерами, описанными выше, и то, только если прошли
# проверку адреса.
begin transports
# Доставка на удалённые хосты - по SMTP
remote_smtp:
driver = smtp
# Этот транспорт вызывается роутером 'mysqluser'.
mysql_delivery:
driver = appendfile
check_string = ""
create_directory
delivery_date_add
directory = ${lookup mysql{SELECT CONCAT('/var/mail/exim/', \
`maildir`) FROM `mailbox` WHERE `username`\
='${local_part}@${domain}'}}
directory_mode = 770
envelope_to_add
group = mail
maildir_format
maildir_tag = ,S=$message_size
message_prefix = ""
message_suffix = ""
mode = 0600
# Транспорт, занимающийся доставкой почты в именованные каналы (pipes).
# Управляется роутером redirect.
address_pipe:
driver = pipe
return_output
# Транспорт, занимающийся доставкой почты в файлы в пользовательских папках.
# Управляется роутером redirect. Также добавит к заголовку сообщения поля
# 'Delivery-date:', 'Envelope-to:' и 'Return-path:'.
address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
# Транспорт используется для обработки автоматических ответов.
address_reply:
driver = autoreply
###############################################################################
# КОФИГУРАЦИЯ ПОВТОРОВ #
###############################################################################
begin retry
# Адрес или домен Тип ошибки Повторы
# ----------------- ------ -------
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
###############################################################################
# КОФИГУРАЦИЯ ПРЕОБРАЗОВАНИЯ АДРЕСОВ #
###############################################################################
begin rewrite
###############################################################################
# КОНФИГУРАЦИЯ АУТЕНТИФИКАЦИИ #
###############################################################################
begin authenticators
# Ввиду того, что почтовых клиентов много, и все они аутентифицируются
# по-своему, то и механизмов авторизации три...
# Netscape
auth_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT `username` FROM \
`mailbox` WHERE `username` = \
'${quote_mysql:$1}' AND `password` = \
'${quote_mysql:$2}'}{yes}{no}}
server_prompts = :
server_set_id = $2
# MS Outlook
auth_login:
driver = plaintext
public_name = LOGIN
server_condition = ${lookup mysql{SELECT `username` FROM \
`mailbox` WHERE `username` = \
'${quote_mysql:$1}' AND `password` = \
'${quote_mysql:$2}'}{yes}{no}}
server_prompts = Username:: : Password::
server_set_id = $1
# TheBat
auth_cram_md5:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup mysql{SELECT `password` FROM \
`mailbox` WHERE `username` \
= '${quote_mysql:$1}'}{$value}fail}
server_set_id = $1