Страница 1 из 2

Проблема с написанием кондишена

Добавлено: 2007-04-23 15:25:47
dikens3
Полистал доки exim, что-то просветление не находит.
1. Где почитать примеры настроек condition'ов?
Интересуют:
${if eq}
${if match}
mysql; select * from xxx;


2. Собственно есть системные e-Mail'ы и им почта не нужна. Хочется их блокировать(только localhost от их имени будет слать)
Таблица aliases содержит поле dst_username (без домена) и ключик active=S (system)
Нужно блокировать всех, где local_parts = описанные в таблице с active=S.

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

# Прибиваем привилегированные E-mail'ы, им почта не нужна.
  deny    message       = "Unknown user block"
#          local_parts   = ${lookup mysql{SELECT dst_username FROM aliases WHERE dst_domain='${domain}' AND active='S'}}
Как-то странно, если одна запись на выходе(mysql = root), то работает, если несколько, тогда не работает. :-)

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

#         local_parts   = mysql; SELECT dst_username FROM aliases WHERE dst_domain='${domain}' AND active='S'
Блокирует всё.

Добавлено: 2007-04-23 16:38:29
Alex Keda
если несколько, в данном случае должен быть список - через двоеточие...

Добавлено: 2007-04-23 17:00:01
dikens3
http://forum.lissyara.su/viewtopic.php?t=3291

Тут я делал через dbm, работает. :-)
А вот mysql :-( Буду думать.

Добавлено: 2007-04-23 17:55:58
Abigor
я сейчас так же мучаюсь со списком.
есть алиас, скажем 10 адресов. задача, проверить квоту еще на этапе rcpt, есть хоть у одного из юзверей квота превышена, пинать всех 10 пользователей. для одного я уже сделал, все прекрасно, а вот для списа также мучаюсь, но идея есть, но врядли прокатит.

Добавлено: 2007-04-23 18:04:03
dikens3
Тут лис говорил что на этапе rcpt_to делать не следует, ибо ещё неизвестен точный размер письма и куча кривых почтовиков эти данные не послают или они не верные. (как сделал вобщем?)

Я пока в транспорты закинул, стандартно.

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

mysql_delivery:
..
..
Ограничение на размер входящего сообщения
message_size_limit = ${lookup mysql{MYSQL_SIZEMESS}{${value}M}{DEFAULT_SIZE_LIMIT}}

Общая квота:
quota = ${lookup mysql{MYSQL_QUOTA}{${value}M}{DEFAULT_QUOTA_LIMIT}}

Добавлено: 2007-04-23 18:19:19
dikens3

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

 size_addition  	 smtp  	 integer  	 1024

   Если удалённый сервер SMTP указывает, что он поддерживает опцию SIZE в команде MAIL, exim использует её для передачи размера сообщения, в начале SMTP-транзакции.
Т.е. удалённые серваки могут не передавать SIZE. :-)

Добавлено: 2007-04-23 21:03:32
Alex Keda
Abigor писал(а):я сейчас так же мучаюсь со списком.
есть алиас, скажем 10 адресов. задача, проверить квоту еще на этапе rcpt, есть хоть у одного из юзверей квота превышена, пинать всех 10 пользователей. для одного я уже сделал, все прекрасно, а вот для списа также мучаюсь, но идея есть, но врядли прокатит.
на этапе заголовков тока один реципиент...
ели тока рассыока открытая - но тогда таккже пинаться должно...

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

/usr/home/lissyara/>telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ussr.lissyara.int.otradno.ru ESMTP Sendmail 8.13.8/8.13.8; Mon, 23 Apr 2007 22:01:57 +0400 (MSD)
helo ya.ru
250 ussr.lissyara.int.otradno.ru Hello localhost [127.0.0.1], pleased to meet you
mail from:<admin@lissyara.su>,<lissyara@lissyara.su>
250 2.1.0 <admin@lissyara.su>,<lissyara@lissyara.su>... Sender ok
rcpt to: lissyara
250 2.1.5 lissyara... Recipient ok
data
354 Enter mail, end with "." on a line by itself
test
.
250 2.0.0 l3NI1vmw001319 Message accepted for delivery
quit
221 2.0.0 ussr.lissyara.int.otradno.ru closing connection
Connection closed by foreign host.
/usr/home/lissyara/>

