Ivanovo Linux Users Group - Not logged in
Forum Help Search Login
Previous Next Up Topic Софт / Программное обеспечение / exim 4.60 (35520 hits)
- By Deep Date 27.12.05 11:16
Сервер не хотит делать доставку локальному руту.
пишу письмо
#mail root@mxpost.tcn.ru

а оно в логи пишет:
2005-12-27 12:21:49 1ErB1h-000Pd6-Ey <= root@MXpost.tcn.ru U=root P=local S=393
2005-12-27 12:21:49 1ErB1h-000Pd6-Ey remote host address is the local host: mxpost.tcn.ru
2005-12-27 12:21:49 1ErB1h-000Pd6-Ey == root@mxpost.tcn.ru R=dnslookup defer (-1): remote host address is the local host
2005-12-27 12:21:49 1ErB1h-000Pd6-Ey Frozen

и письмо остается где то в очереди...

hostname mxpost.tcn.ru

алиас для root@mxpost.tcn.ru установлен

в конфиге присудствует:

domainlist local_domains = mxpost.tcn.ru
Parent - By LOE (Site/forum admin) Date 27.12.05 20:06
local_domains - еще не все.
Нужно еще роутер и транспорт локальные взвести. Похоже, exim (несмотря на local_domains) не знает как сроутить почту на домен и хочет сроутить как на удалённый.
Ну и как установлен алиас?

Вообще, если exim ставишь с нуля, то его конфиг - почти полностью готов для работы: остается только прописать локальные домены.
Так-что, без дополнительных сведений ничего сказать нельзя.
Приаттач к сообщению свой конфиг, посмотрим (в само сообщение вставлять не надо).
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 28.12.05 07:35
Вот мой конфиг!

CONFIG_PREFIX=/usr/local/etc/exim
ACL_PREFIX=CONFIG_PREFIX/acls
CERTDIR=CONFIG_PREFIX/certs

# Здесь мы указываем, где находить наш postgresql сервер, соединение
# осуществляется через локальный сокет, команда hide помогает спрятать эту
# настройку при вызове exim -bP, когда exim выводит все конфигурационные опции в
# стандартный вывод. Учтите,
# что сам /usr/local/etc/exim/configure должен иметь владельца root:wheel и
# иметь права доступа 0600, что отличается от того, что принято по умолчанию
# (0644)
hide pgsql_servers = (тут коннектимся к базе postgre)

# Тут мы описываем списки доменов

# Local_domains включает домены, считающиеся локальными, то есть те домены, для
# которых exim делает локальную доставку, для остальных доменов почта
# доставляется по MX записям в DNS. Обратите внимание на дополнительные файлы
# ACL_PREFIX/localdomains и ACL_PREFIX/hostingdomains, в которых перечислены
# домены, разделенные переводом строки (то есть, по одному домену на каждую строку)
#domainlist local_domains = mxpost.tcn.ru  : ACL_PREFIX/hostingdomains : ACL_PREFIX/localdomains
domainlist local_domains = mxpost.tcn.ru : mxpost : ACL_PREFIX/hostingdomains : ${lookup pgsql {select domainname from localdomains where domainname='$domain'}{$value}fail}
# Дополнительная настройка
#domainlist hosting_domains = ${lookup pgsql {select domainname from localdomains}{yes}{no}}
domainlist hosting_domains = ACL_PREFIX/hostingdomains
# Список хостов, почту на которые мы явно отвергаем
hostlist host_reject = ACL_PREFIX/hostreject
domainlist relay_to_domains =
# Список адресов, с которых разрешена передача почты во внешний мир
hostlist   relay_from_hosts = localhost : mxpost.tcn.ru :  ACL_PREFIX/relayfromhosts

# Проверка получателя
acl_smtp_rcpt = acl_check_rcpt
# Проверка mime содержимого
acl_smtp_mime = acl_check_mime
# Проверка на спам и вирусы
acl_smtp_data = acl_check_virus

# Здесь мы описываем наш антивирус
av_scanner = clamd:127.0.0.1 3310
# И spamassasin
spamd_address = 127.0.0.1 783
# Настройки пользователя и группы по умолчанию
exim_user = mailnull
exim_group = mail
# Никогда не осуществляем доставку под рутом - root должен быть алиасом на
# другого локального пользователя. Кстати, это _обязательное_ условие, заданное
# еще на этапе компиляции
never_users = root

