Страницы: 1
RSS
Шаблон ответа
 
Приходит сообщение, в полях написано:

От: 111111 <111@mail.ru>
Кому: 222222 <222@mail.ru>, 333333 <333@mail.ru>, 444444 <444@mail.ru>
Копия:  555555 <555@mail.ru>, 777777 <777@mail.ru>, 888888 <888@mail.ru>

Пытаюсь сделать такой шаблон, чтобы при ответе сначала было бы так:
Кому: 111111 <111@mail.ru>
Копия: 222222 <222@mail.ru>, 333333 <333@mail.ru>, 444444 <444@mail.ru>, 555555 <555@mail.ru>, 777777 <777@mail.ru>, 888888 <888@mail.ru>

Потом бы проверялось есть ли в поле Кому адрес 444444 <444@mail.ru>, если да, то удалялся бы.
Потом проверялось бы есть ли в поле Кому адрес 666666 <666@mail.ru>, если да, то добавлялся бы.

и в итоге:
Кому: 111111 <111@mail.ru>
Копия: 222222 <222@mail.ru>, 333333 <333@mail.ru>, 555555 <555@mail.ru>, 777777 <777@mail.ru>, 888888 <888@mail.ru>, 666666 <666@mail.ru>

Возможно такое?? Если да, то помогите, пожалуйста, уже голову сломал.
Изменено: Кирилл Иванов - 22.12.2022 22:52:15
 
Цитата
Кирилл Иванов написал:

Возможно такое?? Если да, то помогите, пожалуйста, уже голову сломал.
Ну, конечно, возможно. Сделайте быстрый шаблон следующего вида:
Код
%To=""%-
%To="%OFromName <%OFromAddr>"%-
%CC=""%-
%_CC="%OTo, %OCC"%-
%_CC='%ReplaceRegExp("444444 <444@mail.ru>(,\s)?", "", "%_CC")'%-
%If:"%SetPattRegExp='(?im)(666666 <666@mail.ru>)'%RegExpMatch(%OTo)"<>""%-
:"%CC('%_CC')"%-
:"%CC('%_CC, 666666 <666@mail.ru>)"%-

Его надо добавить к вашему шаблону ответа, используя как обычно макро %QInclude(). В место 444444 <444@mail.ru> и 666666 <666@mail.ru> надо вставить желанные адреса.
Изменено: Zygmunt Wereszczyński - 23.12.2022 02:11:25
 
После использования в поле копия только:
, 666666 <666@mail.ru>)

Где-то ошибка.
 
Цитата
Кирилл Иванов написал:
После использования в поле копия только:
, 666666 < 666@mail.ru >)

Где-то ошибка.

Да, нашëл ошибку - в последней строке нет окончательного символа "'". Теперь после коректировки шаблон имеет такой вид:

Код
%To=""%-
%To="%OFromName <%OFromAddr>"%-
%CC=""%-
%_CC="%OTo, %OCC"%-
%_CC='%ReplaceRegExp("444444 <444@mail.ru>(,\s)?", "", "%_CC")'%-
%If:"%SetPattRegExp='(?im)(666666 <666@mail.ru>)'%RegExpMatch(%OTo)"<>""%-
:"%CC('%_CC')"%-
:"%CC('%_CC, 666666 <666@mail.ru>')"%-
 
Без изменений, не помогло!
 
Цитата
Кирилл Иванов написал:
Без изменений, не помогло!
Очень странно, у меня всë работает хорошо (версия Бата 10.3.3.2, но по моему это неважно). Если возможно, покажите Ваш шаблон, удаляя все личные данные.

Помню, что когда-то текст шаблона не надо было копировать непосредственно, но впервэ вставить его в Notepad и отсюда вставить его в Бат. Попробуйте.
Изменено: Zygmunt Wereszczyński - 23.12.2022 13:37:47
 
Построил другую форму шаблона, в которой использованыдругие макросы. Вот шаблон:
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%CC=""%-
%_CC="%OTo, %OCC"%-
%_CC='%ReplaceRegExp("444444 <444@mail.ru>(,\s)?", "", "%_CC")'%-
%If:"%SetPattRegExp='(?im)(666666 <666@mail.ru>)'%RegExpMatch(%OTo)"<>""%-
:"%SetHeader('Cc','%_CC')"%-
:"%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')"%-
 