Добавлено: 2007-04-23 21:06:04
Alex Keda
а в предыдущем я ошибся...

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

/usr/home/lissyara/>telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ussr.lissyara.int.otradno.ru ESMTP Sendmail 8.13.8/8.13.8; Mon, 23 Apr 2007 22:04:01 +0400 (MSD)
mail from:<admin@lissyara.su>rcpt to: lissyara,root,mailnull
555 5.5.4 to parameter unrecognized
mail from:<admin@lissyara.su>
250 2.1.0 <admin@lissyara.su>... Sender ok
rcpt to: lissyara,root,mailnull
553 5.1.3 lissyara,root,mailnull... Invalid route address
rcpt to: lissyara, root, mailnull
555 5.5.4 root parameter unrecognized
rcpt to: lissyara, mailnull
555 5.5.4 mailnull parameter unrecognized
quit
221 2.0.0 ussr.lissyara.int.otradno.ru closing connection
Connection closed by foreign host.
/usr/home/lissyara/>      

Добавлено: 2007-04-24 3:00:05
Abigor
dikens3 писал(а):Тут лис говорил что на этапе rcpt_to делать не следует, ибо ещё неизвестен точный размер письма и куча кривых почтовиков эти данные не послают или они не верные. (как сделал вобщем?)
на самом деле пофиг что они не все правильно шлют, 10 писем из 100 то же результат, по этому у меня есть смысл такое навертеть, а то юзвери [классический секс],

Добавлено: 2007-04-24 8:05:03
Alex Keda
тока предусмотри - может быть назадан (что в этом случае будет в переменной, и будет ли она - я не знаю - хотя в доках где-то это было описано)

Добавлено: 2007-04-24 12:27:36
dikens3
Я вот так сделал:

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

# Квота на входящее сообщение
MYSQL_SIZEMESS = SELECT `quota-in` FROM users WHERE username='${quote_mysql:$local_part}' AND domain='${quote_mysql:$domain}'
DEFAULT_SIZE_LIMIT = 25M

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

# Ограничение на приём сообщения для наших пользователей, если сообщение больше определённого размера не принимаем.
  deny    message       = Too big size of message. Message size limit = ${lookup mysql{MYSQL_SIZEMESS}{${value}M}{DEFAULT_SIZE_LIMIT}}.
          domains       = +local_domains
          condition     = ${if > {$message_size}{${lookup mysql{MYSQL_SIZEMESS}{${value}M}{DEFAULT_SIZE_LIMIT}}}}

Добавлено: 2007-04-24 13:27:35
dikens3
Хочу сделать ограничение на объём отправляемого сообщения для наших пользователей.

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

# Ограничение на отправку сообщения для наших пользователей, если сообщение больше определённого размера не отправляем.
  deny    message       = 10K for $sender_address_domain $sender_address
          sender_domains = mydomain1.ru : mydomain2.ru
          condition     = ${if > {$message_size}{10K}}
Так работает :-)

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

  deny    message       = 10K for $sender_address_domain $sender_address
          sender_domains = +local_domains
          condition     = ${if > {$message_size}{10K}}
А так нет. Вот я не въеду, а почему собственно?

