URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 80595
[ Назад ]

Исходное сообщение
"Помогите с Exim Filter ! :("

Отправлено whois , 03-Июн-08 14:41 
Добрый день!
Пытаюсь решить проблему с раздельным складированием спама, каждому пользователю.
В качестве деливера используется cyrus-imapd, и мне необходимо сформировать конечный адрес в exim примерно: test+spam@mydomain.com , ну и скормить это cyrus...
Но проблема не в этом, почему то когда я использую внешние файлы .forward для фильтрации заголовков "X-Spam" приведеным ниже конфигом:

userfilter:
  driver = redirect
  allow_filter
  user = mail
  skip_syntax_errors
  file = /var/spool/cyrus/mail/$domain/$local_part/.forward
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  no_verify

И содержимым .forward:

# Exim filter
if $header_subject contains test then
deliver $local_part+spam@$domain
endif

В этом случае обработка проходит на ура! Но меня интерисует одно, статическое правило (!) , то есть единое для каждого mailbox-а , и когда я создаю конфиг такого вида:

userspam:
  driver = redirect
  allow_filter
  user = mail
  skip_syntax_errors
  data = #Exim filter\n\
    if $header_subject contains test\n\
    then\n\
    deliver $local_part+spam@$domain\n\
    endif
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  no_verify

То в логах получаю мусор вида (test+spam+spam+spam+spam+...):

2008-06-03 18:18:58 Delay 0s for localhost [127.0.0.1] with HELO=mydomain. Mail from 12345@fakedomain.com to test@mydomain.com.
2008-06-03 18:18:58 1K3XLm-0004zP-3O <= 12345@domain.com H=localhost.nkb (vmware-st125) [127.0.0.1] I=[127.0.0.1]:25 P=esmtp S=909 id=356188.575129153-sendEmail@vmware-st125 from <12345@fakedomain.com> for test@mydomain.com
2008-06-03 18:18:58 1K3XLm-0004zP-3O userspam router: skipped error: malformed address "test+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam@mydomain.com" in filter file: address is ridiculously long: test+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam...
2008-06-03 18:18:58 1K3XLm-0004zP-3O **** log string overflowed log buffer ****

2008-06-03 18:18:58 1K3XLm-0004zP-3O internal error: store_reset(135693280) failed: pool=0      deliver.c 1078

Как с этим бороться? почему статически прописанное правило создает такой мусор?


Содержание

Сообщения в этом обсуждении
"Помогите с Exim Filter ! :("
Отправлено Hetzer , 04-Июн-08 08:06 
>[оверквотинг удален]
>to test@mydomain.com.
>2008-06-03 18:18:58 1K3XLm-0004zP-3O <= 12345@domain.com H=localhost.nkb (vmware-st125) [127.0.0.1] I=[127.0.0.1]:25 P=esmtp S=909 id=356188.575129153-sendEmail@vmware-st125 from <12345@fakedomain.com> for test@mydomain.com
>2008-06-03 18:18:58 1K3XLm-0004zP-3O userspam router: skipped error: malformed address "test+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam@mydomain.com" in filter
>file: address is ridiculously long: test+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam+spam...
>2008-06-03 18:18:58 1K3XLm-0004zP-3O **** log string overflowed log buffer ****
>
>2008-06-03 18:18:58 1K3XLm-0004zP-3O internal error: store_reset(135693280) failed: pool=0    
> deliver.c 1078
>
>Как с этим бороться? почему статически прописанное правило создает такой мусор?

потому что тут срабатывает ваш "+" на каждый вызов роутера и экранирование "+" тут не поможет.  в дебаге можно посмотреть.
я сильно не вникал в проблему, наверно решение есть, однако самое простое будет использовать rewrite


"Помогите с Exim Filter ! :("
Отправлено Hetzer , 04-Июн-08 12:41 
>[оверквотинг удален]
>>
>>2008-06-03 18:18:58 1K3XLm-0004zP-3O internal error: store_reset(135693280) failed: pool=0    
>> deliver.c 1078
>>
>>Как с этим бороться? почему статически прописанное правило создает такой мусор?
>
>потому что тут срабатывает ваш "+" на каждый вызов роутера и экранирование
>"+" тут не поможет.  в дебаге можно посмотреть.
>я сильно не вникал в проблему, наверно решение есть, однако самое простое
>будет использовать rewrite