А я не вбиваю личные данные.
Вбиваю шаблон как есть. В поле копия должен добавиться адрес 666666 <666@mail.ru>, но вместо этого: , 666666 <666@mail.ru>

У меня версия 8.8.9.11
 
Цитата
Zygmunt Wereszczyński написал:
Построил другую форму шаблона, в которой использованыдругие макросы. Вот шаблон:
Код
 %SetHeader('To','%OFromName <%OFromAddr>')%-
%CC=""%-
%_CC="%OTo, %OCC"%-
%_CC='%ReplaceRegExp("444444 <444@mail.ru>(,\s)?", "", "%_CC")'%-
%If:"%SetPattRegExp='(?im)(666666 <666@mail.ru>)'%RegExpMatch(%OTo)"<>""%-
:"%SetHeader('Cc','%_CC')"%-
:"%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')"%- 
Не помогло. То же самое.
 
Попробуйте вот такую версию:



Код
%To=""%To="%OFromName <%OFromAddr>"%-
%CC=""%-
%If:'%OCC'<>'""'%-
:'%_CC="%OTo, %OCC"'%-
:'%_CC="%OTo"'%-
%_CC='%ReplaceRegExp("444444 <444@mail.ru>(,\s)?", "", "%_CC")'%-
%If:"%SetPattRegExp='(?ism)(666666 <666@mail.ru>(,\s)?)'%RegExpMatch(%OTo)"<>""%-
:"%CC('%_CC')"%-
:"%CC('%_CC, 666666 <666@mail.ru>')"%-
Изменено: Zygmunt Wereszczyński - 24.12.2022 16:21:48
 
Код
%_CC='%ReplaceRegExp("444444 <444@mail.ru>(,\s)?", "", "%_CC")'%-
Код
%If:"%SetPattRegExp='(?ism)(666666 <666@mail.ru>(,\s)?)'%RegExpMatch(%OTo)"<>""%-
Zygmunt, эти строки не работают почему-то. Они ничего не выводят. Может в версии 8.8.9.11 синтаксис другой?  
 
Да, виновата версия программы. У меня все работает хорошо, но в версии 10.3. Макрос %ReplaceRegExp появился только от версии 9.3.4.7. Вторая ошибка возникает из первой. Есть возможность разработать более сложную схему шаблона, используя какие-то рекурентные выражения. Я подумаю как это сделать.
Изменено: Zygmunt Wereszczyński - 12.01.2023 00:43:36
 
Обходной путь для старых версий The Bat! может быть следующий быстрый шаблон. Это может быть не так компактно, как раньше, но это работает. Пусть этот быстрый шаблон имеет идентификатор "MULT", тогда вы должны вставить его вызов в шаблон ответа с помощью макроса %QInclude(MULT).
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:'%OCC'<>'""'%-
:'%_CC="%OTo, %OCC"'%-
:'%_CC="%OTo"'%-
%_Tmp=%_CC%-
%_Is44="%SetPattRegExp='(?ism)(444444 <444@mail.ru>(,\s)?)'%RegExpMatch='%_CC'"%-
%SetPattRegExp='(?ism)(.*)(444444 <444@mail.ru>(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%If:%_Is44<>""%-
:'%_CC="%SubPatt(1)%SubPatt(4)"'%-
%SetPattRegExp='(?ism)(.*)(,\s)'%-
%RegExpBlindMatch(%_CC)%-
%_CC=%Subpatt(1)%-
%If:"%SetPattRegExp='(?ism)(666666 <666@mail.ru>(,\s)?)'%RegExpMatch(%OTo)"<>""%-
:"%SetHeader('Cc','%_CC')"%-
:"%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')"%-
 
Zygmunt, все отлично работает. Спасибо.


А можно ли в этой строке:
Код
%If:"%SetPattRegExp='(?ism)(666666 <666@mail.ru>(,\s)?)'%RegExpMatch(%OTo)"<>""%-
сделать так, чтобы не учитывалось имя "666666", а только почтовый ящик "666@mail.ru"?
Просто имя может быть написано: "666 666", "'666666'", "666-666" и т.д.
 
Цитата
Кирилл Иванов написал:

...сделать так, чтобы не учитывалось имя "666666", а только почтовый ящик " 666@mail.ru "?
Просто имя может быть написано: "666 666", "'666666'", "666-666" и т.д.