Добавлено: 2007-04-24 13:45:12
dikens3
Вопрос снимается. В багах разыскал. Работать пока не будет. :-(

Добавлено: 2007-04-24 14:19:14
Alex Keda
dikens3 писал(а):Вопрос снимается. В багах разыскал. Работать пока не будет. :-(
непонял...

Добавлено: 2007-04-24 14:57:46
dikens3
Такой баг не только у меня, щас отпишусь разработчикам.

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

acl_check_rcpt:
  accept  hosts = :

  deny    message        = Too big size of message. Message size limit = 10K
          domains        = +local_domains
          condition      = ${if > {$message_size}{10K}}

  deny    message        = Too big size of message. Message size limit = 10K
          sender_domains = +local_domains
          condition      = ${if > {$message_size}{10K}}


I'm testing the first deny acl:
# exim -bh 192.168.2.4

**** SMTP testing session as if from host 192.168.2.4
**** but without any ident (RFC 1413) callback.
**** This is not for real!

>>> host in hosts_connection_nolog? no (option unset)
LOG: SMTP connection from [192.168.2.4]
>>> host in host_lookup? yes (matched "*")
>>> looking up host name for 192.168.2.4
>>> IP address lookup yielded dik.birzhaplus.ru.local
>>> gethostbyname looked up these IP addresses:
>>>   name=dik.birzhaplus.ru.local address=192.168.2.4
>>> checking addresses for dik.birzhaplus.ru.local
>>>   192.168.2.4 OK
>>> host in host_reject_connection? no (option unset)
>>> host in sender_unqualified_hosts? no (end of list)
>>> host in recipient_unqualified_hosts? no (end of list)
>>> host in helo_verify_hosts? no (option unset)
>>> host in helo_try_verify_hosts? no (option unset)
>>> host in helo_accept_junk_hosts? no (option unset)
220-Welcome on our mail server!
220  newmail.birzhaplus.ru ESMTP
EHLO test
>>> host in pipelining_advertise_hosts? no (end of list)
>>> host in auth_advertise_hosts? yes (matched "*")
>>> host in tls_advertise_hosts? yes (matched "*")
250-newmail.birzhaplus.ru Hello dik.birzhaplus.ru.local [192.168.2.4]
250-SIZE 52428800
250-AUTH PLAIN LOGIN CRAM-MD5
250-STARTTLS
250 HELP
mail from:<postmaster@birzhaplus.ru>
250 OK
rcpt to:<postmaster@birzhaplus.ru>
>>> using ACL "acl_check_rcpt"
>>> processing "accept"
>>> check hosts = :
>>> host in ":"? no (end of list)
>>> accept: condition test failed
>>> processing "deny"
>>> check domains = +local_domains
>>> birzhaplus.ru in "birzhaplus.ru"? yes (matched "birzhaplus.ru")
>>> birzhaplus.ru in "+local_domains"? yes (matched "+local_domains")
>>> check condition = ${if > {$message_size}{10K}}
>>>                 =
>>> deny: condition test failed
>>> processing "deny"
>>> check sender_domains = +local_domains
>>> birzhaplus.ru in "birzhaplus.ru"? yes (matched "birzhaplus.ru")
>>> birzhaplus.ru in "+local_domains"? yes (matched "+local_domains")
>>> check condition = ${if > {$message_size}{10K}}
>>>                 =
>>> deny: condition test failed

Very good, sender_domains working.

I'm testing the second deny acl:
# exim -bh 192.168.2.4

**** SMTP testing session as if from host 192.168.2.4
**** but without any ident (RFC 1413) callback.
**** This is not for real!

>>> host in hosts_connection_nolog? no (option unset)
LOG: SMTP connection from [192.168.2.4]
>>> host in host_lookup? yes (matched "*")
>>> looking up host name for 192.168.2.4
>>> IP address lookup yielded dik.birzhaplus.ru.local
>>> gethostbyname looked up these IP addresses:
>>>   name=dik.birzhaplus.ru.local address=192.168.2.4
>>> checking addresses for dik.birzhaplus.ru.local
>>>   192.168.2.4 OK
>>> host in host_reject_connection? no (option unset)
>>> host in sender_unqualified_hosts? no (end of list)
>>> host in recipient_unqualified_hosts? no (end of list)
>>> host in helo_verify_hosts? no (option unset)
>>> host in helo_try_verify_hosts? no (option unset)
>>> host in helo_accept_junk_hosts? no (option unset)
220-Welcome on our mail server!
220  newmail.birzhaplus.ru ESMTP
EHLO test
>>> host in pipelining_advertise_hosts? no (end of list)
>>> host in auth_advertise_hosts? yes (matched "*")
>>> host in tls_advertise_hosts? yes (matched "*")
250-newmail.birzhaplus.ru Hello dik.birzhaplus.ru.local [192.168.2.4]
250-SIZE 52428800
250-AUTH PLAIN LOGIN CRAM-MD5
250-STARTTLS
250 HELP
mail from:<postmaster@birzhaplus.ru>
250 OK
rcpt to:<test@mail.ru>
>>> using ACL "acl_check_rcpt"
>>> processing "accept"
>>> check hosts = :
>>> host in ":"? no (end of list)
>>> accept: condition test failed
>>> processing "deny"
>>> check domains = +local_domains
>>> mail.ru in ""? no (end of list)
>>> mail.ru in "+local_domains"? no (end of list)
>>> deny: condition test failed
>>> processing "deny"
>>> check sender_domains = +local_domains
>>> birzhaplus.ru in ""? no (end of list)
>>> birzhaplus.ru in "+local_domains"? no (end of list)
>>> deny: condition test failed

Why sender_domains = ""?


I have changed a condition on:

  deny    message        = Too big size of message. Message size limit = 10K
          sender_domains = birzhaplus.ru : birzhaplus.nnov.ru
          condition      = ${if > {$message_size}{10K}}

# exim -bh 192.168.2.4

**** SMTP testing session as if from host 192.168.2.4
**** but without any ident (RFC 1413) callback.
**** This is not for real!

>>> host in hosts_connection_nolog? no (option unset)
LOG: SMTP connection from [192.168.2.4]
>>> host in host_lookup? yes (matched "*")
>>> looking up host name for 192.168.2.4
>>> IP address lookup yielded dik.birzhaplus.ru.local
>>> gethostbyname looked up these IP addresses:
>>>   name=dik.birzhaplus.ru.local address=192.168.2.4
>>> checking addresses for dik.birzhaplus.ru.local
>>>   192.168.2.4 OK
>>> host in host_reject_connection? no (option unset)
>>> host in sender_unqualified_hosts? no (end of list)
>>> host in recipient_unqualified_hosts? no (end of list)
>>> host in helo_verify_hosts? no (option unset)
>>> host in helo_try_verify_hosts? no (option unset)
>>> host in helo_accept_junk_hosts? no (option unset)
220-Welcome on our mail server!
220  newmail.birzhaplus.ru ESMTP
EHLO test
>>> host in pipelining_advertise_hosts? no (end of list)
>>> host in auth_advertise_hosts? yes (matched "*")
>>> host in tls_advertise_hosts? yes (matched "*")
250-newmail.birzhaplus.ru Hello dik.birzhaplus.ru.local [192.168.2.4]
250-SIZE 52428800
250-AUTH PLAIN LOGIN CRAM-MD5
250-STARTTLS
250 HELP
mail from:<postmaster@birzhaplus.ru>
250 OK
rcpt to:<test@mail.ru>
>>> using ACL "acl_check_rcpt"
>>> processing "accept"
>>> check hosts = :
>>> host in ":"? no (end of list)
>>> accept: condition test failed
>>> processing "deny"
>>> check domains = +local_domains
>>> mail.ru in ""? no (end of list)
>>> mail.ru in "+local_domains"? no (end of list)
>>> deny: condition test failed
>>> processing "deny"
>>> check sender_domains = birzhaplus.ru : birzhaplus.nnov.ru
>>> birzhaplus.ru in "birzhaplus.ru : birzhaplus.nnov.ru"? yes (matched "birzhaplus.ru")
>>> check condition = ${if > {$message_size}{10K}}
>>>                 =
>>> deny: condition test failed

Here the condition sender_domains is carried out.

Добавлено: 2007-04-24 17:35:50
Abigor
ну не знаю, я себе сделал ограничение на входящие и исходящие письмо для смертных, уже как три месяца нормально все пашет.

Добавлено: 2007-04-24 17:47:15
dikens3
Давай делись конфигами, сделал, сделал. А толку, похоже одну работу делаем по отдельности.

Я проблему с системными пользователями решил, неправильный запрос mysql сделал. Сам мудак.

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

MYSQL_SYSTEM_USERS      = SELECT dst_username FROM aliases WHERE dst_username='$local_part' AND dst_domain='${domain}' AND active='S'

.ifdef MYSQL_SYSTEM_USERS
# Прибиваем привилегированные E-mail'ы, им почта не нужна.
  deny    message       = "System user"
          local_parts   = ${lookup mysql{MYSQL_SYSTEM_USERS}}
.endif

Добавлено: 2007-04-24 17:49:15
dikens3
Ограничение на размер входящий сообщений:

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

# Квота на входящее сообщение
MYSQL_SIZEMESS          = SELECT `quota-in` FROM users WHERE username='${quote_mysql:$local_part}' AND domain='${quote_mysql:$domain}'
DEFAULT_SIZE_LIMIT      = 25M
MYSQL_ALIAS_QUOTA       = SELECT `quota-in` FROM users WHERE username=(SELECT recipients FROM aliases WHERE dst_username='${quote_mysql:$local_part}' AND dst_domain='${quote_mysql:$domain}')

# Квота на исходящее сообщение
MYSQL_MESSOUT           = SELECT `quota-out` FROM users WHERE username='${quote_mysql:$local_part}' AND domain='${quote_mysql:$domain}'
DEFAULT_MESSOUT_LIMIT   = 25M


.ifdef MYSQL_SIZEMESS
# Ограничение на приём сообщения для наших пользователей, если сообщение больше определённого размера не принимаем.
  deny    message       = Too big size of message. Message size limit = ${lookup mysql{MYSQL_SIZEMESS}{${value}M}{DEFAULT_SIZE_LIMIT}}.
          domains       = +local_domains
          condition     = ${if > {$message_size}{${lookup mysql{MYSQL_SIZEMESS}{${value}M}{DEFAULT_SIZE_LIMIT}}}}
.endif

.ifdef MYSQL_ALIAS_QUOTA
# Ограничение на приём сообщения для алиасов наших пользователей, если сообщение больше определённого размера не принимаем.
  deny    message       = Too big size of message. Message size limit = ${lookup mysql{MYSQL_ALIAS_QUOTA}{${value}M}{DEFAULT_SIZE_LIMIT}}.
          domains       = +local_domains
          condition     = ${if > {$message_size}{${lookup mysql{MYSQL_ALIAS_QUOTA}{${value}M}{DEFAULT_SIZE_LIMIT}}}}
.endif
Алиасы у меня пишутся без домена. :-) Поэтому можно сконструировать вложенный запрос.

Добавлено: 2007-04-24 17:56:33
Abigor
ну, у меня системных юзверей нету.

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

acl_check_rcpt:

#warn log_message = message size: $message_size

#--- провека квоты на размер отправляемого письма
deny    message = Razmer otpravljaemogo pisma prevyshen!!! $message_size byte
#    hosts = 10.1.10.13
    set acl_m0 = ${lookup mysql{SELECT username,mess_quota_out FROM `mailbox` \
                                WHERE `username`='${quote_mysql:$sender_address}'}}
    condition = ${if eq {} {${extract{username}{$acl_m0}}}{No}{Yes}}
#    set acl_m3 = ${extract{mess_quota_out}{$acl_m0}}
    condition = ${if > {$message_size} {${extract{mess_quota_out}{$acl_m0}}}{Yes}{No}}
#--- end

#--- провека квоты на размер полученного письма
deny    message = Razmer vkhodjashchego pisma prevyshen!! $message_size byte
#    hosts = 10.1.10.13
    set acl_m1 = ${lookup mysql{SELECT username,mess_quota_in FROM `mailbox` \
                                WHERE `username`='$local_part@$domain'}}
    condition = ${if eq {} {${extract{username}{$acl_m1}}}{No}{Yes}}
#    set acl_m2 = ${extract{mess_quota_in}{$acl_m1}}
    condition = ${if > {$message_size}{${extract{mess_quota_in}{$acl_m1}}}{Yes}{No}}
#--- end
вообще надо делать две проверки на размер письма, одну еще на этапе rcpt а второю на этапе data, так как если отправитель или получатель юзают esmtp то размер известен сразу, а если просто smtp то он будет известен только в data, перую я проверку сделал, а вот вторую руки не доходят, квоты на вх. и ис. письма у меня разные =)

