Exim и правила работы роутеров

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

Exim и правила работы роутеров

Непрочитанное сообщение dm07 » 2012-07-22 12:03:13

Всем привет. Вроде работаю с постоянными вещами, но сегодня столкнулся с тем, что до конца не понимаю, как exim обрабатывает роутеры. Дебаггинг вообще ввел в ступор. Прошу помощи. Итак, что есть: exim 4.71 и секция роутеров:

Код: Выделить всё

begin routers

dnslookup:
  driver = dnslookup
  debug_print = "R: dnslookup for $local_part@$domain"
  domains = ! +local_domains
  transport = remote_smtp
  pass_on_timeout
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# следующий роутер будет в работе, если сработает pass_on_timeout от предыдущего роутера
notlocal_smarthost:
  driver = manualroute
  debug_print = "R: notlocal_smarthost for $local_part@$domain"
  domains = !+local_domains
  transport = remote_smtp
  route_list = * mail.domen.ru byname

# здесь все как у всех, вопросов нет
system_aliases:
  driver = redirect
  debug_print = "R: system_aliases for $local_part@$domain"
  allow_fail
  allow_defer
  data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@$domain}' OR$
                                                         `address`='${quote_mysql:@$domain}'}}
  headers_add = "X-Delivered-To: $local_part@$domain"

# А дальше ступор. Я использую DSPAM для проверки входящей почты. Вот вроде бы этот роутер все делает правильно
# но является типом accept. Т.е. если принял - то все. А как же обрабатываются остальные роутеры?
dspam_spamscan_router:
  driver = accept
  debug_print = "R: dspam_spamscan_router for $local_part@$domain"
  domains                      = +local_domains
  no_verify
  condition = "${if and {{!eq {$received_protocol}{spam-scanned}} \
                {!eq {$received_protocol}{local}} } {1}{0}}"
  transport = dspam_spamcheck_transport
  require_files = /usr/bin/dspam
  address_test = false

# дальше у меня идут vacation_director 
vacation_director:
  driver = accept
  debug_print = "R: vacation_director for $local_part@$domain"
  domains = ${lookup mysql{SELECT domain FROM vacation WHERE \
                       domain='${quote_mysql:$domain}' AND \
                       email='${quote_mysql:$local_part@$domain}' AND \
                       active='1'}{$value}}
  transport = vacation_autoreply
  unseen

# а дальше передаем dovecot
dovecot_user:
  driver = accept
  debug_print = "R: dovecot_user for $local_part@$domain"
  condition = ${lookup mysql{SELECT `goto` FROM \
  `alias` WHERE \
  `address`='${quote_mysql:$local_part@$domain}' OR \
  `address`='${quote_mysql:@$domain}'}{yes}{no}}
  transport = dovecot_delivery

Вопрос вот в чем. У меня 2 роутера типа accept: dspam_spamscan_router и dovecot_user. Если смотреть дебаггинг, то видим, что dspam_spamscan_router обработался и дальше нигде не вижу, что вызывается роутер dovecot_user. Но письма успешно доставляются в ящики пользователей. Если я закомментирую роутер dovecot_user, возникнет ошибка доставки. Коллеги, проясните мне, как обрабатываются роутеры в моем случае. Спасибо.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Exim и правила работы роутеров

Непрочитанное сообщение skeletor » 2012-07-23 12:29:28

dm07 писал(а):...Если смотреть дебаггинг...
а где он?
Да и вы уверенны, что вы всё логгируете?

dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

Re: Exim и правила работы роутеров

Непрочитанное сообщение dm07 » 2012-07-23 18:35:34

Отладку выполняю так:

Код: Выделить всё

#/etc/init.d/exim4 stop
# exim -bd -d+all > /var/log/exim-debug.log 2>&1
Если по порядку: вот мой текущий перечень роутеров и транспортов:

Код: Выделить всё

begin routers

dnslookup:
  driver = dnslookup
  debug_print = "R: dnslookup for $local_part@$domain"
  domains = ! +local_domains
  transport = remote_smtp
  pass_on_timeout
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

notlocal_smarthost:
  driver = manualroute
  debug_print = "R: notlocal_smarthost for $local_part@$domain"
  domains = !+local_domains
  transport = remote_smtp
  route_list = * mail.domen.ru byname

