Назад | Перейти на главную страницу

Exim4: Локальная доставка после проверки исходящего письма на спам

domain.com и domain.net размещены на одном сервере server1. Чтобы избежать спама и вирусов, все исходящие электронные письма (даже в локальные домены) подлежат сканированию с помощью сторонней службы. Таким образом, письмо от mail@domain.com к mail@domain.net следует оставить server1, то он будет проверяться вне server1, а затем доставить в соответствии с записью MX в server1, откуда он и возник.

И вот мы заканчиваем циклом: Too many "Received" headers - suspected mail loop.

А вот что у меня:

smarthost_relay:
   driver = manualroute
   ignore_target_hosts = 127.0.0.0/8
   condition = ${if !inlist{$sender_host_address}{<; 46.xxx.xxx.xxx }}
   condition = ${if or {{!eq{$sender_address}{}} {!eq{$sender_host_address}{}}}}
   condition = '${perl{check_limits}}'
   transport = auth_relay
   route_list = $domain 46.xxx.xxx.xxx::587
   same_domain_copy_routing = yes
   no_more

В $sender_host_address здесь не работает, как я ожидал. Поскольку он пуст, когда приходит электронное письмо после удаленной проверки. Что я скучаю? Как этого добиться?

С уважением, Алекс.

Вы можете захотеть установить переменную ACL в ACL во время обработки сообщения, чтобы указать, что сообщение было получено от фильтра спама. Для этого можно использовать несколько списков ACL, которые обычно не определены. Подобный блок ACL должен обнаруживать спам-фильтр по IP или DNS-имени:

warn
  hosts = 46.xxx.xxx.xxx : spamfilter.example.com
  set acl_c9 = SPAMFiltered
  logwrite = Received from SPAM Filter server

Затем воспользуйтесь простой проверкой переменной в транспорте.

 condition = ${if eq {$acl_c9}{}}

Вы можете удалить log_write из ACL, если убедитесь, что он работает.

Чтобы это работало, вам необходимо убедиться, что вы не используете TURN или ETRN для получения почты обратно через соединение, которое вы использовали для отправки сообщения для фильтрации спама.

Если вы хотите попробовать изменить свои условия, вы можете посмотреть на оператор match_ip вместо in_list.

Чтобы отфильтровать маршрутизацию сообщений в том же домене, попробуйте выполнить условие маршрутизатора, например:

domains = ! $sender_address_domain

Я добавил следующие строки в acl_check_mail:

warn    hosts = ! 46.xxx.xxx.xxx
          set acl_m_filtered = 0
          add_header = X-Received-SPAM-Filtered: $acl_m_filtered

warn    hosts = 46.xxx.xxx.xxx
          set acl_m_filtered = 1
          add_header = X-Received-SPAM-Filtered: $acl_m_filtered

и использовать condition = ${if eq {$acl_m_filtered}{0}{yes}{no}} проверьте в моем роутере.

Циклов пока нет;)