Добавлено: 2007-04-24 18:06:44
dikens3
Abigor писал(а):ну, у меня системных юзверей нету.
У меня тоже, но если потребуется создать пользователя для переписки только внутри наших доменов, то очень нужная вещь понимаешь.. :-)
вообще надо делать две проверки на размер письма, одну еще на этапе rcpt а второю на этапе data, так как если отправитель или получатель юзают esmtp то размер известен сразу, а если просто smtp то он будет известен только в data, перую я проверку сделал, а вот вторую руки не доходят, квоты на вх. и ис. письма у меня разные =)
Спасибо за разъяснение esmtp, не знал. Тут есть проблема, domains = +local_domains в acl_data не работает. :-) Буду думать что-нибудь.

Добавлено: 2007-04-25 2:42:15
Abigor
ну, мнин, не вижу проблем, сделать acl что юзверю можно слать письмо только на определенный список адресов если честно.

Добавлено: 2007-04-25 11:57:48
dikens3
Abigor писал(а):ну, мнин, не вижу проблем, сделать acl что юзверю можно слать письмо только на определенный список адресов если честно.
У меня есть clamav, который любит посылать уведомления от имени clamav@domain.ru

Стоит проверка:
require verify = sender

Письмо принимается(это же не по tcp/ip) и рикошетом отправляются на postmaster@domain.ru