# Настройки директории для очереди
spool_directory = /var/spool/exim
# Разделяем spool_directory на несколько более маленьких - аналог хеш таблицы,
# ускоряет обработку spool'а
split_spool_directory

# Пытаемся сделать соответствие прямой и обратной зоны dns для каждого хоста.
# Несколько затратно, но весьма полезно
host_lookup = *

# Убираем проверку identd на клиентской стороне. Из-за неправильно настроенных
# firewall'ов это часто вызывает длительные тайм-ауты, кроме того, этот сервис
# поднят не у многих
rfc1413_query_timeout = 0s

# Указываем кое-какие лимиты (их назначение ясно из названия)
smtp_accept_max = 50
smtp_connect_backlog = 40
smtp_accept_max_per_host = 10
smtp_accept_queue = 22
smtp_accept_queue_per_connection = 10
recipients_max = 16
recipients_max_reject = true
message_size_limit = 16M
accept_8bitmime

# Игнорируем сообщения, которые приходят нам же, давность которых более 12-ти часов
ignore_bounce_errors_after = 12h

# Удаляем замороженные сообщения, давность которых больше недели.
timeout_frozen_after = 7d

# Настройки TLS
tls_certificate = CERTDIR/mailed.crt
tls_privatekey = CERTDIR/mailed.key
tls_advertise_hosts = *
tls_verify_certificates = *
# Следующая опция закомментирована, но весьма полезна, позволяя авторизироваться
# только через безопасный ssl канал
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

# Этот список доступа описывает проверки, осуществляемые при вызове любой RCPT
# команды
acl_check_rcpt:
 
  # Вначале проверяем достоверность отправителя
  require verify = sender
  # Принимаем соединения от локальных MUA (то есть не через TCP/IP)
  accept  hosts = :
  #############################################################################
  # Проверка соответствия почтового адреса стандарту  

    deny    message       = Access denied - $sender_host_address listed by $dnslist_domain\n$dnslist_text
      dnslists      = dnsbl.sorbs.net
    deny    message       = message from $sender_host_address rejected - see http://njabl.org/
      dnslists      = dnsbl.njabl.org
    deny    message       = rejected because $sender_host_address for bad WHOIS info, see http://www.rfc-ignorant.org/
      dnslists      = ipwhois.rfc-ignorant.org
    deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
      dnslists      = dialups.mail-abuse.org
    deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
      dnslists      = list.dsbl.org
    deny    message       = Spam blocked see: http://www.spamcop.net/w3m?action=checkblock&ip=$sender_host_address
      dnslists      = bl.spamcop.net
    deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
      dnslists      = relays.ordb.org
    deny    message       = rejected, $sender_host_address Open Proxy, see: $dnslist_domain\n$dnslist_text
      dnslists      = dnsbl.void.ru

#  deny    message       = Restricted characters in address
#          domains       = +local_domains
#          local_parts   = ^[.] : ^.*[@%!/|]
  accept domains        = +local_domains
  # Здесь прописаны так называемые dnsbl, то есть черные списки MTA с открытым
  # релеем, мы проверяем ip адрес отправителя на соответствие таким спискам и
  # блокируем письмо, если отправитель был найден в таком списке
    deny    message = host is listed in $dnslist_domain
            dnslists = blackholes.mail-abuse.org:relays.mail-abuse.org
 
  # Правило на проверку всех почтовых адресов, кроме локальных (менее строгое)
  deny    message       = Restricted characters in address
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
  #############################################################################

  # Принимаем почту для пользователя postmaster локальных доменов, не взирая на
  # отправителя
  accept  local_parts   = postmaster
          domains       = +local_domains

  # Deny unless the sender address can be verified.

  accept  domains       = +local_domains
          endpass
          verify        = recipient

  # Если домен в списке relay_to_domains, то разрешаем релей
  accept  domains       = +relay_to_domains
          endpass
          verify        = recipient
  accept  domains       = +hosting_domains
            endpass
          verify        = recipient

  accept  hosts         = +relay_from_hosts

  # Принимаем любые соединения, которые были успешно авторизованы
  accept  authenticated = *
  
  # Реализация нашего бан-листа
  deny   hosts          = +host_reject
         message        = You are banned. Go away.
  # Запрещаем все, что не разрешено, закрывая тем самым релей для спамеров
  deny    message       = relay not permitted

  # Список доступа для проверки mime частей сообщения
