Добрый день!
Пытаюсь решить проблему с раздельным складированием спама, каждому пользователю.
В качестве деливера используется 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
Как с этим бороться? почему статически прописанное правило создает такой мусор?
>[оверквотинг удален]
>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
>[оверквотинг удален]
>>
>>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
удачи.
>[оверквотинг удален]
>>я сильно не вникал в проблему, наверно решение есть, однако самое простое
>>будет использовать rewrite
>
>задела меня твоя задачка :)
>нашёл несколько вариантов решения, но все они потребовали дополнительных роутеров или acl,
>в итоге вот такое смешно простое:
>
>${sg{$local_part}{$local_part}{$local_part+spam}}@$domain
>
>удачи.на самом деле все проще :)
$original_local_part+spam@$domain
В этом случае ничего не карежется
>[оверквотинг удален]
>>
>>${sg{$local_part}{$local_part}{$local_part+spam}}@$domain
>>
>>удачи.
>
>на самом деле все проще :)
>
>$original_local_part+spam@$domain
>
>В этом случае ничего не карежетсяя сразу подумал о таком, но сработает если чистая доставка... а если алиасы? :)
а если до этого были ещё redirect-ы и rewrit-ы или ещё какие процессинги над адресом?
давая свой ответ, я попытался учесть все возможные проблемы.единственное дополнение, если название сабфолдер с uppers case буквами, то во всех redirect роутерах нужно делать caseful_local_part = true
>[оверквотинг удален]
>>В этом случае ничего не карежется
>
>я сразу подумал о таком, но сработает если чистая доставка... а если
>алиасы? :)
>а если до этого были ещё 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, но здесь не останавливается, а продолжает идти дальше... ну и разумеется дублируется следующим правилом...Если есть какие то соображения и предложения был бы очень благодарен... вторые сутки сижу, ничего подобного я найти не смог... но, вполне возможно что кто то уже придумал как найти выход в моей ситуации :)
Спасибо!
>[оверквотинг удален]
>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 = 1warn
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удачи