system_aliases:
  driver = redirect
  debug_print = "R: system_aliases for $local_part@$domain"
  allow_fail
  allow_defer
  data = ${lookup mysql{SELECT `goto` FROM `alias` WHERE `address`='${quote_mysql:$local_part@$domain}' $
                                                         `address`='${quote_mysql:@$domain}'}}
  # BDS 20120716 добавил заголовок, чтобы было видно, куда конкретно пошло письмо (после алиасинга)
  headers_add = "X-Delivered-To: $local_part@$domain"

vacation_director:
  driver = accept
  debug_print = "R: vacation_director for $local_part@$domain"
  domains = ${lookup mysql{SELECT domain FROM vacation WHERE \
                       domain='${quote_mysql:$domain}' AND \
                       email='${quote_mysql:$local_part@$domain}' AND \
                       active='1'}{$value}}
  transport = vacation_autoreply
  unseen
  # unseen - Когда эта опция установленна в истину, маршрутизация не прекращается,
  # если роутер принимает адрес. Вместо этого, копия входящего адреса передаётся следующему роутеру,
  # перезадавая ложную установку опции .more.

dspam_spamscan_router:
  driver = accept
  debug_print = "R: dspam_spamscan_router for $local_part@$domain"
  domains                      = +local_domains
  no_verify
  condition = "${if and {{!eq {$received_protocol}{spam-scanned}} \
                {!eq {$received_protocol}{local}} } {1}{0}}"
  transport = dspam_spamcheck_transport
  require_files = /usr/bin/dspam
#  address_test = false

# Для копирования всей входящей и исходящей почты
copy_message:
   driver = redirect
   debug_print = "R: copy_message for $local_part@$domain"
   unseen
   domains = +tracker
   data = tracker@domen.ru

dovecot_user:
  driver = accept
  debug_print = "R: dovecot_user for $local_part@$domain"
  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

remote_smtp:
  driver = smtp
  headers_add             = "X-Bounce-ID: $primary_hostname"

dovecot_delivery:
  driver = pipe
  debug_print = "T: dovecot_delivery for $local_part@$domain"
  command = /usr/lib/dovecot/deliver -d $local_part@$domain
  message_prefix =
  message_suffix =
  delivery_date_add
  envelope_to_add
  return_path_add = false
  log_output = true
  user = vmail

vacation_autoreply:
  driver = autoreply
  headers = "Content-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64"
  user = Debian-exim
  group = vmail
  to = ${sender_address}
  from = "${local_part}@${domain}"
  log = /var/log/vacation.log
  subject = "=?UTF-8?B?${lookup mysql {SELECT subject FROM vacation \
        WHERE domain='${quote_mysql:$domain}' AND \
        email='${quote_mysql:$local_part@$domain}'}{$value}}?="
  text = ${lookup mysql {SELECT body FROM vacation \
        WHERE domain='${quote_mysql:$domain}' AND \
        email='${quote_mysql:$local_part@$domain}'}{$value}}

dspam_spamcheck_transport:
  driver = pipe
  debug_print = "T: dspam_spamcheck_transport for $local_part@$domain"
  command = /usr/bin/dspam --deliver=innocent \
                --user "$local_part@$domain" -- %u
  user = dspam
  return_path_add = false
  log_output = true
  return_fail_output = true
  headers_remove        = X-DSPAM-Result
Вот кусок отладки, где мы принимаем письмо и начинаются обрабатываться роутеры и транспорты:

Код: Выделить всё