acl_check_mime:

  # Произодим декодирование mime сообщений. Полезно для дальнейшей проверки на
  # вирусы
  warn decode = default

  # Можно очень быстро отсеять сообщения, просто запретив некоторые mime
  # вложения, чаще всего содержащие вирусы, хотя, конечно, это не панацея
  deny message = Blacklisted file extension detected
       condition = ${if match \
                        {${lc:$mime_filename}} \
                        {\N(\.wav|\.cpl|\.pif|\.bat|\.scr|\.lnk|\.com)$\N} \
                     {1}{0}}
 
  # Много ли у нас людей, знающих китайский? А вот китайского спама это поубавит
  # :-)
  deny message = Sorry, noone speaks chinese here
       condition = ${if eq{$mime_charset}{gb2312}{1}{0}}

  accept

# Проверка содержимого на вирусы и спам
acl_check_virus:
        # Мы не запрещаем письма со спамом, а просто добавляем заголовок,
        # содержащий количество спамерских очков, а пользователь на своей
        # стороне уже просто настраивает свои фильтры. Так мы исключаем жалобы
        # со стороны пользователей о потерянных письмах
#       warn  message = X-Spam-Score: $spam_score ($spam_bar)
#               spam = spamd:true
#
        # Добавляем заголовки, указывающие, что письма были проверены
        # spamasssasin'ом
#  warn message = X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) on post.tcn.ru
#        warn message = X-Spam-Scanned: Yes
#        warn message = X-Spam-Scanner: SpamAssassin running on MXpost.tcn.ru

    warn  message = X-Spam-Score: $spam_score ($spam_bar)
  hosts   = !+relay_from_hosts
  spam    = spamd:true

    warn  message = X-Spam-Report: $spam_report
  hosts   = !+relay_from_hosts
  spam    = spamd:true

# warn  message = Subject: ***SPAM*** $h_Subject:
#       hosts   = !+relay_from_hosts
#       spam    = spamd

    warn  message = X-Spam-Status: Yes
  hosts   = !+relay_from_hosts
  spam    = spamd

    deny  message = This message scored $spam_score spam points.
  spam    = spamd:true
  hosts   = !+relay_from_hosts
  condition = ${if >{$spam_score_int}{120}{1}{0}}

       
        # Вот что-что, а вирусы нам не нужны.
        deny  message   = Message rejected: virus found. Your message was successfully trashed.
                    hosts       = *
                    malware     = *
        accept

######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!       #
# An address is passed to each router in turn until it is accepted.  #
######################################################################

begin routers

# Роутер, осуществляющий поиск по MX записям в DNS
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# Все останльные роутеры обслуживают доставку локальной почты

# Драйвер алиасов пользователя. Обратите внимание на lookup в pgsql базе. Что
# интересно, этот lookup работает даже для иерархических алиасов, например,
# postmaster -> root -> cebka -> cebka@jet.msk.su Также определяются транспорты
# для передачи почты в файл (>/path/to/file) и в pipe
# (|/usr/local/libexec/slocal)
system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup pgsql{select alias from aliases where mail ='$local_part@$domain'}{$value}fail}
  user = mailnull
  group = mail
  file_transport = address_file
  pipe_transport = address_pipe

# Для локальных пользователей также создаем возможность перенаправления почты
# через ~/.forward файл. Если включена директива allow_filter, то в .forward
# файле можно использовать язык sieve фильтров. Для подробностей см.
# документацию на www.exim.org, т.к. на рассмотрение этой темы уйдет слишком
# много времени
userforward:
  driver = redirect
  check_local_user
  file = $home/.forward
  no_verify
  no_expn
  check_ancestor
# allow_filter
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  condition = ${if exists{$home/.forward} {yes} {no} }