Да, я думал об этом, но пока ещë не знаю как решить такую обобщенную проблему. Надо бы рассматривать все остальные почтовые адресы также в таком общем виду. Посмотрю.
 
После многих попыток мне удалось модифицировать шаблон. Kажется, что теперь он будет работать корректно, независимо от формы почтовых адресов. Здесь должны были учитываться все комбинации адресов. Теперь вместо «666666» в последней строке можно ввести любой текст.

Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:'%OCC'<>'""'%-
:'%_CC="%OTo, %OCC"'%-
:'%_CC="%OTo"'%-
%_Is44="%SetPattRegExp='(?ism).*(444@mail.ru).*'%RegExpMatch='%_CC'"%-
%SetPattRegExp='(?ism)\A(.*(,\s)+)(.*444@mail.ru(>,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S1=%SubPatt(1)%-
%_S5=%SubPatt(5)%-
%SetPattRegExp='(?ism)\A(.*444@mail.ru(>,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S3=%SubPatt(3)%-
%If:%_Is44<>""%-
:#%If:%_S1<>""%-
:'%_CC="%_S1%_S5"'%-
:'%_CC="%_S3"'#%-
%SetPattRegExp='(?ism)^(.*)(,\s)$'%-
%RegExpBlindMatch(%_CC)%-
%_S4=%Subpatt(1)%-
%If:%_S4<>""%-
:'%_CC(%_S4)'%-
%If:"%SetPattRegExp='(?ism).*(666@mail.ru).*'%RegExpMatch(%OTo)"<>""%-
:"%SetHeader('Cc','%_CC')"%-
:"%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')"%-
Изменено: Zygmunt Wereszczyński - 15.01.2023 12:16:40 (коректировка ошибок)
 
Zygmunt Wereszczyński, не срабатывает эта строка:
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%_CC="%OTo, %OCC"%-
%If:"%SetPattRegExp='(?ism).*(666@mail.ru).*'%RegExpMatch(%OTo)"<>""%-
:"%SetHeader('Cc','%_CC')"%-
:"%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')"%-
В конце просто добавляется 666666 <666@mail.ru>, даже если 666@mail.ru есть в %_CC.
Изменено: Кирилл Иванов - 16.01.2023 09:33:44
 
Посмотрю вечером или завтра. Странно, я проверял многие комбинации адресов и все работали хорошо. Может быть, кавычками надо проиграть.
 
Zygmunt Wereszczyński, работают как надо вот эти части:

1 часть. Удаляет почтовый ящик 444@mail.ru. Тут я изменил строку %SetPattRegExp='(?ism)\A(.*(,\s)+)(.*444@mail.ru>(,\s)?)(.*)'%-
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:'%OCC'<>'""'%-
:'%_CC="%OTo, %OCC"'%-
:'%_CC="%OTo"'%-
%_Is44="%SetPattRegExp='(?ism).*(444@mail.ru).*'%RegExpMatch='%_CC'"%-
%SetPattRegExp='(?ism)\A(.*(,\s)+)(.*444@mail.ru>(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S1=%SubPatt(1)%-
%_S5=%SubPatt(5)%-
%SetPattRegExp='(?ism)\A(.*444@mail.ru(>,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S3=%SubPatt(3)%-
%If:%_Is44<>""%-
:#%If:%_S1<>""%-
:'%_CC="%_S1%_S5"'%-
:'%_CC="%_S3"'#%-
%SetPattRegExp='(?ism)^(.*)(,\s)$'%-
%RegExpBlindMatch(%_CC)%-
%_S4=%Subpatt(1)%-
%If:%_S4<>""%-
:'%_CC(%_S4)'%-
%SetHeader('Cc','%_CC')%-
2 часть. Удаляет почтовый ящик 666@mail.ru и добавляет его с нужным текстом.
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:'%OCC'<>'""'%-
:'%_CC="%OTo, %OCC"'%-
:'%_CC="%OTo"'%-
%_Is44="%SetPattRegExp='(?ism).*(666@mail.ru).*'%RegExpMatch='%_CC'"%-
%SetPattRegExp='(?ism)\A(.*(,\s)+)(.*666@mail.ru>(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S1=%SubPatt(1)%-
%_S5=%SubPatt(5)%-
%SetPattRegExp='(?ism)\A(.*666@mail.ru(>,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S3=%SubPatt(3)%-
%If:%_Is44<>""%-
:#%If:%_S1<>""%-
:'%_CC="%_S1%_S5"'%-
:'%_CC="%_S3"'#%-
%SetPattRegExp='(?ism)^(.*)(,\s)$'%-
%RegExpBlindMatch(%_CC)%-
%_S4=%Subpatt(1)%-
%If:%_S4<>""%-
:'%_CC(%_S4)'%-
%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')%-
Я протестировал каждую часть по отдельности во всех возможных вариантах, ни одного сбоя. Но я не могу понять как их соединить в один макрос?

