Интересные макросы
Приветствие
Многим при создании сообщений хочется видеть что-то типа «Доброе утро, уважаемый Иван Петрович», когда на дворе 2 часа пополудни, и «Добрый вечер, Иван Петрович», когда 8 часов вечера. Ниже мы именно этому и будем обучать нашего любимого The Bat!
Итак, время представлено в виде строк, то есть «8:00», «9:00», «17:00», «5:00».
Сравнивая время, программа на самом деле сравнивает его строковое представление, а принцип сравнения строк элементарен – сравнение идет посимвольно.
Чем это грозит? А смотрите сами:
- Сравним 17:00 и 20:00 Первый символ в строке «17:00», это символ «1» Первый символ в строке «20:00», это символ «2» 1 < 2? Ага. Соответственно, 17:00 < 20:00 логично, не правда ли?
- Сравним теперь 18:00 и 10:00 Первый символ в строке «18:00», это символ «1» Первый символ в строке «10:00», это символ «1» 1 < 1? Нет. 1 > 1? Нет. 1 = 1? Да. Переходим ко второму символу. Второй символ в строке «18:00», это символ «8» Второй символ в строке «10:00», это символ «0» 8 < 0? Нет. 8 = 0? Нет. 8 > 0? Да. Соответственно, 18:00 > 10:00
В данном случае ошибки не происходит, все дело в этом самом принципе сравнения. При установленном у вас формате представления даты, у чисел меньше десяти в начале отсутствует лидирующий ноль. И что в итоге?
- Сравним 8:00 и 12:00 Первый символ в строке «8:00», это символ «8» Первый символ в строке «12:00», это символ «1» 8 > 1? Ага. Соответственно, 8:00 > 12:00. А как правильно? А вот так:
- Сравним 08:00 и 12:00 Первый символ в строке «08:00», это символ «0» Первый символ в строке «12:00», это символ «1» 0 < 1? Ага. Соответственно, 08:00 < 12:00. Чтобы этого избежать, можно воспользоваться средствами последних версий The Bat!, которые позволяют явно указывать формат времени и даты.
Предлагаю вот такой вот шаблон:
%IF:»%TIME=’hh:mm:ss'»>»06:00:00″:»%IF:’%TIME=»»hh:mm:ss»»‘<’11:59:59′: ‘Доброе утро':»»%%IF:»%TIME=’hh:mm:ss'»>»11:59:59″:»%IF:’%TIME=»»hh:mm:ss»»‘<’17:59:59′: ‘Добрый день':»»%%IF:»%TIME=’hh:mm:ss'»>»17:59:59″:»%IF:’%TIME=»»hh:mm:ss»»‘<’23:59:59′: ‘Добрый вечер':»»%%IF:»%TIME=’hh:mm:ss'»>»00:00:00″:»%IF:’%TIME=»»hh:mm:ss»»‘<’05:59:59′: ‘Доброй ночи':»»%%IF:»%TIME=’hh:mm:ss'»=»00:00:00″:»Доброго времени суток»:»»%
Макрос IF
Многим из нас очень хочется удобства при работе с почтовой программой – и это правильно. Но как этого добиться? Вот в чем вопрос. Пожалуй, одним из достоинств The Bat! является возможность использования макросов. И именно на этих страницах мы рассмотрим макрос %IF. Как же работает этот макрос?
Общий вид
%IF:»Var1″оператор сравнения»Var2″:»Then»:»Else»
Var1 и Var2
Переменные, которые необходимо сравнить. Оператор сравнения: > Больше, < Меньше, = Равно.
Then
Текст, который будет вставлен в шаблон в том случае, если выражение верно, то есть Var1 оператор Var2 = TRUE.
Else
Текст, который будет вставлен в шаблон в том случае, если выражение неверно. Вместо Else можно поставить еще один IF. Все переменные заключены в кавычки. Варианты подстановки текста разделяются символом «:». Наряду со всеми этими переменными можно проставлять результат работы быстрых шаблонов и других макросов.
Рассмотрим пример:
%IF:»%QINCLUDE=»»month»»»=»Jan»:»января»:»»
В роли Var1 используем результат работы быстрого шаблона month: %QINCLUDE=»»month»». Шаблон возвращает некий текст (в данном случае, название месяца), которое извлекается им из поля Date, расположенного в заголовке письма. Две кавычки ставим, чтобы программа не приняла первую из них за закрывающую кавычку переменной Var1.
В роли второй переменной – слово «Jan». Таким образом, мы проверяем, возвращает ли этот быстрый шаблон текст «Jan». ЕСЛИ (Результат работы шаблона) = Jan.
В роли Then выступает текст «января», то есть ЕСЛИ (Результат шаблона) = Jan ТОГДА (Вставить в текст слово Января). А переменная Else пустует. Соответственно, имеем:
ЕСЛИ (Результат) = Jan
ТОГДА (Января)
ИНАЧЕ (Оставить текст в покое)>
Макрос «Цепочка ответов: Re(N)»
Этот макрос подставит вместо себя Re[n], если в оригинальном сообщении (на которое отвечаешь) есть номер, и подставит просто Re без номера в случае, если в оригинальном сообщения номера нет.
%If:’%SetPattRegExp=»Re\[(\d+)\]»%RegExpMatch=»%ReCount»'< >’2′ :’%ReCount':’Re:’
Другими словами, нумерованную цепь он не начнет, но и уже начатую не разорвет. Следовательно, если почтовик вашего собеседника не начнет нумеровать ответы, вся переписка будет с обычным Re:, что и требовалось.
Удаление из писем прикрепленных файлов
Иногда случается так, что приходят письма с большим количеством прикрепленных файлов, а вам необходимо само письмо оставить, а все эти файлы благополучно удалить. И приходиться щелкать мышью каждый файл, нажимать Del и еще отвечать: «Да, я хочу». А можно ли сделать это как-то быстрее? На пример, сразу выделив все файлы, прикрепленные к письму. При хранении отдельно удаление из письма прикрепленных файлов сводится к обычной операции над файлами, хоть из фильтра, хоть при загрузке.
Но имя прикрепленного файла в фильтре извлечь сложно и остается только чистить каталог ATTACH от всех файлов. Если некий ящик используется так, что никакие прикрепленные файлы не нужны, то и всего делов-то – хранение отдельно, фильтр на отправление любого/особого сообщения чистит весь каталог.
Отправлять почту из обычного ящика, а потом создавать копию в специальном – вряд ли можно назвать удачным решением, так как в этом случае, как оказалось, The Bat! не отделяет прикрепленные файлы, а так прямо в теле и сохраняет.
Итак, один способ – ящик с хранением прикрепленных файлов отдельно + DOS команда erace /Q …\ATTACH\*.*
Другой способ – фильтр после отправки экспортирует сообщение по шаблону, удаляет исходное и оставляет The Bat! команду на импорт сохраненного. Хороший способ, красивый, но не столь 100% надежный, первое время за ним надо последить в боевых условиях.
На всякий случай отдельно привожу шаблон сохранения:
FROM TextOnly %SetPattRegexp=»(\w{3})\w*,\s(\w{3})»%RegexpBlindMatch=»%ODateEn»%%SubPatt=»1″ %SubPatt=»2″ %TIME=»d hh:mm:ss yyyy» %SetPattRegexp=»(?ms).*Content-Type»%RegexpMatch=»%HEADERS»: text/plain; charset=windows-1251 Content-Transfer-Encoding: 8bit %TEXT