# Локальная доставка, если данный пользователь найдем в базе

localuser:
  driver = accept
  condition = ${lookup pgsql {select 150 as uid from accounts where login = '$local_part' and domain='$domain'}{yes}{no}}
  transport = local_delivery
  cannot_route_message = Unknown user

######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

begin transports

# Драйвер для доставки через соединения с удаленными smtp серверами
remote_smtp:
  driver = smtp

# Этот транспорт доставляет почту в локальные maildir'ы. Путь к maildir хранится
# опять же в таблице accounts. Разрешения на директорию 0700 для возможности
# работы с данными директориями imap сервера. При этом владельцем является
# группа и пользователь из accounts (потому при вставлении записей в эту таблицу
# надо начинать значения uid с достаточно большого числа, например, 2000 и
# пересекаться с реальными пользователями оно должно только если реальному
# пользователю нужен локальный доступ к maildir'у).
# Также из таблицы accounts извлекается данные о размере квоты, и
# устанавливается порог в 75% от квоты, когда пользователю посылается указанное
# предупреждение об подходе к порогу квоты
local_delivery:
  driver = appendfile
#  directory = ${lookup pgsql{select maildir from accounts where login = '$local_part@$domain'}{$value}fail}
  directory = ${lookup pgsql{select '/usr/local/mailusers/'||c.domain||'/'||substring(c.login from 1 for 1)||'/'||c.login as maildir from accounts as c where login = '$local_part' and domain='$domain'}{$value}fail}
  create_directory
  directory_mode = 0770
  maildir_format
  delivery_date_add
  envelope_to_add
  return_path_add
  group = ${lookup pgsql{select 150 as gid  from accounts where login = '$local_part' and domain='$domain'}{$value}fail}
  user = ${lookup pgsql{select 150 as uid from accounts where login = '$local_part' and domain='$domain'}{$value}fail}
  mode = 0660
  no_mode_fail_narrower
  quota = ${lookup pgsql{select mailquota from accounts where login = '$local_part' and domain='$domain'}{$value}fail}M
  quota_warn_message = "\
          To: $local_part@domain\n\
        From: postmaster@test.ru\n\
        Subject: Your maildir is going full\n\
        This message is automaticaly gnerated by your mail server.\n\
        This means, that your mailbox is 75% full. If you would \n\
        override this limit new mail would not be delivered to you!\n"
  quota_warn_threshold = 75%

# Транспорт, осуществляющий доставку в pipe
address_pipe:
  driver = pipe
  return_output

# Транспорт, осуществляющий доставку прямо в файл
address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

# Этот транспорт используется для автоматического ответа на сообщения об ошибках
address_reply:
  driver = autoreply

######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################

begin retry

# Настройки по умолчанию, которые я не трогал, управляют интервала повторной
# передачи сообщений

# This single retry rule applies to all domains and all errors. It specifies
# retries every 15 minutes for 2 hours, then increasing retry intervals,
# starting at 1 hour and increasing each time by a factor of 1.5, up to 16
# hours, then retries every 6 hours until 4 days have passed since the first
# failed delivery.

# Address or Domain    Error       Retries
# -----------------    -----       -------

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

######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

begin rewrite

# Создаем правило, по переписыванию заголовка To: с *@test.ru на локальный
# smart-host - @unona.test.ru. Это было сделано для локальных пользователей,
# по идее с хранением пользователей в postgres, уже не нужно, показано для
# примера.
*@test.ru $1@unona.test.ru T

######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

# Описания аутентификации

begin authenticators
# CRAM-MD5 аутентификация, требует наличия пароля в открытом виде, имя
# пользователя должно быть в формате user@domain, как оно хранится в таблице
# accounts
lookup_cram:
        driver = cram_md5
        public_name = CRAM-MD5
        server_secret = ${lookup pgsql {select password from accounts where login||'@'||domain='$1'}{$value}fail}
        server_set_id = $1
# LOGIN аутентификация - не требует хранения пароля в открытом виде, однако, по
# сети пароль передается в открытом виде - требуется лишь выполнение условия
# server_condition - $1 - имя пользователя, а $2 - пароль. LOGIN безопасен
# только при установлении ssl соединения.
login:
        driver = plaintext
        public_name = LOGIN
        server_prompts = Username:: : Password::
        server_condition = ${lookup pgsql {select login from accounts where login||'@'||domain='$1' and password='$2'}{yes}{no}}
        server_set_id = $1
       