sender user@gmail.com verified ok
Обработался системный фильтр
19:05:28 23614 user@domen.ru: queued for routing
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 routing user@domen.ru
19:05:28 23614 --------> dnslookup router <--------
19:05:28 23614 dnslookup router skipped: domains mismatch
19:05:28 23614 --------> notlocal_smarthost router <--------
19:05:28 23614 notlocal_smarthost router skipped: domains mismatch
19:05:28 23614 --------> system_aliases router <--------
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 Considering: user@domen.ru
19:05:28 23614 unique = \0\user@domen.ru
19:05:28 23614 dbfn_read: key=R:domen.ru
19:05:28 23614 dbfn_read: key=R:user@domen.ru
19:05:28 23614 dbfn_read: key=R:user@domen.ru:<user@gmail.com>
19:05:28 23614 no domain retry record
19:05:28 23614 no address retry record
19:05:28 23614 user@domen.ru: queued for routing
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 routing user@domen.ru
19:05:28 23614 --------> dnslookup router <--------
19:05:28 23614 dnslookup router skipped: domains mismatch
19:05:28 23614 --------> notlocal_smarthost router <--------
19:05:28 23614 --------> system_aliases router <--------
19:05:28 23614 system_aliases router skipped: previously routed user@domen.ru
19:05:28 23614 --------> vacation_director router <--------
19:05:28 23614 vacation_director router skipped: domains mismatch
19:05:28 23614 --------> dspam_spamscan_router router <--------
19:05:28 23614 calling dspam_spamscan_router router
19:05:28 23614 dspam_spamscan_router router called for user@domen.ru
19:05:28 23614   domain = domen.ru
19:05:28 23614 set transport dspam_spamcheck_transport
19:05:28 23614 queued for dspam_spamcheck_transport transport: local_part = user
19:05:28 23614 domain = domen.ru
19:05:28 23614   errors_to=NULL
19:05:28 23614   domain_data=NULL localpart_data=NULL
19:05:28 23614 routed by dspam_spamscan_router router
19:05:28 23614   envelope to: user@domen.ru
19:05:28 23614   transport: dspam_spamcheck_transport
19:05:28 23614 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
19:05:28 23614 After routing:
19:05:28 23614   Local deliveries:
19:05:28 23614     user@domen.ru
19:05:28 23614   Remote deliveries:
19:05:28 23614   Failed addresses:
19:05:28 23614   Deferred addresses:
19:05:28 23614 search_tidyup called
19:05:28 23614 close MYSQL connection: localhost/exim/exim
19:05:28 23614 >>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
19:05:28 23614 --------> user@domen.ru <--------
19:05:28 23614 --------> user@domen.ru <--------
19:05:28 23614 locking /var/spool/exim4/db/retry.lockfile
19:05:28 23614 locked /var/spool/exim4/db/retry.lockfile
19:05:28 23614 EXIM_DBOPEN(/var/spool/exim4/db/retry)
19:05:28 23614 returned from EXIM_DBOPEN
19:05:28 23614 opened hints database /var/spool/exim4/db/retry: flags=O_RDONLY
19:05:28 23614 dbfn_read: key=T:user@domen.ru
19:05:28 23614 no retry record exists
19:05:28 23614 search_tidyup called
19:05:28 23615 changed uid/gid: local delivery to user <user@domen.ru> transport=dspam_spamcheck_transport
19:05:28 23615   uid=125 gid=133 pid=23615
19:05:28 23615   auxiliary group list: <none>
19:05:28 23615   home=NULL current=/
19:05:28 23615 set_process_info: 23615 delivering 1StKCL-00068o-UV to user using dspam_spamcheck_transport
19:05:28 23615 expanding: T: dspam_spamcheck_transport for $local_part@$domain
19:05:28 23615    result: T: dspam_spamcheck_transport for user@domen.ru
19:05:28 23615 T: dspam_spamcheck_transport for user@domen.ru
19:05:28 23615 dspam_spamcheck_transport transport entered
19:05:28 23615 Writing message to pipe
19:05:28 23617 set_process_info: 23617 reading output from |/usr/bin/dspam --deliver=innocent --user "$local_part@$domain" -- %u
19:05:28 23615 added header line(s):
19:05:28 23615 X-Delivered-To: user@domen.ru
19:05:28 23615 ---
19:05:28 23615 writing data block fd=12 size=3129 timeout=3600
19:05:28 23615 writing data block fd=12 size=1 timeout=3600
19:05:28 23615 dspam_spamcheck_transport transport yielded 0
19:05:28 23614 post-process user@domen.ru (0)
19:05:28 23614 user@domen.ru delivered
19:05:28 23614 user@domen.ru: children all complete
9:05:28 23614 LOG: MAIN
19:05:28 23614   => user <user@domen.ru> F=<user@gmail.com> P=<user@gmail.com> R=dspam_spamscan_router T=dspam_spamcheck_transport S=3180 QT=3s DT=0s
19:05:28 23614 >>>>>>>>>>>>>>>> deliveries are done >>>>>>>>>>>>>>>>
19:05:28 23614 changed uid/gid: post-delivery tidying
19:05:28 23614   uid=123 gid=5000 pid=23614
19:05:28 23614   auxiliary group list: <none>
19:05:28 23614 set_process_info: 23614 tidying up after delivering 1StKCL-00068o-UV
19:05:28 23614 Processing retry items
19:05:28 23614 Succeeded addresses:
19:05:28 23614 user@domen.ru: no retry items
19:05:28 23614 user@domen.ru: no retry items
19:05:28 23614 user@domen.ru: no retry items
19:05:28 23614 Failed addresses:
19:05:28 23614 Deferred addresses:
19:05:28 23614 end of retry processing
19:05:28 23614 LOG: MAIN
19:05:28 23614   Completed QT=3s
19:05:28 23614 end delivery of 1StKCL-00068o-UV
19:05:28 23614 search_tidyup called
19:05:28 23614 search_tidyup called
19:05:28 23614 >>>>>>>>>>>>>>>> Exim pid=23614 terminating with rc=0 >>>>>>>>>>>>>>>>
Мы видим, что обработался dspam роутер, но нет упоминания про dovecot-транспорт, хотя в mainlog мы видим, что используются оба транспорта. Как в моем случае обрабатываются два роутера типа accept - по порядку? Но ведь по-идее, сработать должен только 1 из них, который примет адрес для маршрутизации. Дайте пожалуйста наводку, а то запутался.

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Exim и правила работы роутеров