И если не сильно напрягу, то как масштабировать, например:
Удалить 444@mail.ru и AAA@mail.ru
Добавить 666@mail.ru и BBB@mail.ru
 
Попробуйте этот шаблон:
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:%OCC<>""%-
:%_CC='%OTo, %OCC'%-
:%_CC='%OTo'%-
%SetPattRegExp='(?ism)\A(.*(,\s)+)(.*444@mail.ru(>)?(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S1=%SubPatt(1)%-
%_S6=%SubPatt(6)%-
%SetPattRegExp='(?ism)\A(.*444@mail.ru(>)?(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S4=%SubPatt(4)%-
%_Is44="%SetPattRegExp='(?ism).*(444@mail.ru).*'%RegExpMatch='%_CC'"%-
%If:%_Is44<>'':#%If:%_S1<>'':%_CC='%_S1%_S6'#:%_CC='%_S4'%-
%SetPattRegExp='(?ism)^(.*)(,\s)$'%-
%RegExpBlindMatch(%_CC)%-
%_S1a=%Subpatt(1)%-
%If:%_S1a<>"":%_CC(%_S1a)%-
%_Is66="%SetPattRegExp='(?ism).*(666@mail.ru).*'%RegExpMatch='%_CC'"%-
%If:%_Is66<>""%-
:%SetHeader('Cc','%_CC')%-
:%SetHeader('Cc','%_CC, 666666 <666@mail.ru>')%-

Если вам нужно обобщить адреса, вы можете использовать дополнительный шаблон, который вызывает шаблон MULT с параметрами. Параметры в этом вызове можно свободно изменять. Этот дополнительный шаблон выглядит так:

Код
%QT(MULT,444@mail.ru,666@mail.ru,'"Имя Фамилия"')%-

Мастер-шаблон MULT, который с ним работает, выглядит так (переданные здесь параметры представлены переменными %_1, %_2 и %_3):
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:%OCC<>""%-
:%_CC='%OTo, %OCC'%-
:%_CC='%OTo'%-
%SetPattRegExp='(?ism)\A(.*(,\s)+)(.*%_1(>)?(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S1=%SubPatt(1)%-
%_S6=%SubPatt(6)%-
%SetPattRegExp='(?ism)\A(.*%_1(>)?(,\s)?)(.*)'%-
%RegExpBlindMatch(%_CC)%-
%_S4=%SubPatt(4)%-
%_Is44="%SetPattRegExp='(?ism).*(%_1).*'%RegExpMatch='%_CC'"%-
%If:%_Is44<>'':#%If:%_S1<>'':%_CC='%_S1%_S6'#:%_CC='%_S4'%-
%SetPattRegExp='(?ism)^(.*)(,\s)$'%-
%RegExpBlindMatch(%_CC)%-
%_S1a=%Subpatt(1)%-
%If:%_S1a<>"":%_CC(%_S1a)%-
%_Is66="%SetPattRegExp='(?ism).*(%_2).*'%RegExpMatch='%_CC'"%-
%If:%_Is66<>""%-
:%SetHeader('Cc','%_CC')%-
:%SetHeader('Cc','%_CC, %_3 <%_2>')%-


Удаление и добавление нескольких адресов намного сложнее и требует большого количества тестов. Если у меня будет время, я посмотрю на это.
Изменено: Zygmunt Wereszczyński - 17.01.2023 23:56:40
 
Zygmunt Wereszczyński, как я понимаю так работать не будет:
Код
%QT(MULT,444@mail.ru,666@mail.ru,'"Имя Фамилия"')%-
%QT(MULT,AAA@mail.ru,BBB@mail.ru,'"Имя Фамилия"')%-
А можно ли сделать, чтобы макрос передавал значение %_CC в другой макрос?