######################################################################
#                   CONFIGURATION FOR local_scan()                   #
######################################################################

# If you have built Exim to include a local_scan() function that contains
# tables for private options, you can define those options here. Remember to
# uncomment the "begin" line. It is commented by default because it provokes
# an error with Exim binaries that are not built with LOCAL_SCAN_HAS_OPTIONS
# set in the Local/Makefile.

# begin local_scan

# End of Exim configuration file
Parent - By LOE (Site/forum admin) Date 28.12.05 09:47 Edited 28.12.05 09:52
Просил же - не кидать конфиг в сообщение, а приаттачить его!!!!
В следующий раз - просто сотру.

Перепиши так:
domainlist local_domains = mxpost.tcn.ru : mxpost : ACL_PREFIX/hostingdomains : pgsql;MYDOMAINS
а в самом начале конфига задай:
MYDOMAINS = select domainname from localdomains where domainname='$domain'


Если не поможет - запускай с полной отладкой и смотри на какой проверке домен не может быть сроутен
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 28.12.05 09:57
Спасибо, оно работает. Только вот не помешало бы объяснение в чем различия между тем, что было и тем, как работает?
а как аттачить файлики я в интерфейсе не нашел. Справку тоже прочитал.
Parent - By LOE (Site/forum admin) Date 28.12.05 11:43
Аттачить - помещаешь сообщение, жмешь Редактировать и там будет Приаттачить.

А объяснение простое
твоё выражение содержит fail. Поскольку проверяется домен, отсутствующий в базе, всё выражение становится fail
Домен становится нелокальным. И, соответственно, подпадает под первый же роутер, в котором не должны проверятся локальные домены. Роутится удалённо сам на себя с выдачей вот такой ошибки.

В моем случае просто возвращается домен или "пусто". А поскольку домен явно прописан в списке, то он и остается локальным.
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 04.01.06 12:29
Хорошо. Буду знать
У меня появилось еще несколько опросов.
Например когда ящик пользователя переполнен оно не отсылает письма обратно с сообветствующим уведомлением и просто кидает их в очередь и копится эта очередь долго и муторно.
2006-01-04 15:08:31 1EtfEW-000IUt-66 == (тут было было то кому письмо и чей ящик переполнен) R=localuser T=local_delivery defer (-52): Retry time not yet reached
а такое оно пишет в лог.
Вот как бы еще этот момент решить?

А вот когда не получилось отправить письмо обртно пусть оно упадет в какой ни будь служебный ящик или в крайнем случае локальному руту. А то оно тоже остается в очереди пока система просто насильно его не прибъет.
Если  я переведу на этот почтовик все свои домены, то очередь будет просто вечто большой и будет постоянно увеличиваться, чего бы не хотелось!
Parent - By LOE (Site/forum admin) Date 04.01.06 19:44 Edited 04.01.06 19:47
Условие "переполнения" какое?
Надо прописать экзиму что в таком случае делать.
Сейчас же, идет простая задержка доставки: T=local_delivery defer (-52): Retry time not yet reached т.е. транспорт local_delivery отвергнут - не наступило время повтора.

Далее, уведомление о недоставке - почитай доку как делать. Сам я не делал за ненадобностью.
Вообще, если письмо уже получено, то и нет смысла задерживать с доставкой. Трафик все равно потрачен.
Т.е. надо делать так, чтобы при превышении лимита размера ящика, письмо вообще не принималось (тогда и не будет проблем с доставкой). В этом случае отправляющей стороне надо выдать код 450, т.е. временный неприем письма. Отправляющий сервер будет (по своему алгоритму) пытаться отправить письмо, после истечения времени повторов отправителю пойдет уведомление о недоставке.