Непрочитанное сообщение skeletor » 2012-07-24 13:57:02

Ответ просто - у вас срабатывает dspam_spamscan_router. До dovecot_user не доходит. Покажите дебаг, когда закомментирован route dovecot_user.

dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

Re: Exim и правила работы роутеров

Непрочитанное сообщение dm07 » 2012-07-24 15:19:02

Я в дебаге по поиску ищу dovecot, но не нахожу информации ни про вызов роутера dovecot_user, ни про вызов транспорта dovecot_delivery. В заголовках письма вижу вот это:

Код: Выделить всё

Received: from dspam by mail2.domain.ru with local (Exim 4.71)
        (envelope-from <dspam@domen.ru>)
        id 1St2vH-0006Te-Jc
        for user@domen.ru; Mon, 23 Jul 2012 00:38:39 +0400
Received: from mail-lb0-f175.google.com ([209.85.217.175]:48303)
        by mail2.domen.ru with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16)
        (Exim 4.71)
        (envelope-from <user@gmail.com>)
        id 1St2vB-0006TV-LD
        for user@domen.ru; Mon, 23 Jul 2012 00:38:39 +0400
Т.е. при приеме мы видим 2 заголовка Received, причем в первом заголовке мы видим envelope-from <dspam@domen.ru>, насколько я понимаю это из-за того, что роутер dspam вызывается пользователем dspam (мне это не нравится, но отменить не могу, если директиву user не указывать - получаю ошибку). Второй заголовок Received - верный. В самом логе mainlog мы видим:

Код: Выделить всё

2012-07-24 16:11:30 [16177] 1StdxU-0004Cv-Gk SA: Action: scanned but message isn't spam: score=-1.9 required=4.0 (scanned in 5/5 secs | Message-Id:
CA+WasyMMDe2joKfiyvt782oGzkeHpb=6o3a+1aMYKwR+4m7YEQ@mail.gmail.com). From <user@gmail.com> (host=mail-lpp01m010-f51.google.com [209.85.215.51])
 for user@domen.ru
2012-07-24 16:11:30 [16177] 1StdxU-0004Cv-Gk <= user@gmail.com H=mail-lpp01m010-f51.google.com [209.85.215.51]:64284 I=[46.2.75.1]:25 P=esmtps
 X=TLS1.0:RSA_ARCFOUR_SHA1:16 CV=no S=3096 id=CA+WasyMMDe2joKfiyvt782oGzkeHpb=6o3a+1aMYKwR+4m7YEQ@mail.gmail.com T="test 230" from <user@gmail.
