Новая версия сайта: The Bat!
Набор регеспов
или живите теперь спокойно...

Список регеспов

  1. Вырезаем PGP-подписанный текст;
  2. Вырезаем PGP-подписанный текст, но немного проще;
  3. Разбираем поле Data: по кусочкам :));
  4. Находим первый e-mail в тексте и пишем письмо...;
  5. Находим первый попавшийся FQURL и вставляем его в тело письма...;
  6. "Выедаем" то, что написано в поле X-Mailer: письма, и вставляет найденную строку;
  7. "Выедаем  и выдаем первые 10 строк;
  8. "Причесываем" некрасивые Subject'ы;
  9. Выводим время получателя;
  10. Выводим e-mail адрес, который стоит в самом конце темы;
  11. "Выедаем" рекламу еГрупсов;
  12. "Выдираем" поле charset из хедеров;
  13. Немного адресной книги, немного регеспов и...;
  14. Обрабытываем письмо... ну почти СУБД...;

Все регеспы пишутся в одну строку, без пробелов на местах склеек...

  1.  
    %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"""
    

    Попробуйте этим ... хммм... *агрегатом* заменить стандартный %Quotes и применить такой шаблончик к PGP-Signed письму. Может, понравится...

    Имеющиеся проблемы:
    1. Стандартно, _весь_ текст письма подписывается PGP, и для именно такой ситуации этот макрос и был сделан. Однако, в Мыше имеется возможность подписать _кусок_ письма, а потом еще один, и так ad infinitum. Такое макрос НЕ поддерживает, если это -- некая проблема, скажите мне. Вернусь из Углича в середине месяца -- поковыряюсь...

    Имеющиеся тонкости:
    1. Этот агрегат наверху подменяет собой, в числе прочего, Батовскую встроенную технику обрезания подписи при ответе (ну, --<пробел>, вы все в курсе). То, что я привел наверху, считает символом начала подписи любую из следующих последовательностей:
      • - --<любое число пробелов или ни одного>
      • - ---<любое число пробелов или ни одного>
      • --<любое число пробелов или ни одного>
      • ---<любое число пробелов или ни одного>
      • <не менее 40 символов "_"><любое число пробелов или ни одного>
      • строку "-----BEGIN PGP SIGNATURE"
      (разумеется, каждая из этих последовательностей должна стоять в начале строки)
      За эту механику отвечает вот этот кусок макроса:
      ^(- --\s*\n|- ---\s*\n|--\s*\n|---\s*\n|_{40,}\s*\n|-----BEGIN PGP SIGNATURE)|\z)
      Если Вы считаете, что символом начала подписи может служить что-то еще, you are welcome добавить еще какое-нибудь определение туда. Буду рад услышать мнения на сей счет.

    Можно добавить и другие определения отделителя подписи, разумеется.

    Весь список регеспов

  2.  
    %REGEXPQUOTES="(?s)(.*?)(^(-\s)?--(\s)?\n|\Z)"
    

    Этот - немножко попроще, но для того же самого (кроме PGP). Регексп "откусывает" подпись при ответе на письмо, содержащее оную. Подписью считается все, что стоит после одного из:
    • - -- <CR>
    • - --<CR>
    • -- <CR>
    • --<CR>

    Как и в прошлом примере, можно еще добавить определения отделителя подписи, например:

    %REGEXPQUOTES="(?s)(.*?)(^(-\s)?--(\s)?\n|^(-\s)?---(\s)?\n|\Z)"

    Тут подписью считается то, что начинается с одной из четырех строк выше, плюс:
    • - --- <CR>
    • - ---<CR>
    • --- <CR>
    • ---<CR>

    Весь список регеспов

  3.  
    %SETPATTREGEXP="(?m-s)Date\:\s*((.*?[\d]{1,4})\s*?([\d]{0,2}\:[\d]
    {0,2}\:[\d]{0,2})\s*?(.*))"%REGEXPBLINDMATCH="%HEADERS"

    Эта штуковина разбирает по кусочкам поле Date: того письма, на котором срабатывает. В результате появляется нештатная возможность использовать в шаблоне ответа или форварда локальное время отправителя письма, а не "подправленное" Батом до вашего локального (поведение по умолчанию), например, в следующей конструкции:

    %SUBPATT="2", когда на ваших часах натикало %SUBPATT="3" --
    а было это в часовом поясе GMT%SUBPATT="4" --
    вы мне писали:
    
    Полный список регистров, доступных как %SubPatt="N":
    • %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

    Ограничения: макрос будет срабатывать с непредсказуемыми результатами, если поле Date: того письма, на котором он работает, не соответствует требованиям RFC822. К счастью, это значит "довольно редко".

    Весь список регеспов

  4.  
    %TO=""%TO="%SETPATTREGEXP=""(?ms).*?((\s|^|\A)\S*?\@.*?(\s|\n|\Z))""%REGEXPMATCH=""%TEXT"""

    Эта штуковина находит первый e-mail адрес в теле письма и адресует то письмо, что формируется шаблоном, в котором этот макрос стоит, на найденный адрес. Адресом тут считается следующая последовательность символов: <пробел, или начало строки, или начало текста><сколько угодно не-пробелов>@<что угодно до первого пробела, или конца строки, или конца текста>.

    Ограничения: некоторые люди русский язык плохо знают, то, что в их письмах этот макрос найдет, может оказаться чем угодно, а не адресом. И письма туда отправлять совершенно бессмысленно...

    Весь список регеспов

  5.  
    %SetPattRegExp="(?mis).*?((http|https|ftp|nntp|etc)://.*?)(\s|\>|\n)"
    %RegExpBlindMatch="%Text"%SubPatt="1"

    Найдет первый попавшийся FQURL в теле письма (что-нибудь типа http://somewhere.com). И вставит его в тело нового письма.

    FQURL - это строка, выглядящая вот так:

    <http или https или ftp или nntp или etc>://<что угодно до символа ">", или до пробела, или до конца строки>

    Ограничения: может и ничего не найти: некоторые массовики-затейники так URL'ы пишут, что закачаешься...

    Весь список регеспов

  6.  
    %SETPATTREGEXP="(?m-s)X-Mailer\:\s*(.*?\n)"%REGEXPMATCH="%HEADERS"

    Этот макрос выедает то, что написано в поле X-Mailer: письма, и вставляет найденную строку. То есть выдает на-гора информацию о том, каким почтовым клиентом было написано обрабатываемое письмо.

    Ограничения: некоторые почтовые клиенты поле X-Mailer не заполняют (например, pine). Ну, в этом случае макрос ничего и не выдает...

    Весь список регеспов

  7.  
    %REGEXPTEXT="((.*?\n){1,10})"

    Совсем простой макрос. Выедает и выдает первые 10 строк (или меньше, если строк всего меньше:-)) обрабатываемого письма.
  8.  
    %Subject="Re: %SetPattRegExp=""(?i)\A\:?(\s*(Ответ|re|ha|rcpt|fwd)
    (\[\d*\])?:\s*|\[.*?\])*\s*(.*?)(\s{1,}-\s{1,}.*\Z|\Z)""%RegExpBlindMatch=""%OSubj""%SubPatt=""4"""

    Макрос "причесывает" некрасивые 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*(.*?)\Z""%RegExpBlindMatch=""%OSubj""%SubPatt=""4"""

    (обрабатывает варианты типа: Re: Re[4]: Ответ: [thebat] Ha: Fwd: Re[25]: subject. Превращает это безобразие в просто Re: subject)

    Весь список регеспов

  9.  
    %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"

    Этот макрос служит в качестве эрзац-заменителя отсутствующего в Бате макроса, который бы выдавал время получения (а не написания!) письма. Выдает искомое время.

    Ограничения: на самом деле, он выдает не время получения письма Зе Батом, а время получения его вашим SMTP-сервером (технически выражаясь, время, стоящее в самом последнем хедере Received:, потому что время собственно получения письма Батом ни в одном хедере не прописано). Все же лучше, чем ничего:-))

    Весь список регеспов

  10.  
    %SetPattRegExp="(?ims).*?\s*(\w*?\@\S*?)\Z"%RegExpMatch="%OSubj"

    Выедает e-mail адрес, который стоит в самом конце темы, отделенный от начала темы одним или более пробелами. Натурально, если адреса там не стоит, то ничего и не выдает.

    Весь список регеспов

  11.  
    %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"""

    Модификация 1, умела выедать рекламу еГрупсов (в момент времени, когда еще были еГрупсы и у них была еще жива привычка вставлять рекламу в верх писем...). Представляет исключительно историческую ценность.

    Весь список регеспов

  12.  
    %SetPattRegExp="(?im).*?charset\s*\=\s*(.*?)\s"%RegExpBlindMatch="%Headers"%SubPatt="1"

    Выдирает поле charset из хедеров обрабатываемого письма.

    Весь список регеспов

  13.  
    Техническое задание:
    Вопрос. Можно ли сделать так:
    1. Отвечаю на письмо;
    2. Если в письме есть слово "вася", то %comments="пупкин";
    3. Если в письме нет "васи", то %comments="".
    Можно ли такое сделать с помощью regexp?

    Решение:

    В адресной книге завести себя, со своим адресом (важно, чтобы этот адрес совпадал с Reply-To: для того аккаунта, из которого предлагаемый трюк должен работать). В свойствах себя заводим "базу данных" <g> в поле Memo, например <vbg>:

    вася=пупкин
    петя=жопкин
    я=идиот

    И вот теперь всё очень просто: если, к примеру, я хочу, чтобы при присутствии слова "петя" в поле Comment: попало слово "жопкин", я пропишу вот такой регексп для Reply (всё в одну длинную строку без пробела на месте склейки):
    %Comment="%SetPattRegExp=""(?ms)(петя).*?\|{10}(|.*?\n)\1=(.*?)
    (\n|\Z)""%RegExpBlindMatch=""%Text||||||||||%ABReplyMemo""%SubPatt=""3"""

    Ограничения: работать не будет, если в теле письма встретится такая последовательность символов: "||||||||||". Однако есть надежда, что такой последовательности там НЕ встретится :).

    Весь список регеспов

  14.  
    Техническое задание:
    Имеется письмо, в теле которого есть ряд повторяющихся блоков вида:
    ==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 адрес владельца соответствующего счета.

    Теперь решение дается следующим шаблоном:
    %SetPattRegExp="(?ims)(.*?Лицевой счет\s*([\d]*).*?(^\s*\+[-]*\+(.*?)^\s*\+[-]*\+.*?\n)
    \s*Всего.*?----\n\s*\S*\s*\S*\s*(.*?)){1}\n"

    %REGEXPBlindMATCH="%Text"

    Лицевой счет: %SubPatt="2"

    %SubPatt="3"

    Итого: %SubPatt="5"
    %To=""%To="%SetPattRegExp=""(?ims)(.*?Лицевой счет\s*([\d]*).*?(^\s*\+[-]*\+(.*?)^\s*\+[-]
    *\+.*?\n)\s*Всего.*?----\n\s*\S*\s*\S*\s*(.*?)){1}\n""%REGEXPBlindMATCH=""%Text""%SubPatt=""2""
    <list>"

    Создаем фильтр, который изготавливает письмо по этому шаблону. Этот фильтр будет вызывать генерацию извещения для первого клиента, данные которого встретились парсеру в исходном письме.

    В созданном нами фильтре ставим опцию "continue processing with other filters" и создаем следующий фильтр. Ровно такой же, но в шаблоне (в двух местах) меняем: {1}\n на {2}\n

    Этот новый фильтр сделает то же, что и первый, но для второго юзера, встретившегося в файле. Создаем столько фильтров (меняя соответственно номер в фигурных скобках), сколько у нас юзеров. Или, если число юзеров точно неизвестно, столько фильтров, чтобы их число превышало число юзеров (в этом случае к шаблону надо приписать %Bcc="свой адрес" и поставить входящий фильтр, чтобы он удалял мессаги с пустым телом, это, конечно, просто делается).

    Александр Киселев

Новые версии The bat! | Купить The bat! | О проекте | Скачать The Bat!