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

Exim: match-условие в роутере.

Добавлено: 2009-06-30 18:25:56
DJ Kill
На сервер с неких других серваков приходят письма уже проверенные на спам.
Их отличительная черта: надпись SPAM и очки в заголовке.

Сотворил роутер вот такой:

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

subj_spam:
  driver = accept
  domains = +local_domains
  condition = "${if match{$h_Subject}{\\**[Ss][Pp][Aa][Mm]\\*\\(\\d*\\.\\d*\\)}{yes}{no}}"
  transport = spam_delivery
  no_verify
  no_expn
  no_more
То есть проверяется что в хеадере начало вида **** SPAM*(99.9) и отправляет его на правильный транспорт.

Ну это по задумке. По факту вижу в логах только:

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

2009-06-30 19:22:14 1MLf9x-000IOw-Oa failed to expand condition "${if match{$header_subject}{\**}{yes}{no}}" for subj_spam router: missing } at end of string - could be header name not terminated by colon
Ткните носом что я делаю не так.

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-01 8:08:04
qw

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

\\**[Ss][Pp][Aa][Mm]\\*\\(\\d*\\.\\d*\\)}{yes}{no}
возможно не совсем верно, но
экранируешь *, вторая звездочка не экранирована, \d соответствует любой цифре, \d{2} две цифры, \d{1} одна цифра, \. соответствует точке
вообще чтобы не ставить столько слэшей, используется \N ... \N
наверное так, хотя это может быть не правильно:

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

\N\*\*[Ss][Pp][Aa][Mm]\*\(\d\.\d\)\N

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-01 9:27:31
DJ Kill
Сам регуляр верный. Я его pcretest проверил предварительно. Косяк в чём-то другом, как я понимаю.

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-01 11:37:07
DJ Kill
Поменял выражение на такое:

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

${if match{$h_Subject}{\N\**[Ss][Pp][Aa][Mm]\*(\d*\.\d*)\N}{yes}{no}}
Не в этом дело.

Тут: любое количество звёздочек, потом надпись SPAM в любом регистре, потом одна звёздочка и некое количество цифр разделённых точкой в скобочках. Так что регуляр вроде верный.

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-01 16:06:00
DJ Kill
Может есть другой способ письмо со словом SPAM в заголовке отправлять на определённый транспорт?

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-01 16:46:23
atrium
missing } at end of string

Не хватает }

Ваше регулярное выражение

re> /\*\*[Ss][Pp][Aa][Mm]\*\(\d\.\d\)/
data> **SPAM*(67.7)
No match
data> ***SPAM*(99.9)
No match
data>

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-01 17:36:40
DJ Kill
atrium писал(а):missing } at end of string
Не хватает }
Это я прочитал.
Но, если присмотреться, то видно что все открывающие { у меня закрыты.
atrium писал(а): Ваше регулярное выражение
re> /\*\*[Ss][Pp][Aa][Mm]\*\(\d\.\d\)/
Не правда. Моё:

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

 re> /\**[Ss][Pp][Aa][Mm]\*\(\d*\.\d*\)/
data> ***SPAM*(99.9)
 0: ***SPAM*(99.9)
data> **SPAM*(67.7)
 0: **SPAM*(67.7)

Re: Exim: match-условие в роутере.

Добавлено: 2009-07-14 12:27:35
DJ Kill
Может есть какой-то другой способ сортировать сервером сообщения по слову в поле "тема"?

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-05 12:24:17
DJ Kill
Неужели никто ничего не подскажет? Или вопрос слишком простой?

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-05 12:32:12
atrium
Ещё положение роутера играет роль, посмотрите, может у Вас до этого роутера другой стоит, который занимается доставкой

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-06 10:05:47
CrazyPilot
DJ Kill писал(а):

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

missing } at end of string - could be header name not terminated by colon
Хм, написано же.

Если я правильно понял - исправьте

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

$h_Subject
на

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

$h_Subject:

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-06 10:56:54
DJ Kill
Вот оно спасение! Спасибо! Двоеточие! :)

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-06 13:56:19
DJ Kill
Вот бы ещё научить как-то чтобы IMAP сразу помечал эти письма как прочитанные (ставил флаг Seen).

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-06 14:12:08
CrazyPilot
Если у вас dovecot - смотрите доку на его сайте по поводу sieve. он как раз умеет менять флаги писем. Это плагин к lda с вкусными возможностями.

А вообще, насколько я знаю, у довекота флаги указаны в названии файла,

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

[root@flanker ~]# ls -l /var/mail/root\@domain.ru/.Junk/cur/
-rw-------  1 mailnull  mail   6326 Aug  6 10:29 1249540191.M517558P58563.flanker.domain.ru,W=6468:2,S  # Прочитанное письмо
-rw-------  1 mailnull  mail   1720 Aug  6 11:01 1249542109.M826214P65476.flanker.domain.ru,W=1769:2,   # Непрочтённое письмо
Но я не знаю, является ли это достаточным условием. Как вариант написать скрипт, которые переименовывает файлы и запихать его в крон. Но это изврат, я бы курил доку по sieve.

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-06 14:32:25
DJ Kill
У меня exim+courier-imap

Флаги прописываются действительно в названии файла в соответствии с RFC.

Прописывать это внешним скриптом можно, но сама идея мне не нравится хотя бы тем, что скрипт будет срабатывать по времени и письмо некоторое время будет свертиться как непрочитанное. Хочется сделать это почтовой системой.

Re: Exim: match-условие в роутере.

Добавлено: 2009-08-06 14:46:30
CrazyPilot
Ну, sorry, courier-imap ни разу в живую не видел.