Советую как можно меньше использовать всяческие автоматически генерируемые письма.
Ситуация: вирус (или спамер) отправляет письмо с поддельного адреса. Письмо не принимается. Генерируется автоответ.
Куда он пойдет? Правильно, по подставному адресу. И вот кто-то начинает в свой ящик ловить тьму сгенеренных автоответов. Что он будет чувствовать?
Меня, например, бесят уведомления о вирусах в письмах, посланных якобы с моего адреса
Просто напросто выдай 450 код и не принимай письмо. В крайнем случае, локальному получателю сгенерируй уведомление типа: "поскольку вы исчерпали лимит на размер ящика, то такое-то письмо не было принято."

Ко второй части:
уведомления о недоставке писем идут тому, от кого это письмо было получено.
Соответственно, надо делать так, чтобы отправителем был локальный административный контакт. Тогда и уведомления будут поступать ему.
Но советую реализовать корректно первую часть - неприем письма вообще. Тогда и забот будет меньше и ситуация будет разруливаться корректно.
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 05.01.06 12:33
проверка квоты выполняется транспортом local_delivery
я думаю надо завести роуту, которая бы вычисляла сколько занято в домашней директории по типу как это сделано в роуте проверки существования пользователя

localuser:
  driver = accept
  condition = ${lookup pgsql {select 150 as uid from accounts where login = '$local_part' and domain='$domain'}{yes}{no}}
  transport = local_delivery
  cannot_route_message = Unknown user


где нибудь тут и проверять на переполнение нужно, но вот в английском я не селен, а перевода документации не нашел.
всякие команды для работы с квотами есть для driver = appendfile
если честно я сам врятли соображу как написать роуту. И как сообщить и том, что письмо временно отвергнуто в определенным кодом!
Если поможете буду очень признателен!
Parent - By LOE (Site/forum admin) Date 05.01.06 21:39
Начать с того, что надо определиться - размер чего надо считать:
полученной почты за промежуток времени, размер текущего файла с почтой (если юзается mailbox) или размер каталога с письмами (для maildir), размер домашнего каталога.

Соответственно и решать задачу.
Чтобы временно не принять письмо - надо использовать директиву defer в ACL'ке (а не deny или accept) - тогда будет выдан 450 код.

Чтобы определить размер - почитай доку раздела String expansions. Например:
${stat:<string>}
The string, after expansion, must be a file path. A call to the stat() function is made for this path. If stat() fails, an error occurs and the expansion fails. If it succeeds, the data from the stat replaces the item, as a series of <name>=<value> pairs, where the values are all numerical, except for the value of 'smode'. The names are: 'mode' (giving the mode as a 4-digit octal number), 'smode' (giving the mode in symbolic format as a 10-character string, as for the ls command), 'inode', 'device', 'links', 'uid', 'gid', 'size', 'atime', 'mtime', and 'ctime'. You can extract individual fields using the extract expansion item.

Для случая mailbox - вычислить в ACL'ке текущий размер и отдать defer во время проверок на rcpt
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By ras Date 14.03.06 09:34
Кто-нибудь знает программу сбора статистики для exim,
типа sarg для squid, т.е. чтоб формировала разнообразные html-отчеты по пользовтелям: кто и в каком объеме, на (с) какие адреса
отправлял и получал почтовые сообщения за определенный промежуток времени.
Parent - By G0thic Date 14.03.06 13:03
Чем не устраивает встроенное средство - eximstats?
Расширенную статистику можно загонять в базу через set var = ${lookup mysql{insert into .. () values () }{$value}{0}}
тебе понадобятся $message_size $sender_address_domain $sender_address_local_part $local_part $domain
и незабудь про quote_mysql
Когда кругозор человека сужается к минимуму, он называет это своей точкой зрения.
Parent - By Deep Date 15.03.06 13:12
Оно окнечно замечательн заносит то, что было deny
а для полной статистики хотелось бы еще занести в базу и accept только вот почему то поля $local_part и $domain получаются пустыми, что не очень то приятно! В итоге знаешь кто отправлял письмо но не известно кому оно попало!
Parent By LOE (Site/forum admin) Date 15.03.06 19:43
Как отвечал ниже - ИМХО не в том блоке acl используешь
OK
Вот мой хинт самостоятельного занесения статистики в базу

