Регистрация...

Eserv Forum / E4 / Mail / Срабатываие нескольких фильтров одновременно

wikipost // (v1)
Продукты и услуги Скачать Документация Купить Поддержка Форумы Партнёрам Статьи О компании
Есть два фильтра, оба с опцией "заменить получателей". Есть письмо, которое подходит под оба фильтра. По журналу отрабатывают оба фильтра. Получатель заменяется по последнему. В Е2, в правилах тоссинга, была команда "cut", которая прекращала разбор правил. В Е4 есть аналог?
 
Комментарии к этой версии (07.07.2010 09:33) [~matveeva] 7ff9d5e3
АвторДатаТекстtags
ac07.07.2010 11:42
Фильтры addrcpt, setrcpt, replace, auth, setclass, responder, server аддитивны, не прерывают перебор фильтров. smtpRefuse всегда прерывает. А в фильтрах smtpReply, runInternal, runExternal можно управлять прерыванием перебора. run* прерывает, если результат выполнения возвращает флаг FALSE. smtpReply прерывает, если указанный в нем код ответа 4xx или 5xx. А при коде ответа 2xx может прерывать, если это "2xx ответ" или продолжать, если это "2xx-ответ" (минус после кода ответа в SMTP означает "будет продолжение ответа", и фильтры учитывают эту особенность).

В E2 в правила тоссинга это фактически всегда "runInternal" — программа на встроенном языке, т.к. это самый универсальный вариант.

Фильтр "заменить получателей" — это сброс текущего списка получателей (uRCPTLIST 0!) и установка указанного в параметрах получателя (AddRcpt) или списка получателей из указанного в параметрах файла (MaillistFile), но поскольку для runInternal параметром фильтра является сама строка для выполнения, то получателя придётся указывать прямо в программе. Т.е. для вашего случая прерывающим аналогом фильтра "заменить получателя" будет фильтр "выполнить команды" с параметром uRCPTLIST 0! S" emal@addr" AddRcpt FALSE.
wikipost
matveeva07.07.2010 13:09
ac пишет: Т.е. для вашего случая прерывающим аналогом фильтра "заменить получателя" будет фильтр "выполнить команды" с параметром uRCPTLIST 0! S" emal@addr" AddRcpt FALSE.
То, что надо! Спасибо. Поставила.
wikipost
matveeva08.07.2010 12:23
ред: 08.07.2010 12:24
uRCPTLIST 0! S" matv_loc@aori.co.ru" AddRcpt FALSE
Вот такая команда в фильтре приводит к "зависанию" писем в папке SPOOL.
\DATA\log\smtp\2010-07-08-log.txt
2010-07-08 12:20:27;119.158.147.3;@;22200;3900;FILTER;deccannqk3@edrena.ru;matveeva@aori.co.ru;;matveeva_spam 2010-07-08 12:20:27;119.158.147.3;@;22200;3900;ARCHIVE;deccannqk3@edrena.ru;spam_admin@aori.co.ru;ExDelivery:Archive 2010-07-08 12:20:27;119.158.147.3;@;22200;3900;DELIVERY;matv_loc@aori.co.ru;

В ящике ничего нет. Я что-то не так написала?
Заметила пробел перед адресом. Не должен там быть?
wikipost
ac08.07.2010 13:02
Пробел нужен. А фильтр да, неправильный. Логически правильный, а технически неправильный — тут используется (и модифицируется by AddRcpt) временный хип, а нужен хип текущего потока. В общем, надо мне для такого использования подкрутить acSMTP, иначе слишком много дописывать в скрипт.

Извините, что вовремя не сообразил про побочный эффект.
wikipost
matveeva08.07.2010 13:13
wikipost
ac08.07.2010 13:25
Нет, с хипом тут все ОК, это я еще года 4 назад наладил, забыл просто. Надо подумать...
wikipost
ac08.07.2010 13:27
В acSMTP.log никаких ошибок об этом?
wikipost
matveeva08.07.2010 13:53
ac пишет: В acSMTP.log никаких ошибок об этом?
Неа, По времени письма позже, чем дата файла с логом. Вот последни езаписи там:
FILTER action: set stack depth <31>TCPD, 117.200.162.2,18342, Debug dump: Too many errors, closing connection <31>TCPD, 60.254.42.176,21198, Debug dump: Too many errors, closing connection
wikipost
ac08.07.2010 16:17
ред: 08.07.2010 16:19
Так задумался, что забыл — мы о фильтрах на какой стадии говорим? Я проверил его на "после классификации" — там работает, если заменить FALSE на TRUE. Иначе просто не отвечает на DATA.
wikipost
ac08.07.2010 16:31
А вот на стадии "доставка" манипулировать списком адресатов опасно, т.к. эта стадия есть цикл по списку адресатов, и список может получиться хитрозаплетенным, если сам себя меняет... А сбрасывать список по "uRCPTLIST 0!" на стадии "доставка" уже поздно, т.к. к тому моменту, когда дело дойдёт до срабатывающего адреса, часть адресов (если было несколько получателей) уже может быть обработана (доставлено в ящики).
wikipost
matveeva08.07.2010 16:33
ac пишет: мы о фильтрах на какой стадии говорим?
У меня стоит
Стадия протокола bayes
RCPT TO matveeva@aori.co.ru
Байес-результат spam
Выполнить runInternal с параметрами uRCPTLIST 0! S" matv_loc@aori.co.ru" AddRcpt FALSE
wikipost
matveeva08.07.2010 16:34
ac пишет: там работает, если заменить FALSE на TRUE. Иначе просто не отвечает на DATA.
Видимо, проблема в этом. Меняю.
wikipost
ac08.07.2010 16:36
Вот так можно дописать форматную строку записи о фильтрах в log.str.txt:
5320 *{Dirs[Logs]}\{PROTOCOL}\{YYYY-MM-DD}-log.txt*{YYYY-MM-DD} {hh:mm:ss};{CLIENT};{UserEmail};{CurrentThreadNumber};{GetCurrentThreadId};FILTER;{MAILFROM};{RCPTTO};{RCPTTOEX};{s};{uSmtpFilterStep @ STR@}

Тогда в логе будет видно, на какой стадии фильтр сработал.
wikipost
matveeva09.07.2010 08:29
ac пишет: Вот так можно дописать форматную строку записи о фильтрах в log.str.txt:
Изменила.
wikipost
Работает на Eserv/5.05555 (05.06.2016)