LINUX.ORG.RU
ФорумAdmin

exim + cyrus + mysql - virtualdomains


0

0

Настраиваю связку exim + cyrus_imap + mysql

Логины пользователей имеют вид user_xxx, ящики - user@domain

Почту предполагается хранить в imap.

При отправке по smtp получаю следующее сообщение в логах:

May 31 20:29:40 inside02 exim[7368]: Delay 0s for melchior.shinkei.ru [89.163.122.149] with HELO=shinkei.ru. Mail from shinkei@ya.ru to admin@kadva.ru.
May 31 20:29:49 inside02 exim[7368]: 1K2Txj-0001uq-2E <= shinkei@ya.ru H=melchior.shinkei.ru (shinkei.ru) [89.163.122.149] I=[77.222.32.6]:25 P=smtp S=227 from <shinkei@ya.ru> for admin@kadva.ru
May 31 20:29:49 inside02 exim[7395]: 1K2Txj-0001uq-2E ** admin@kadva.ru R=mysqluser T=cyrus_delivery: LMTP error after RCPT TO:<admin@kadva.ru>: 550-Mailbox unknown. Either there is no mailbox associated with this\n550-name or you do not have authorization to see it.\n550 5.1.1 User unknown


Судя по всему мой EXIM пытается скормить cyrus письмо для admin@kadva.ru. При этом я желаю чтобы письма он кормил не для алиаса admin@kadva.ru к ящику kadva_1, а именно для kadva_1.

В конфиге EXIM по этому поводу есть:

# чё делаем с почтой
begin routers

# Поиск маршрута к хосту в DNS. Если маршрут не найден в 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
no_more

system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{select alias.address from box, alias \
where alias.address='${quote_mysql:$local_part@$domain}' \
and box.box_id=alias.box }}

mysqluser:
driver = accept
condition = ${if eq{}{${lookup mysql{select box.login from box, alias \
where alias.address='${quote_mysql:$local_part@$domain}' \
and box.box_id=alias.box }}}{no}{yes}}
transport = cyrus_delivery




# начинаются транспорты - как доставляем почту
begin transports

# Доставка на удалённые хосты - по SMTP
remote_smtp:
driver = smtp

# Транспорт для доставки почты локальным пользователям.
cyrus_delivery:
driver = lmtp
socket = /var/imap/socket/lmtp
batch_max = 100
user = cyrus

address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add

# Имя программы
address_pipe:
driver = pipe
return_output

# Транспорт для автоответов
address_reply:
driver = autoreply




Вообще всё нагло содрано с http://www.lissyara.su/?id=1626

только у меня база своя, и логин напрямую совпадает с именем папки юзера в imap.

Куда копать?


База алиасов:
alias_id
box (id бокса)
address (admin@kadva.ru например)
domain (id домена)

База боксов:
box_id
login (логин, он же имя папки в imap)
pass

База доменов:
domain_id
domain
active_flag

Последняя таблица юзается только для удобства

Re: exim + cyrus + mysql - virtualdomains

непонятно как этот конфиг вообще работать будет

в транспортах ни единого упоминания о локальных доменах нету

и кстати цитрус оправдано ставить если ящиков будет > 10'000, иначе не рекомендую -- он какой-то уж больно вещь в себе

anonymous ()
Ответ на: Re: exim + cyrus + mysql - virtualdomains от anonymous

Re: exim + cyrus + mysql - virtualdomains

> в транспортах ни единого упоминания о локальных доменах нету

опс, перепутал транспорты с роутерами, миль пардон

anonymous ()
Ответ на: Re: exim + cyrus + mysql - virtualdomains от anonymous

Re: exim + cyrus + mysql - virtualdomains

Да хоть в довекот складывать. Важно мне только реврайт сделать, ну чтобы вместо local_part@domain всё слалось на login а не на алиас бокса.

Кста. попробую с давикотом, раскладывая вручную по обозначенной мною схеме. авось и прокатит.

Shinkei_aka_HepB ()
Ответ на: Re: exim + cyrus + mysql - virtualdomains от Shinkei_aka_HepB

Re: exim + cyrus + mysql - virtualdomains

ну сам цитрус-то в данном случае ни при чем

я бы порекомендовал запустить ехим вот так: exim -bd -d+all и смотреть на выхлоп

чует мое сердце что ты чего-то с АЦЛями накрутил