com> for user@domain.ru
2012-07-24 16:11:30 [16182] cwd=/var/spool/exim4 3 args: /usr/sbin/exim4 -Mc 1StdxU-0004Cv-Gk
2012-07-24 16:11:30 [16187] cwd=/ 4 args: /usr/sbin/exim -oMr spam-scanned user@domen.ru
2012-07-24 16:11:30 [16187] 1Stdxa-0004D5-44 SA: Debug: SAEximRunCond expand returned: ''
2012-07-24 16:11:30 [16187] 1Stdxa-0004D5-44 SA: Action: Not running SA because SAEximRunCond expanded to false (Message-Id: 1Stdxa-0004D5-44). From
 <dspam@domen.ru> (local) for user@domen.ru
2012-07-24 16:11:30 [16187] 1Stdxa-0004D5-44 <= dspam@domen.ru U=dspam P=local S=4123 id=CA+WasyMMDe2joKfiyvt782oGzkeHpb=6o3a+1aMYKwR+4m7YEQ@mail.g
mail.com T="test 230" from <dspam@domen.ru> for user@domen.ru
2012-07-24 16:11:30 [16182] 1StdxU-0004Cv-Gk => user <user@domen.ru> F=<user@gmail.com> P=<user@gmail.com> R=dspam_spamscan_rou
ter T=dspam_spamcheck_transport S=3182 QT=6s DT=0s
2012-07-24 16:11:30 [16182] 1StdxU-0004Cv-Gk Completed QT=6s
2012-07-24 16:11:30 [16188] cwd=/var/spool/exim4 3 args: /usr/sbin/exim4 -Mc 1Stdxa-0004D5-44
2012-07-24 16:11:30 [16188] 1Stdxa-0004D5-44 => user <user@domen.ru> F=<dspam@domen.ru> P=<dspam@domen.ru> R=dovecot_user T=dovecot_del
ivery S=4202 QT=0s DT=0s
2012-07-24 16:11:30 [16188] 1Stdxa-0004D5-44 Completed QT=0s
Т.е. тут в логе мы видим, что вызвался транспорт dspam_spamcheck_transport, видим, что он отработался успешно (1StdxU-0004Cv-Gk Completed QT=6s), потом видим, что вызывается транспорт dovecot_delivery.

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Exim и правила работы роутеров

Непрочитанное сообщение skeletor » 2012-07-24 17:02:44

А вы видите, что у вас разные id писем? Если это одно и тоже письмо, тогда ясно, почему 2 заголовка и в чём проблема: у вас письмо первый раз принимается dspam'om, потом он его передаёт обратно в exim и тот уже в dovecot_delivery.
Почему так? Скорее всего ошибка в интеграции dspam и exim.

dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

Re: Exim и правила работы роутеров

Непрочитанное сообщение dm07 » 2012-07-24 17:39:21

Да, вы правы - это одно и тоже письмо. В конфиге dspam есть опция:

Код: Выделить всё

TrustedDeliveryAgent "/usr/sbin/exim -oMr spam-scanned"
Похоже, когда отрабатывает транспорт dspam_spamcheck_transport:

Код: Выделить всё

  driver = pipe
  debug_print = "T: dspam_spamcheck_transport for $local_part@$domain"
  command = /usr/bin/dspam --deliver=innocent \
                --user "$local_part@$domain" -- %u
поскольку он вызывает dspam, далее вызывается exim согласно конфигу dspam и ему передается письмо уже силами dspam'a. Поэтому я в дебаггинге не вижу вызов роутера dovecot'а, который идет сразу за роутером dspam. Собственно что и сподвигло меня написать этот пост. При конфигурировании опирался на статью http://www.lissyara.su/articles/freebsd ... n_to_exim/. Вопрос вот в чем: возможно ли как-то обработать входящее письмо dspam'ом (не создавая новую сессию SMTP), а дальше, после обработки, передать его нежно и ласково транспорту dovecot?

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Exim и правила работы роутеров

Непрочитанное сообщение skeletor » 2012-07-24 18:48:35

А зачем? Что вы хотите получить?
Почитайте комментарии к статье, может что-то найдёте.

dm07
сержант
Сообщения: 222
Зарегистрирован: 2008-07-27 19:58:25
Откуда: Уфа
Контактная информация:

Re: Exim и правила работы роутеров

Непрочитанное сообщение dm07 » 2012-07-24 19:00:54

Да, 2 заголовка Received, причем с разными id - это типовая ситуация, а не ошибочная. Два заголовка по-любому получится, т.к. dspam вызывает exim на доставку письма. Спасибо, разобрался более четче как вызываются роутеры exim, в частности в связке с dspam.