задела меня твоя задачка :)
нашёл несколько вариантов решения, но все они потребовали дополнительных роутеров или acl, в итоге вот такое смешно простое:

${sg{$local_part}{$local_part}{$local_part+spam}}@$domain

удачи.


"Помогите с Exim Filter ! :("
Отправлено whois , 09-Июл-08 15:12 
>[оверквотинг удален]
>>я сильно не вникал в проблему, наверно решение есть, однако самое простое
>>будет использовать rewrite
>
>задела меня твоя задачка :)
>нашёл несколько вариантов решения, но все они потребовали дополнительных роутеров или acl,
>в итоге вот такое смешно простое:
>
>${sg{$local_part}{$local_part}{$local_part+spam}}@$domain
>
>удачи.

на самом деле все проще :)

$original_local_part+spam@$domain

В этом случае ничего не карежется


"Помогите с Exim Filter ! :("
Отправлено Hetzer , 10-Июл-08 05:29 
>[оверквотинг удален]
>>
>>${sg{$local_part}{$local_part}{$local_part+spam}}@$domain
>>
>>удачи.
>
>на самом деле все проще :)
>
>$original_local_part+spam@$domain
>
>В этом случае ничего не карежется

я сразу подумал о таком, но сработает если чистая доставка... а если алиасы? :)
а если до этого были ещё redirect-ы и rewrit-ы или ещё какие процессинги над адресом?
давая свой ответ, я попытался учесть все возможные проблемы.

единственное дополнение, если название сабфолдер с uppers case  буквами, то во всех redirect роутерах нужно делать caseful_local_part = true



"Помогите с Exim Filter ! :("
Отправлено whois , 10-Июл-08 18:49 
>[оверквотинг удален]
>>В этом случае ничего не карежется
>
>я сразу подумал о таком, но сработает если чистая доставка... а если
>алиасы? :)
>а если до этого были ещё redirect-ы и rewrit-ы или ещё какие
>процессинги над адресом?
>давая свой ответ, я попытался учесть все возможные проблемы.
>
>единственное дополнение, если название сабфолдер с uppers case  буквами, то во
>всех redirect роутерах нужно делать caseful_local_part = true

Спасибо за ответы :)
А еще один вопросик не совсем по теме:
Сейчас бьюсь над проблемой бэкапа всей "качественной" почты, то есть прошедшей проверку на спам и доступность юзера в LDAP базе...

То что приведено тут: http://mr-tacitus.blogspot.com/2007/11/exim.html на мой взгляд очень плохой способ, и с моими обьемами почтовик быстро нагнется...
Как вот тут http://forum.lissyara.su/viewtopic.php?p=8465 уже получше, все же не совсем то что хочется, но у меня с ldap-ом такой способ нифига не работает :(

Вот так вот сделал я:

# Backup incoming mail
if $recipients is "${lookup ldapdn{ldap:///ou=people,dc=domain,dc=ru?mail?sub?(mail=${quote_ldap:$local_part}${quote_ldap:@}${quote_ldap:$domain})}}"
then
    unseen deliver backup_incoming@domain.ru
endif

# Backup outgoing mail
if $sender_address is "${lookup ldapdn{ldap:///ou=people,dc=domain,dc=ru?mail?sub?(mail=${quote_ldap:$local_part}${quote_ldap:@}${quote_ldap:$domain})}}"
then
    unseen deliver backup_outgoing@domain.ru
endif

При таком раскладе входящая почта почему то летит в backup_outgoing О_о, причем вся, даже та которая поидее не должна была пройти проверку на $recipients или $sender_address... вобщем не совсем понятная ситуация...
Вот кусок из LDAP:

dn: uid=vpupkin,ou=People,dc=domain,dc=ru
imapPartition: default
mailHost: domain.ru
objectClass: mailRecipient
objectClass: UoAMailUser
objectClass: UniversityPerson
uid: username
structuralObjectClass: UniversityPerson
entryUUID: e3ab0b50-e04e-102c-8ea0-6f271462d431
creatorsName: cn=admin,dc=domain,dc=ru
createTimestamp: 20080707090028Z
cn:: 0JXQu9C10L3QsCDQmtGA0Y7Rh9C60L7QstCw
mail: vpupkin@domain.ru
mailAlternateAddress: vpupkin@domain.ru
mailRoutingAddress: vpupkin@domain.ru
sn:: 0JrRgNGO0YfQutC+0LLQsA==
userPassword:: e1NTSEF9TG9BMy9uWHaSsdGa0Jmdmhld2QzU0pEM1U2K0J4TmhGNUU=
entryCSN: 20080707090855Z#000000#00#000000
modifiersName: cn=admin,dc=domain,dc=ru
modifyTimestamp: 20080707090855Z

==================================

И был еще вариант, посредством роутера:
backup:
  driver = redirect
  allow_filter
  user = mail
  skip_syntax_errors
  unseen
  verify_recipient
  data = #Exim filter\n\
    if $h_X-Spam-Flag: is Yes\n\
    then\n\
    deliver "backup+spam@$domain"\n\
    endif\n\
    if $h_to: contains "@mydomain"\n\
    then\n\
    deliver "backup@$domain"\n\
    endif
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

Разумеется этот пример не рабочий (!) , но чтобы хоть как то понять ход моих мыслей все же привел пример, тут неясны две вещи:
1) как выяснять реально существующий ящик (опять же чтобы гадость не сыпалась вся подряд) 2) в exim фильтре в этом случае спам сперва попадает в backup+spam, но здесь не останавливается, а продолжает идти дальше... ну и разумеется дублируется следующим правилом...

Если есть какие то соображения и предложения был бы очень благодарен... вторые сутки сижу, ничего подобного я найти не смог... но, вполне возможно что кто то уже придумал как найти выход в моей ситуации :)
Спасибо!


"Помогите с Exim Filter ! :("
Отправлено Hetzer , 11-Июл-08 10:37 
>[оверквотинг удален]
>1) как выяснять реально существующий ящик (опять же чтобы гадость не сыпалась
>вся подряд) 2) в exim фильтре в этом случае спам сперва
>попадает в backup+spam, но здесь не останавливается, а продолжает идти дальше...
>ну и разумеется дублируется следующим правилом...
>
>Если есть какие то соображения и предложения был бы очень благодарен... вторые
>сутки сижу, ничего подобного я найти не смог... но, вполне возможно
>что кто то уже придумал как найти выход в моей ситуации
>:)
>Спасибо!

не совсем понял что надо, но допустим так (я не люблю system_filter, поэтому без него):

наличие отправителя и получателя принадлежащего определённому списку (в ldap) сделаем в acl_smtp_rcpt и закрепим за переменными:

warn
senders         = ldapm; ldap::///basa-bla-bla?mail?sub?\
                (&(objectClass=bla-bla)(mail=$sender_address))
set acl_m0 = 1

warn
condition = ${lookup ldap:///bla-bla?mail?sub?\
проверим  mail и alias=$local_part@$domain}{возвращать $value или нет - по вкусу}{fail}}
set_acl_m1 = 1

письма помеченные как spam мы в дальнейшем распознаём по заголовку в хедере например X-SpamOur: bla-bla

ну а в роутерах, перед роутерами непосредственной доставки делаем такое:
backup_sent_router:
no_verify
driver  = redirect
data    = "${if and { {eq{$acl_m0}{1}}
        {!def:X-SpamOur:}}
{backup_sent@mydomain.com, $local_part@$domain} {$local_part@$domain} }"

и делаем аналогично для входящих.

естественно условия доделываем по своим нуждам


Проблема которую надо решить самостоятельно: несколько получателей нашего списка на одно письмо, в итоге дублирование.  У меня с дубликатами работает MSA поэтому я не вникал, как это решить в exim

удачи