anonymous ()
Ответ на: Re: exim + cyrus + mysql - virtualdomains от anonymous

Re: exim + cyrus + mysql - virtualdomains

Вот конфиг. Тут ничего заурядного.

primary_hostname = inside02.p8.ru

hide mysql_servers = localhost/exim/exim/xxxxxxxxxxxxxx

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_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

qualify_domain = inside02.p8.ru

qualify_recipient = inside02.p8.ru

allow_domain_literals = false

exim_user = mailnull

exim_group = mail

never_users = root

rfc1413_query_timeout = 0s

ignore_bounce_errors_after = 45m

timeout_frozen_after = 15d

helo_accept_junk_hosts = 192.168.0.0/16

auto_thaw = 1h

smtp_banner = "$primary_hostname, ESMTP EXIM $version_number"

smtp_accept_max = 50

smtp_accept_max_per_connection = 25

smtp_connect_backlog = 30

smtp_accept_max_per_host = 20

split_spool_directory = true

remote_max_parallel = 15

return_size_limit = 70k

message_size_limit = 24M

helo_allow_chars = _

smtp_enforce_sync = false

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

syslog_timestamp = no











begin acl

acl_check_rcpt:

accept hosts = :
accept hosts = localhost : 127.0.0.1

deny message = "Unknown symbols in address"
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]

deny message = "Unknown symbols in address"
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

accept local_parts = postmaster
domains = +local_domains

# require verify = sender

deny message = "You must send HELO/EHLO"
condition = ${if eq{$sender_helo_name}{}{yes}{no}}

accept authenticated = *

deny message = "Dont enter my ip in helo"
hosts = *:!+relay_from_hosts
condition = ${if eq{$sender_helo_name}\
{$sender_host_address}{true}{false}}

deny condition = ${if eq{$sender_helo_name}\
{$interface_address}{yes}{no}}
hosts = !127.0.0.1 : !localhost : *
message = "Its my ip address. Go away"

deny condition = ${if match{$sender_helo_name}\
{\N^\d+$\N}{yes}{no}}
hosts = !127.0.0.1:!localhost:*
message = "hmm... I dont understand your helo"

deny message = "I dont like your host"
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 : 213.234.195.226/28
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









accept domains = +local_domains
endpass
message = "I dont know this user"
verify = recipient

accept domains = +relay_to_domains
endpass
message = "I dont know route to this host"
verify = recipient

accept hosts = +relay_from_hosts

deny message = "Its not openrelay ))"



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
no_more


system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{select alias.address from box, alias \
where alias.address='${quote_mysql:$local_part@$domain}' \
and box.box_id=alias.box }}

mysqluser:
driver = accept
condition = ${lookup mysql{select box.login from box, alias \
where alias.address='$local_part@$domain' \
and box.box_id=alias.box }{yes}{no}}
transport = cyrus_delivery
cannot_route_message = Unknown user








# начинаются транспорты - как доставляем почту
begin transports

# Доставка на удалённые хосты - по SMTP
remote_smtp:
driver = smtp

# Транспорт для доставки почты локальным пользователям.

cyrus_delivery:
driver = lmtp
user = cyrus
socket = /var/imap/socket/lmtp
batch_max = 100


address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add

# Имя программы
address_pipe:
driver = pipe
return_output

# Транспорт для автоответов
address_reply:
driver = autoreply











# Начинаются повторы недоставленных писем.
begin retry

* * F,2h,15m; G,16h,1h,1.5; F,4d,6h


# преобразование адресов. У меня такого нету.
begin rewrite



begin authenticators

auth_plain:
driver = plaintext
public_name = PLAIN
server_condition = ${lookup mysql{SELECT `login` FROM \
`box` WHERE `login` = \
'${quote_mysql:$1}' AND `pass` = \
'${quote_mysql:$2}'}{yes}{no}}
server_prompts = :
server_set_id = $2

# Вроде по этому оутглюк, а по предыдущему нетскейп.
auth_login:
driver = plaintext
public_name = LOGIN
server_condition = ${lookup mysql{SELECT `login` FROM \
`box` WHERE `login` = \
'${quote_mysql:$1}' AND `pass` = \
'${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 `login` FROM \
`box` WHERE `login` \
= '${quote_mysql:$1}'}{$value}fail}
server_set_id = $1

Shinkei_aka_HepB ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.