В самом начале конфига прописываем:
STAT_ADD=INSERT INTO Stat (Sender,Recipient,Size,D,T,Shost) values \
        ('${quote_mysql:$sender_address}',\
        '${quote_mysql:$recipients}',\
        $message_size, now(), now(),\
        '${quote_mysql:$sender_host_address}')

Назначаем acl-ку:
acl_smtp_data = check_message

Прописываем саму acl-ку:
#!!# ACL that is used after the DATA command
check_message:
  warn set acl_m4 = ${lookup mysql{STAT_ADD}{1}{1}}
  accept

Поскольку rcpt to может быть выдано больше одного раза, то в поле Recipients попадут данные через запятую - надо это учитывать при дальнейшей разборке статистики
Можно заносить и в acl_smtp_rcpt блоке в соответствующем месте, но, поскольку accept-reject могут переплетаться, трудно сразу сообразить куда вставить занесение статистики.
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 15.03.06 08:34
Вот еще хотело бы для некоторых пользователей/доменов полностью отключить спам-фильтры и все асцесс листы.
Как можно это реализовать?
Parent - By LOE (Site/forum admin) Date 15.03.06 11:46
В exim'е можно всё :-)
Настрой acl-ки на срабатывание только для нужных пользователей/доменов
Лично я такую инфу тоже храню в базе и в acl'ке прописываю соответствующий condition.
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 15.03.06 15:42
пишу:

warn  message = X-Spam-Status: Yes, hits=$spam_score
        hosts   = !+relay_from_hosts
        condition = ${lookup pgsql {select 1 as uid from localdomains as d where d.domainname='$domain' and d.spamassasin=1}{yes}{no}} - вот это всегда no потому что $domain не определено
        spam    = spamd:true
        condition = ${if >{$spam_score_int}{50}{1}{0}}


И ни чего у меня не выходит по этому. Получается спамфсасин отключен для всех.
как это по бороть то? Please!!!
Parent - By LOE (Site/forum admin) Date 15.03.06 19:27
В каком блоке acl-ек это используется?
$domain определено начиная с acl_smtp_rcpt (но никак не в acl_smtp_mail)
И не забывай про квотинг передаваемых в запрос переменных. Для mysql : ${quote_mysql:$domain}

И еще:
самое лучшее средство узнать "что не так", это запустить с полной отладкой
exim -d+all -bh ip.add.re.s
exim -d+all -bh 1.2.3.4
**** SMTP testing session as if from host 1.2.3.4
**** but without any ident (RFC 1413) callback.
**** This is not for real!
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 16.03.06 11:07
хорошо с ACL разобрался.....
вот только там пишем везже deny
а вот как написать что письмо принято? если оно везде принято в ACL а потом отвергнуто по причине отсутствия пользователя?
вот как бы еще научиться писать статистку из routes и transports что бы на одно письмо была только одна запись? А то у меня получается, что ACL оно было принято, а дальше не пролезло, и что с ним случилось ни кому не известно...
Parent - By LOE (Site/forum admin) Date 16.03.06 13:23
Это как - принято, а потом отвергнуто?
Если в acl-ке стоит deny - письмо отвергается; если стоит accept - принимается
Приниматься письмо должно только после проверки на наличие пользователя в системе (что касается входящих писем)

А не так, что письмо принялось, а роутеры не смогли его сроутить.

Что случилось - всё отражается в логах.
Все стадии: принято, попытка отправить или записать и т.п.
На крайняк - запуск с полным дебагом
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 16.03.06 15:40 Edited 16.03.06 15:44
ладно..... и с этим разобрался.....
вот еще одна проблема. На письма которые направляются для нескольких адресатов в delevired to не значение $message_size почему то -1 всегда....
и вообще, как можно узнать какие переменные определены в определенном месте конфига?  А то я лазию по примерам да ставлю эксперименты.
т.е. для этого письма

2006-03-16 18:14:55 1FJuBe-000M3v-Im <= zwqtqfcdi@jrra.com H=ewk185.neoplus.adsl.tpnet.pl (83.20.234.185) [83.20.234.185] P=smtp S=57579
2006-03-16 18:14:55 1FJuBe-000M3v-Im => sales <sales@intercom-pc.ru> R=localuser T=local_delivery
2006-03-16 18:14:55 1FJuBe-000M3v-Im => info <info@intercom-pc.ru> R=localuser T=local_delivery
2006-03-16 18:14:55 1FJuBe-000M3v-Im Completed

