Система
Код: Выделить всё
mail3# uname -a
FreeBSD mail3.loc 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan 3 07:15:25 UTC 2012 root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
Код: Выделить всё
mail3# pkg_info |grep exim
exim-4.77 High performance MTA for Unix systems on the Internet
mail3# pkg_info | grep dovecot
dovecot-1.2.17 Secure and compact IMAP and POP3 servers
exim
Код: Выделить всё
#!/bin/sh
# Имя хоста. Используется в EHLO.
primary_hostname = mail.***.ru
# Вводим данные для подключения к MySQL серверу.
hide mysql_servers = localhost/exim/exim/exim
# Делаем список локальных доменов. Далее этот
# список будет фигурировать в виде +local_domains
domainlist local_domains = ${lookup mysql{SELECT `domain` \
FROM `domain` WHERE \
`domain`='${domain}' AND \
`active`='1'}}
# делаем список доменов с которых разрешены релеи.
domainlist relay_to_domains = ${lookup mysql{SELECT `domain` \
FROM `domain` WHERE \
`domain`='${domain}' AND \
`active`='1'}}
# Составляем список хостов с которых разрешён неавторизованый
# релей.
hostlist relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/16
# Вводим названия acl`ов для проверки почты.
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
# Прикручиваем антивирус - при условии, что exim собран
# с его поддержкой.
#av_scanner = clamd:/var/run/clamav/clamd
# Адрес куда слать на проверку спама (SpamAssasin), но я
# это не юзаю. Не так много у меня спама...
# spamd_address = 127.0.0.1 783
# Имя домена добавляемое для локальных отправителей (реальных
# юзеров системы) т.е. почта отправляемая от root, будет от
# root@домен_указанный_здесь.
qualify_domain = mail.***.ru
# Имя хоста для ситуации, обратной предыдущей
qualify_recipient = mail.***.ru
# А это как раз кусок вышеописанного анахронизма - про почту в
# виде user@[222.222.222.222] - принимать её или нет.
allow_domain_literals = false
# Пользователь от которого работает exim
exim_user = mailnull
# группа в кторой работает exim
exim_group = mail
# запрещаем работу доставки под юзером root - в целях безопасности
never_users = root
# Проверяем соответствие прямой и обратной зон для всех хостов.
#host_lookup = *
rfc1413_query_timeout = 0s
# По дефолту, экзим отфутболивает все `неквалифицированные` адреса,
# состоящие тока из локальной части. Для того чтобы разрешить такие письма
# определённых хостов используются эти директивы:
# для `неквалифицированных` отправителей
sender_unqualified_hosts = +relay_from_hosts
# для `неквалифицированных` получателей
recipient_unqualified_hosts = +relay_from_hosts
# Если сообщение было недоставлено, то генерится соощение
# об ошибке. Если сообщение об ошибке не удалось доставить
# то оно замораживается на указанный в этом пункте срок,
# после чего снова попытка доставить его. При очередной
# неудаче - сообщение удаляется.
ignore_bounce_errors_after = 45m
# Замороженные сообщения, находящиеся в очереди, дольше
# указанного времени удаляются и генерится сообщение
# об ошибке (при условии, что это не было недоставленное
# сообщение об ошибке :))
timeout_frozen_after = 15d
# Список хостов, почта от которых принимается, несмотря
# на ошибки в HELO/EHLO (тут указана моя подсеть)
helo_accept_junk_hosts = 192.168.0.0/16
# Через какое время повторять попытку доставки
# замороженного сообщения
auto_thaw = 1h
# Приветствие сервера
smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"
# Максимальное число одновременных подключений по
# SMTP. Рассчитывать надо исходя из нагрузки на сервер
smtp_accept_max = 50
# максимальное число сообщений принимаемое за одно соединение
# от удалённого сервера (или пользователя).
smtp_accept_max_per_connection = 25
# чё-то про логи и борьбу с флудом - я так понимаю -
# максимальное число сообщений записываемых в логи
smtp_connect_backlog = 30
# максимальное число коннектов с одного хоста
smtp_accept_max_per_host = 20
# Ход ладьёй - для увеличения производительности,
# директория `spool` внутри, разбивается на
# директории - это ускоряет обработку
split_spool_directory = true
# Если у сообщения много адресатов на удалённых хостах,
# то запускатеся до указанного числа максимально число
# параллельных процессов доставки
remote_max_parallel = 15
# при генерации сообщения об ошибке прикладывать
# не всё сообщение, а кусок (от начала) указанного
# размера (иногда полезно и целиком - в таком случае
# просто закомментируйте эту строку)
return_size_limit = 70k
# размер сообщения.
message_size_limit = 64M
# разрешаем неположенные символы в HELO
helo_allow_chars = _
# Принудительная синхронизация. .
smtp_enforce_sync = true
# Выбираем, что мы будем логировать
# + - писать в логи,
# - - Не писать в логи.
# +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 для входящей почты
begin acl
# Эти правила срабатывают для каждого получателя
acl_check_rcpt:
# принимать сообщения которые пришли с локалхоста,
# не по TCP/IP
accept hosts = :
# Запрещаем письма содержащие в локальной части
# символы @; %; !; /; |. Учтите, если у вас было
# `percent_hack_domains` то % надо убрать.
# Проверяются локальные домены
deny message = "incorrect symbol in address"
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
# Проверяем недопустимые символы для
# нелокальных получателей:
deny message = "incorrect symbol in address"
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
# Принимаем почту для постмастеров локальных доменов без
# проверки отправителя
accept local_parts = postmaster
domains = +local_domains
# Запрещщаем, если невозможно проверить отправителя
# require verify = sender
# Запрещщаем тех, кто не обменивается приветственными
# сообщениями (HELO/EHLO)
deny message = "HELO/EHLO require by SMTP RFC"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}
# Принимаем сообщения от тех, кто аутентифицировался:
accept authenticated = *
# Рубаем нах, тех, кто подставляет свой IP в HELO
deny message = "Your IP in HELO - access denied!"
hosts = * : !+relay_from_hosts : !81-196.lissyara.su
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}
# Рубаем тех, кто в HELO пихает мой IP
deny condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "main IP in your HELO! Access denied!"
# Рубаем тех, кто в HELO пихает только цифры
deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "can not be only number in HELO!"
# Рубаем хосты типа *adsl*; *dialup*; *pool*;....
deny message = "your hostname is bad (adsl, poll, ppp & etc)."
condition = ${if match{$sender_host_name} \
{adsl|dialup|pool|peer|dhcp} \
{yes}{no}}
# Задержка. (это такой метод борьбы со спамом,)
warn
# ставим дефолтовую задержку в 20 секунд ПОКА ТЕСТ ЗАДЕРЖКУ УБРАЛ
set acl_m0 = 0s
warn
# ставим задержку в 0 секунд своим хостам
hosts = +relay_from_hosts
set acl_m0 = 0s
warn
# пишем в логи задержку (если оно вам надо)
logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
delay = $acl_m0
# Проверка получателя в локальных доменах.
# Если не проходит, то проверяется следующий ACL,
# и если непрошёл и там - deny
accept domains = +local_domains
endpass
message = "In my mailserver not stored this user"
verify = recipient
# Проверяем получателя в релейных доменах
accept domains = +relay_to_domains
endpass
message = "main server not know how relay to this address"
verify = recipient
# Рубаем тех, кто в блэк-листах.
deny message = you in blacklist: $dnslist_domain \n $dnslist_text
dnslists = opm.blitzed.org : \
cbl.abuseat.org : \
bl.csma.biz : \
dynablock.njabl.org
# Разрешаем почту от доменов в списке relay_from_hosts
accept hosts = +relay_from_hosts
# Если неподошло ни одно правило - чувак явно ищет
# открытый релей. Пшёл прочь. :)
deny message = ""
# Тут идут ACL проверяющие содержимое (тело) письма.
# Без них будут пропускаться все сообщения.
acl_check_data:
# Проверяем письмо на вирусы
# deny malware = *
# message = "In e-mail found VIRUS - $malware_name"
# Если есть необходимость - тут проверки на спам
# Пропускаем остальное
accept
# чё делаем с почтой
begin routers
# Поиск маршрута к хосту в DNS.
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
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}'}}
# Всё что осталось - это локальные адресаты.
# Доставляем почту в dovecot
dovecot_user:
driver = accept
user=dovecot
group=mail
condition = ${lookup mysql{SELECT `goto` FROM \
`alias` WHERE \
`address`='${quote_mysql:$local_part@$domain}' OR \
`address`='${quote_mysql:@$domain}'}{yes}{no}}
transport = dovecot_delivery
# начинаются транспорты - как доставляем почту
begin transports
# Доставка на удалённые хосты - по SMTP
remote_smtp:
driver = smtp
# Доставка локальным адресатам - в dovecot
dovecot_delivery:
driver = pipe
#command = "/usr/local/libexec/dovecot/deliver -d $local_part@$domain"
command = "/usr/local/libexec/dovecot/deliver $local_part@$domain"
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
log_output
user = mailnull
group = mail
#temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
# Имя программы
address_pipe:
driver = pipe
return_output
# Транспорт для автоответов
address_reply:
driver = autoreply
# Начинаются повторы недоставленных писем.
begin retry
# Address or Domain Error Retries
# ----------------- ----- -------
* * F,2h,15m; G,16h,1h,1.5; F,4d,6h
# преобразование адресов. У меня такого нету.
begin rewrite
# Секция авторизации при отправке писем.
begin authenticators
auth_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
auth_login:
driver = dovecot
public_name = LOGIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
auth_cram_md5:
driver = dovecot
public_name = CRAM-MD5
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
Код: Выделить всё
mail3# cat /usr/local/etc/dovecot.conf
# будем использовать все протоколы
protocols = imap imaps pop3 pop3s
# лучше, когда на pop3/imap отдельный лог
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
# SSL выключим, так как он обычно нафиг не нужен.
ssl = no
# не отключаем аутентификацию без зашифрованного пароля
disable_plaintext_auth = no
# почту будем хранить одним файлом в формате mbox в домашней папке пользователя
# например для пользователя vasya почта для admin@vasiliy.net.ua будет находиться в:
# /home/vasya/mail/vasiliy.net.ua/admin/
#mail_location = maildir:/var/mail/exim/%d/%n
mail_location = mbox:/var/spool/exim/mail/%d/%n
# для pop3 вам необходимо будет авторизовываться используя полный адрес с доменом (admin@vasiliy.net.ua)
pop3_uidl_format = %08Xu%08Xv
# пусть будет
auth_verbose = yes
# перевод имени пользователя в нижний регистр (используется полный адрес с доменом)
auth_username_format = %Lu
# своя доставка dovecot - delivery
protocol lda {
# Куда слать письма про превышение квоты
postmaster_address = lexxx@***.ru
# путь к сокету
#auth_socket_path = /var/run/dovecot/auth-master
}
auth default {
# типы авторизации, они могут быть:
# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi
# но включим только простые основые
mechanisms = plain login
passdb sql {
args = /usr/local/etc/dovecot-sql.conf
}
userdb sql {
# Путь к конфигурационному файлу SQL, велено смотреть дополнительную
# инфу в файле doc/dovecot-sql.conf, тока такого файла нету :))) - не
# инсталлится. В исходниках он есть. Там и смотрим.
args = /usr/local/etc/dovecot-sql.conf
}
#passdb passwd-file {
# файл, где будут храниться ящики, %d=домен
#args = /etc/vmail/%d/passwd
#deny = no
#}
#userdb passwd-file {
#args = /etc/vmail/%d/passwd
#}
socket listen {
# демон авторизации, его будет использовать exim
client {
path = /var/run/dovecot/auth-client
mode = 0666
}
# иногда нужен и auth-master, лучше включить, пусть будет, он не помешает:
master {
path = /var/run/dovecot/auth-master
mode = 0600
}
}
}
first_valid_uid = 25
mail_privileged_group = mail
mail_uid =mailnull
mail_gid=mail
Лог
Код: Выделить всё
Oct 19 01:39:20 mail3 exim[3599]: Delay 0s for forward7.mail.yandex.net [77.88.61.37] with HELO=forward7.mail.yandex.net. Mail from ***@yandex.ru to user@***.ru.
Oct 19 01:39:20 mail3 exim[3599]: 1TOvw8-0000w3-HZ <= ***@yandex.ru H=forward7.mail.yandex.net [77.88.61.37] I=[192.168.14.11]:25 P=esmtp S=1251 id=479251350635954@web13e.yandex.ru from <***0@yandex.ru> for user@***.ru
[color=#0000FF]Oct 19 01:39:20 mail3 exim[3600]: 1TOvw8-0000w3-HZ ** user@***.ru R=dovecot_user T=dovecot_delivery: Child process of dovecot_delivery transport returned 127 (could mean unable to exec or command does not exist) from command: /usr/local/libexec/dovecot/deliver[/color]
Oct 19 01:39:20 mail3 exim[3604]: 1TOvw8-0000w8-LQ <= <> R=1TOvw8-0000w3-HZ U=mailnull P=local S=2076 from <> for ***@yandex.ru
Oct 19 01:39:20 mail3 exim[3600]: 1TOvw8-0000w3-HZ Completed
Oct 19 01:39:22 mail3 exim[3605]: 1TOvw8-0000w8-LQ => ***@yandex.ru <***@yandex.ru> R=dnslookup T=remote_smtp H=mx.yandex.ru [87.250.250.89] C="250 2.0.0 Ok: queued on mxfront37.mail.yandex.net as dFXKlRZh-dFXKPHCj"
Oct 19 01:39:22 mail3 exim[3605]: 1TOvw8-0000w8-LQ Completed
Код: Выделить всё
This message was created automatically by mail delivery software.
A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:
user@***.ru
local delivery failed
Подскажите пожалуйста что и где напутал?