Отсюда:
1. Создать alias clamav@domain.ru
2. Запретить для него принимать почту.

Добавлено: 2007-04-25 14:22:01
Urgor
dikens3 писал(а):
Abigor писал(а):ну, у меня системных юзверей нету.
У меня тоже, но если потребуется создать пользователя для переписки только внутри наших доменов, то очень нужная вещь понимаешь.. :-)
Я у себя сделал так:

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

  deny   message        = Sorry. Sender Access Limited.
         hosts          = +relay_from_hosts
         domains        = !+local_domains
         senders        = ${lookup mysql{SELECT id FROM users \
                            WHERE `id`='${quote_mysql:$sender_address}' \
                            and `noinet`='1'}}

  accept  authenticated = *

  deny   message        = Sorry. Recipient Access Limited.
         hosts          = !+relay_from_hosts
         domains        = +local_domains
         recipients     = ${lookup mysql{SELECT id FROM users \
                            WHERE id='${quote_mysql:$local_part@$domain}' \
                              AND `noinet`='1'}}
И добил поле noinet, если в нем 1, то только внутри своего домена....

Добавлено: 2007-04-25 15:13:24
dikens3
Нормально.

А как ты проверяешь обратный адрес пользователя?
deny message = Sorry. Sender Access Limited.
hosts = +relay_from_hosts
domains = !+local_domains
senders = ${lookup mysql{SELECT id FROM users \
WHERE `id`='${quote_mysql:$sender_address}' \
and `noinet`='1'}}
Ведь согласно этому, если обратный адрес

1. user@Внешний_домен.ru тогда твой блок не работает.
2. user-с-отправкой_в_мир@твой_домен.ru тогда твой блок не работает.

Добавлено: 2007-04-26 9:37:40
Urgor
1. user@Внешний_домен.ru тогда твой блок не работает.
2. user-с-отправкой_в_мир@твой_домен.ru тогда твой блок не работает.
Допиши проверку Если АдресВПисьме != УчеткеВАутентификаторе то всех в лес :)