$message_size в базу попало как -1 что мне не очень то нравится тем более что на самом деле это письмо весит 57693
вот его заголовки:

Return-path: <zwqtqfcdi@jrra.com>
Envelope-to: info@intercom-pc.ru
Delivery-date: Thu, 16 Mar 2006 18:14:55 +0300
Received: from ewk185.neoplus.adsl.tpnet.pl ([83.20.234.185] helo=83.20.234.185)
        by mxpost.tcn.ru with smtp (Exim 4.60 (FreeBSD))
        (envelope-from <zwqtqfcdi@jrra.com>)
        id 1FJuBe-000M3v-Im; Thu, 16 Mar 2006 18:14:55 +0300
From: =?koi8-r?B?88/Ty8/XIPou+i4=?= <zwqtqfcdi@jrra.com>
To: xynh <xynh@intercom-pc.ru>
Subject: =?koi8-r?B?VklQLdrBzNkg1yDB3NLP0M/S1MHIIMcu7c/Ty9fZ?=
Date: Thu, 16 Mar 2006 18:18:18 +0400
Reply-To: zwqtqfcdi@jrra.com
Mime-Version: 1.0
Content-Type: multipart/related;
        boundary="----=_NextPart_000_0072_01YE875P.169D26N5"
X-Mailer: Microsoft Outlook Express 6.00.2600.0000
X-Priority: 1
X-MSMail-Priority: High
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000


могет мне всетаки прицепить свой конфиг? Кто ни будь на досуге поковыряется, а кому ни будь и пригодится для сервака..... :-)
Parent By LOE (Site/forum admin) Date 16.03.06 19:53
Еще раз - в каком месте (на каком этапе) заносишь данные в базу?!
Размер письма четко определен _только_ после окончания DATA от посылающего, когда наступает этап доставки письма (а не приема)
Да, протокол ESMTP позволяет задавать размер еще на этапе EHLO, но не все (видимо) хотят его использовать.
А судя по письму, это к тебе приехал спам. А спамеры плюют на все стандарты.
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 16.03.06 11:55
И еще одно в догонку.
Некоторые пользователи не заполняют поле FROM в почтовом клиенте. а почтовик все равно пропускает их письма при условии, что они авторизовались на SMTP
Вот как бы сделать так, что бы оно ставило поле FROM login@domen пользователя который авторизовался?
и вообще отвергало входящие письма для локальных доменов с пустым полем FROM?
Parent - By LOE (Site/forum admin) Date 16.03.06 13:28
Пропускать или нет - _полностью_ прописано в конфиге. Если стоит разрешение пропускать письмо от авторизованных - он и пропустит.

Оперирование с строками в хидере:
headers_remove, headers_add и т.п.

Чтобы проверить наличие/отсутствие/полноту/корректность любого поля в заголовке, надо сначала этот заголовок принять
Да и по большому счету - какая разница, что будет в поле From
Если пользователь не хочет, чтобы получатель имел возможность знать куда ответить на письмо - ССЗБ
А если это исходящие из локалки наружу письма - обрубать руки пользователям и требовать полной настройки клиента, чтобы E-mail был прописан.
"No! Try not! Do. Or do not. There is no try." -- Yoda
Parent - By Deep Date 25.04.06 08:52
Вот еще одна фишка понадобаль.... либо я чего то не до понимаю, либо просто не знаю.
в общем хочется сделать адиас для домена т.е. есть локальный домен aa.ru и в нем пользователь user так вот что бы почта пришедшая на user@bb.ru попала в папку пользователю user@aa.ru
Parent By LOE (Site/forum admin) Date 25.04.06 12:06
Пропиши транспорт, в котором будут делаться такие "преобразования"
"No! Try not! Do. Or do not. There is no try." -- Yoda
Previous Next Up Topic Софт / Программное обеспечение / exim 4.60 (35520 hits)

Powered by mwForum 2.12.0 © 1999-2007 Markus Wichitill

Page created in 0.083s with 11 database queries.