Получается так, что макрос первый раз отрабатывает, а второй раз начинает все заново. Переменная %_CC каждый раз создается заново. Если бы она была глобальная, то макрос бы мог проверять ее. Если %_CC="", то все как обычно, если  %_CC<>"", тогда не надо переносить значения полей в переменную.
Изменено: Кирилл Иванов - 17.01.2023 09:44:07
 
К сожалению, после тщательного изучения всех возможных комбинаций адресов оказалось, что предоставленные мной шаблоны не всегда работают корректно. Это связано в том числе с тем, что в The Bat! вызов шаблона с параметрами не всегда дает ожидаемый результат. Ошибки возникают, когда мы хотим передать часть регулярного выражения в качестве параметра, на который впоследствии будем ссылаться по его номеру (то есть рассматривать его как подвыражение). В этом случае параметр необходимо передать в шаблон "дословно", т.е. вместо параметра %_1 со значением 444@mail.ru, используемого в выражении (?ism)\A(.*(,\s)+ )(.*%_1 (>)?(,\s)?)(.*) передать выражение как (?ism)\A(.*(,\s)+)(.*444@mail\.ru(>)?(,\s)?)(.*).

Поэтому я изменил вызывающий шаблон под названием MUL, который теперь выглядит так:
Код
%SetHeader('To','%OFromName <%OFromAddr>')%-
%SetHeader('Cc','')%-
%If:%OCC<>""%-
:%_CC='%OTo, %OCC'%-
:%_CC='%OTo'%-
%_RE1="(?ism)\A(.*(,\s)+)(.*444@mail\.ru(>)?(,\s)?)(.*)"%-
%_RE2="(?ism)\A(.*444@mail\.ru(>)?(,\s)?)(.*)"%-
%QT(MULT, "444@mail\.ru", "666@mail\.ru", "Имя1 Фамилия1", %_CC, "%_RE1", "%_RE2","666@mail.ru")%-
%_RE3="(?ism)\A(.*(,\s)+)(.*AAA@mail\.ru(>)?(,\s)?)(.*)"%-
%_RE4="(?ism)\A(.*AAA@mail\.ru(>)?(,\s)?)(.*)"%-
%QT(MULT, "AAA@mail\.ru", "BBB@mail\.ru", "Имя2 Фамилия2", %CC, "%_RE3", "%_RE4","BBB@mail.ru")%-

Первые четыре строки этого шаблона подготавливают основные параметры для передачи. Затем переменные %_RE1, %_RE2, %_RE3 и %_RE4 получают свои значения в виде литеральных регулярных выражений, используемых в вызываемом шаблоне MULT. Фактическая модификация поля %CC происходит в этом шаблоне. Обратите внимание, что точка (.), используемая буквально в регулярных выражениях, должна быть записана как (\.). Поэтому при вызове шаблона используется адрес электронной почты «400@mail\.ru», если он будет использоваться в регулярном выражении.

Что касается передачи значения переменной %_CC, то в этом нет необходимости. Вместо этого используется макрос %CC, который после первого вызова шаблона MULT может быть использован для следующего вызова и затем будет снова изменен. А вот и шаблон MULT:
Код
%SetPattRegExp='%_5'%RegExpBlindMatch(%_4)%-
%_S1=%SubPatt(1)%-
%_S6=%SubPatt(6)%-
%_Is44="%SetPattRegExp='(?is).*(%_1).*'%RegExpMatch='%_4'"%-
%_Is66="%SetPattRegExp='(?is).*(%_2).*'%RegExpMatch='%_4'"%-
%SetPattRegExp='%_6'%RegExpBlindMatch(%_4)%-
%_S4=%SubPatt(4)%-
%If:%_Is44<>""%-
:#%If:"%_S1"<>""%-
:'%_C="%_S1%_S6"'%-
:%_C="%_S4"#%-
:'%_C="%_4"'%-
%SetPattRegExp='(?ism)^(.*)(,\s)$'%-
%RegExpBlindMatch(%_C)%-
%_S1a=%Subpatt(1)%-
%If:%_S1a<>"":%_C(%_S1a)%-
%If:%_Is66<>""%-
:%SetHeader('Cc','%_C')%-
:%SetHeader('Cc','%_C, %_3 <%_7>')%-
Изменено: Zygmunt Wereszczyński - 19.01.2023 14:03:50 (Добавлено примечание о синтаксисе регулярных выражений.)
Страницы: 1