![]() |
|
| Набор регеспов |
Список регеспов
Все регеспы пишутся в одну строку, без пробелов на местах склеек...
- Вырезаем PGP-подписанный текст;
- Вырезаем PGP-подписанный текст, но немного проще;
- Разбираем поле Data: по кусочкам :));
- Находим первый e-mail в тексте и пишем письмо...;
- Находим первый попавшийся FQURL и вставляем его в тело письма...;
- "Выедаем" то, что написано в поле X-Mailer: письма, и вставляет найденную строку;
- "Выедаем и выдаем первые 10 строк;
- "Причесываем" некрасивые Subject'ы;
- Выводим время получателя;
- Выводим e-mail адрес, который стоит в самом конце темы;
- "Выедаем" рекламу еГрупсов;
- "Выдираем" поле charset из хедеров;
- Немного адресной книги, немного регеспов и...;
- Обрабытываем письмо... ну почти СУБД...;
Попробуйте этим ... хммм... *агрегатом* заменить стандартный %Quotes и применить такой шаблончик к PGP-Signed письму. Может, понравится... Имеющиеся проблемы:
%Cursor%Quotes="%SetPattRegExp=""(?is)(.*^-----BEGIN PGP SIGNED.*?\n (Hash:.*?\n)?\s*)?(.*?)(^(- --\s*\n|- ---\s*\n|--\s*\n|---\s*\n|_{40,} \s*\n|-----BEGIN PGP SIGNATURE)|\z)""%RegExpBlindMatch=""%text""%SubPatt=""3"""Имеющиеся тонкости:
- Стандартно, _весь_ текст письма подписывается PGP, и для именно такой ситуации этот макрос и был сделан. Однако, в Мыше имеется возможность подписать _кусок_ письма, а потом еще один, и так ad infinitum. Такое макрос НЕ поддерживает, если это -- некая проблема, скажите мне. Вернусь из Углича в середине месяца -- поковыряюсь...
Можно добавить и другие определения отделителя подписи, разумеется. Весь список регеспов
- Этот агрегат наверху подменяет собой, в числе прочего, Батовскую встроенную технику обрезания подписи при ответе (ну, --<пробел>
, вы все в курсе). То, что я привел наверху, считает символом начала подписи любую из следующих последовательностей: (разумеется, каждая из этих последовательностей должна стоять в начале строки)
- - --<любое число пробелов или ни одного>
- - ---<любое число пробелов или ни одного>
- --<любое число пробелов или ни одного>
- ---<любое число пробелов или ни одного>
- <не менее 40 символов "_"><любое число пробелов или ни одного>
- строку "-----BEGIN PGP SIGNATURE"
За эту механику отвечает вот этот кусок макроса:^(- --\s*\n|- ---\s*\n|--\s*\n|---\s*\n|_{40,}\s*\n|-----BEGIN PGP SIGNATURE)|\z)Если Вы считаете, что символом начала подписи может служить что-то еще, you are welcome добавить еще какое-нибудь определение туда. Буду рад услышать мнения на сей счет.
Этот - немножко попроще, но для того же самого (кроме PGP). Регексп "откусывает" подпись при ответе на письмо, содержащее оную. Подписью считается все, что стоит после одного из:
%REGEXPQUOTES="(?s)(.*?)(^(-\s)?--(\s)?\n|\Z)"Как и в прошлом примере, можно еще добавить определения отделителя подписи, например:
- - -- <CR>
- - --<CR>
- -- <CR>
- --<CR>
Тут подписью считается то, что начинается с одной из четырех строк выше, плюс:
%REGEXPQUOTES="(?s)(.*?)(^(-\s)?--(\s)?\n|^(-\s)?---(\s)?\n|\Z)"Весь список регеспов
- - --- <CR>
- - ---<CR>
- --- <CR>
- ---<CR>
Эта штуковина разбирает по кусочкам поле Date: того письма, на котором срабатывает. В результате появляется нештатная возможность использовать в шаблоне ответа или форварда локальное время отправителя письма, а не "подправленное" Батом до вашего локального (поведение по умолчанию), например, в следующей конструкции:
%SETPATTREGEXP="(?m-s)Date\:\s*((.*?[\d]{1,4})\s*?([\d]{0,2}\:[\d] {0,2}\:[\d]{0,2})\s*?(.*))"%REGEXPBLINDMATCH="%HEADERS"%SUBPATT="2", когда на ваших часах натикало %SUBPATT="3" -- а было это в часовом поясе GMT%SUBPATT="4" -- вы мне писали:Полный список регистров, доступных как %SubPatt="N":Ограничения: макрос будет срабатывать с непредсказуемыми результатами, если поле Date: того письма, на котором он работает, не соответствует требованиям RFC822. К счастью, это значит "довольно редко". Весь список регеспов
- %SubPatt="0" - полностью все поле Date:, например:
Date: Tue, 9 Mar 1999 10:42:14 +1000- %SubPatt="1" - вся информация из поля Date:, кроме самого слова Date:, например:
Tue, 9 Mar 1999 10:42:14 +1000- %SubPatt="2" - день, месяц, год, например:
Tue, 9 Mar 1999- %SubPatt="3" -- время, например:
10:42:14- %SubPatt="4" - часовой пояс в RFC822-формате, например:
+1000
Эта штуковина находит первый e-mail адрес в теле письма и адресует то письмо, что формируется шаблоном, в котором этот макрос стоит, на найденный адрес. Адресом тут считается следующая последовательность символов: <пробел, или начало строки, или начало текста><сколько угодно не-пробелов>@<что угодно до первого пробела, или конца строки, или конца текста>. Ограничения: некоторые люди русский язык плохо знают, то, что в их письмах этот макрос найдет, может оказаться чем угодно, а не адресом. И письма туда отправлять совершенно бессмысленно... Весь список регеспов
%TO=""%TO="%SETPATTREGEXP=""(?ms).*?((\s|^|\A)\S*?\@.*?(\s|\n|\Z))""%REGEXPMATCH=""%TEXT"""
Найдет первый попавшийся FQURL в теле письма (что-нибудь типа http://somewhere.com). И вставит его в тело нового письма. FQURL - это строка, выглядящая вот так: <http или https или ftp или nntp или etc>://<что угодно до символа ">", или до пробела, или до конца строки> Ограничения: может и ничего не найти: некоторые массовики-затейники так URL'ы пишут, что закачаешься... Весь список регеспов
%SetPattRegExp="(?mis).*?((http|https|ftp|nntp|etc)://.*?)(\s|\>|\n)" %RegExpBlindMatch="%Text"%SubPatt="1"
Этот макрос выедает то, что написано в поле X-Mailer: письма, и вставляет найденную строку. То есть выдает на-гора информацию о том, каким почтовым клиентом было написано обрабатываемое письмо. Ограничения: некоторые почтовые клиенты поле X-Mailer не заполняют (например, pine). Ну, в этом случае макрос ничего и не выдает... Весь список регеспов
%SETPATTREGEXP="(?m-s)X-Mailer\:\s*(.*?\n)"%REGEXPMATCH="%HEADERS"
Совсем простой макрос. Выедает и выдает первые 10 строк (или меньше, если строк всего меньше:-)) обрабатываемого письма.
%REGEXPTEXT="((.*?\n){1,10})"
Макрос "причесывает" некрасивые Subject'ы. Обрабатывает варианты типа: Re: Re[4]: Ответ: [thebat] Ha: Fwd: Re[25]: subject - thebat.talk.ru. Превращает это безобразие в просто Re: subject. Обратите внимание, что макрос откидывает весь конец Subject, начиная с последовательности символов <пробел>-<пробел>. Если этого делать не надо, то можно воспользоваться уменьшенной версией:
%Subject="Re: %SetPattRegExp=""(?i)\A\:?(\s*(Ответ|re|ha|rcpt|fwd) (\[\d*\])?:\s*|\[.*?\])*\s*(.*?)(\s{1,}-\s{1,}.*\Z|\Z)""%RegExpBlindMatch=""%OSubj""%SubPatt=""4"""(обрабатывает варианты типа: Re: Re[4]: Ответ: [thebat] Ha: Fwd: Re[25]: subject. Превращает это безобразие в просто Re: subject) Весь список регеспов
%Subject="Re: %SetPattRegExp=""(?i)\A\:?(\s*(Ответ|re|ha|rcpt|fwd) (\[\d*\])?:\s*|\[.*?\])*\s*(.*?)\Z""%RegExpBlindMatch=""%OSubj""%SubPatt=""4"""
Этот макрос служит в качестве эрзац-заменителя отсутствующего в Бате макроса, который бы выдавал время получения (а не написания!) письма. Выдает искомое время. Ограничения: на самом деле, он выдает не время получения письма Зе Батом, а время получения его вашим SMTP-сервером (технически выражаясь, время, стоящее в самом последнем хедере Received:, потому что время собственно получения письма Батом ни в одном хедере не прописано). Все же лучше, чем ничего:-)) Весь список регеспов
%SETPATTREGEXP="(?sm)Received\:\s*.*?(([\w]{3}\,\s*[\d]{1,2}\s*[\w] {3}\s*[\d]{4})\s*?([\d]{0,2}\:[\d]{0,2}\:[\d]{0,2})\s*([+-][\d]{4})?)"%REGEXPMATCH="%HEADERS"
Выедает e-mail адрес, который стоит в самом конце темы, отделенный от начала темы одним или более пробелами. Натурально, если адреса там не стоит, то ничего и не выдает. Весь список регеспов
%SetPattRegExp="(?ims).*?\s*(\w*?\@\S*?)\Z"%RegExpMatch="%OSubj"
Модификация 1, умела выедать рекламу еГрупсов (в момент времени, когда еще были еГрупсы и у них была еще жива привычка вставлять рекламу в верх писем...). Представляет исключительно историческую ценность. Весь список регеспов
%Quotes="%SetPattRegExp=""(?is)(.*^-----BEGIN PGP SIGNED.*?\n(Ha sh:.*?\n)?\s*|\A-----.*---------------.*?\n{1,})?(.*?)(^(- --\s*\n|- ---\s* \n|--\s*\n|---\s*\n|_{40,}\s*\n|-----BEGIN PGP SIGNATURE)|\z)""%RegExpBlin dMatch=""%text""%SubPatt=""3"""
Выдирает поле charset из хедеров обрабатываемого письма. Весь список регеспов
%SetPattRegExp="(?im).*?charset\s*\=\s*(.*?)\s"%RegExpBlindMatch="%Headers"%SubPatt="1"
Техническое задание:
Вопрос. Можно ли сделать так:Можно ли такое сделать с помощью regexp? Решение: В адресной книге завести себя, со своим адресом (важно, чтобы этот адрес совпадал с Reply-To: для того аккаунта, из которого предлагаемый трюк должен работать). В свойствах себя заводим "базу данных" <g> в поле Memo, например <vbg>:
- Отвечаю на письмо;
- Если в письме есть слово "вася", то %comments="пупкин";
- Если в письме нет "васи", то %comments="".
вася=пупкин
петя=жопкин
я=идиот И вот теперь всё очень просто: если, к примеру, я хочу, чтобы при присутствии слова "петя" в поле Comment: попало слово "жопкин", я пропишу вот такой регексп для Reply (всё в одну длинную строку без пробела на месте склейки):
Ограничения: работать не будет, если в теле письма встретится такая последовательность символов: "||||||||||". Однако есть надежда, что такой последовательности там НЕ встретится :). Весь список регеспов
%Comment="%SetPattRegExp=""(?ms)(петя).*?\|{10}(|.*?\n)\1=(.*?) (\n|\Z)""%RegExpBlindMatch=""%Text||||||||||%ABReplyMemo""%SubPatt=""3"""
Техническое задание:
Имеется письмо, в теле которого есть ряд повторяющихся блоков вида:==8<=======================<cut here>=======================>8== Начисления за АПРЕЛЬ 2000 года. Клиент Городская Администрация г.Чебаркуль Лицевой счет 2518 Договор 2518 от +----------------------------------------------------+--------+-------+ | Наименование услуги | Сумма | НДС | +----------------------------------------------------+--------+-------+ | Предоставление доступа к Internet через >| 362.77 | 72.55 | |<телефонную сеть - dialup-ip | | | | Предоставление почтового ящика электронной почты >| 60.00 | 12.00 | |<e-mail/pop | | | +----------------------------------------------------+--------+-------+ Всего начислено Всего НДС Итого --------------- --------- ------ 422.77 84.55 507.32 ==8<=======================<cut here>=======================>8== Имеется база данных вида номер счета = e-mail адрес владельца. Требуется: для каждого номера счета создать письмо его владельцу с блоком данных вида: ==8<=======================<cut here>=======================>8== Лицевой счет: 2518 +----------------------------------------------------+--------+-------+ | Наименование услуги | Сумма | НДС | +----------------------------------------------------+--------+-------+ | Предоставление доступа к Internet через >| 362.77 | 72.55 | |<телефонную сеть - dialup-ip | | | | Предоставление почтового ящика электронной почты >| 60.00 | 12.00 | |<e-mail/pop | | | +----------------------------------------------------+--------+-------+ Итого: 507.32 ==8<=======================<cut here>=======================>8==Решение: Создаем в адресной книге Зе Бата некоторое число групп (по числу клиентов, т.е. номеров счетов), в качестве хэндлов указываем соответствующие номера счетов, а единственным адресатом в каждой группе делаем e-mail адрес владельца соответствующего счета. Теперь решение дается следующим шаблоном:
%REGEXPBlindMATCH="%Text" Лицевой счет: %SubPatt="2" %SubPatt="3" Итого: %SubPatt="5"
%SetPattRegExp="(?ims)(.*?Лицевой счет\s*([\d]*).*?(^\s*\+[-]*\+(.*?)^\s*\+[-]*\+.*?\n) \s*Всего.*?----\n\s*\S*\s*\S*\s*(.*?)){1}\n"Создаем фильтр, который изготавливает письмо по этому шаблону. Этот фильтр будет вызывать генерацию извещения для первого клиента, данные которого встретились парсеру в исходном письме. В созданном нами фильтре ставим опцию "continue processing with other filters" и создаем следующий фильтр. Ровно такой же, но в шаблоне (в двух местах) меняем: {1}\n на {2}\n Этот новый фильтр сделает то же, что и первый, но для второго юзера, встретившегося в файле. Создаем столько фильтров (меняя соответственно номер в фигурных скобках), сколько у нас юзеров. Или, если число юзеров точно неизвестно, столько фильтров, чтобы их число превышало число юзеров (в этом случае к шаблону надо приписать %Bcc="свой адрес" и поставить входящий фильтр, чтобы он удалял мессаги с пустым телом, это, конечно, просто делается).
%To=""%To="%SetPattRegExp=""(?ims)(.*?Лицевой счет\s*([\d]*).*?(^\s*\+[-]*\+(.*?)^\s*\+[-] *\+.*?\n)\s*Всего.*?----\n\s*\S*\s*\S*\s*(.*?)){1}\n""%REGEXPBlindMATCH=""%Text""%SubPatt=""2"" <list>"Александр Киселев