1 (изменено: SergFom, 2007-01-12 11:03:52)

Тема: AHK: отправка письма с аттачем в The bat!

Желание написать данный скрипт у меня возникло давно. За идею я взял статью с данного сайта о использовании AutoHotkey для автоматизации отправки сообщения с аттачем из почтового клиента Outlook Express, поскольку сам Outlook Express не умеет работать с командной строкой и порулить им так просто не удастся. Все действия скрипта основаны на передаче окнам Outlook Express сообщений в результате которых вызывалось окно для вставки файлов, затем мы "передаем" окну путь к вложениям и имена самих файлов, далее скрипт нажимал кнопку "вложить" в итоге мы получаем готовое "к употреблению"сообщение с вложенными файлами, с заполненной темой сообщения и адресатом. The bat! же (в отличии от своего "брата" Outlook Express) имеет множество настроек и охотно работает с командной строкой, либо по своей неопытности я не нашел как вложить несколько файлов (вкладывался только один файл) поэтому пришлось прибегнуть к вспомогательным средствам я имею ввиду AHK
скрипт работает так: вызывается The bat! двумя разными путями см.настройки ниже (в зависимости от выбора пользователя) с новым сообщением в котором заполняются поля to: ,subject:, text: (адресат, тема и текст сообщения соотв-но ), затем скрипт  посылает команду {Alt}+{PgUp} (вставка файла), далее нам нужно заполнить в окне выбора файлов путь к вложениям, а также имя файла(ов). Чтобы послать окну сообщение нам нужно знать заголовок окна либо класс окна (поскольку заголовок выбора файлов различен для разных версий бата, я использовал имя класса окна узнал с помощью утилиты  Winspector Spy) если не поможет можно использовать все-таки заголовок окна, предварительно  откорректировав его в настройках пользователя

Вот мой скиптец

; AutoHotkey Version:   1.0.46.05
; Автор:                Serg Fomichev
; Имя скрипта:          the_bat_example.ahk (v.1)
;*******************************************************************************
; Автоматизация отправки сообщения для The bat!
; сообщение отправляется по указанному в настройках адресу, с заданной темой, с 
; заданным текстом сообщения и наконец прикрепляет файлы из заданной папки 
; после отправки файлы из заданной папки удаляются по желанию пользователя
;*******************************************************************************

#NoEnv      ; запрещаем имена переменных как у переменных окружения (повышаем производительность скрипта)
;#NoTrayIcon ; не отображать иконку скрипта в трее

; ========== НАСТРОЙКИ ПОЛЬЗОВАТЕЛЯ ===============
Attach_Path = c:\test\*.* ; путь к вложению & path
Recipient = test@mail.ru ; адрес получателя
Subject_message = твоя тема сообщения ; тема сообщения
Text_message = Файлы вложены и отправлены с помощью скрипта AutoHotKey ; текст сообщения

;title_insert_files = Прикрепить файл (MIME/Base64) ;заголовок окна вложения файлов (вызывается нажатием в бате {Alt}+{PgUp}
title_insert_files = ahk_class #32770               ;класс окна вложения файлов 

; дополнительные настройки для использования если 
; The bat! не настроен как клиент 
; для обрабоки команды mailto: по умолчанию
The_bat_path = C:\Program Files\The Bat!\thebat.exe ;собственно путь к почтовому клиенту
account = yandex ; имя почтового ящика в бате       
mailto_not_default = 1 ; если 1 то отправление почты будет происходить через команду типа 
                         ;C:\Program Files\The Bat!\thebat.exe /MAILU=MyAccount;S=%O
                         ;EDIT;TO=test@mail.ru;Subj=твоя тема сообщения
; =================================================
Subject_message = "%Subject_message%"         ; приводим к читаемому формату The bat! т.к.  
Text_message    = "%Text_message%`%0a`%0d "   ; он считает пробел следующим параметром

IfNotExist, %Attach_Path% ; если НЕ существует указанного пути, то...
    {   
        MsgBox, 0, Ошибка!,  Проверьте существование путей!`n путь: %Attach_Path% не найден! ; вывод сообщения об ошибке
        Return ; закончить обработку
    }    
IfNotExist, %The_bat_path% ; если НЕ существует указанного пути, то...
    {   
        MsgBox, 0, Ошибка!,  Проверьте существование путей!`n путь: %The_bat_path% не найден! ; вывод сообщения об ошибке
        Return ; закончить обработку
    }
Loop, %Attach_Path%                                  ;считываем в переменную список файлов
    FileList = %FileList% "%A_LoopFileName%"         ;из пути вложений
if     (mailto_not_default=1)
{ 
;Run, "%The_bat_path%" /MAILU=%account%;EDIT;TO=%Recipient%;Subj=%Subject_message%     ;по желанию какая больше нравится
Run, "%The_bat_path%" mailto:%Recipient%?subject=%Subject_message%&body=%Text_message% ;первая создает сообщение по шаблону по умолчанию
;вторая в поле текст сообщения выводит желаемый текст сообщения + вывод запроса типа бат не установлен как клиент по умолчанию, 
;поставь чек не задавать больше вопрос и выбери желаемое действие
}
else
{
Run, mailto:%Recipient%?subject=%Subject_message%&body=%Text_message% ;выполняем собственно команду
}
WinActivate, Редактирование письма -> %Recipient%
WinWait, Редактирование письма -> %Recipient%     ;ждем окно перед нажатием {Alt}+{PgUp} (горячая клавиша бата для вставки файлов)
Send !{PgUp}
WinActivate, %title_insert_files%   ;активируем окно (почему-то после нажатия клавиш вставки файлов было неактивным)
WinWait, %title_insert_files%       ;ждем окно перед посылкой в поле пути к вложениям
ControlSetText, Edit1, %Attach_Path%         ;собственно коментировать нечего итак понятно
Send {Enter}                                 ;посылаем сначала путь жмем энтер
WinWait, %title_insert_files%       ;ждем окна
ControlSetText, Edit1, %FileList%            ;посылаем собственно список файлов из папки с вложениями      
Send {Enter}                                    ;жмем энтер
WinWait, Редактирование письма -> %Recipient%   ;ждем окно с новым письмом
WinWaitClose, Редактирование письма -> %Recipient%  ;можно сразу нажать F2 но для перестраховки что файлы вложились будем нажимать отправить сами
MsgBox, 4, Подтвердите удаление файла(ов), Файлы отправлены, очистить каталог`n%Attach_Path%  ; диалог подверждения удаления файлов вложений
IfMsgBox, No
{
    MsgBox, 0, Информационное сообщение, Не забудьте удалить файлы `nиз папки %Attach_Path% `nвручную!!!
    Return  ; User pressed the "No" button.
}    
IfMsgBox, Yes
{
    FileDelete %Attach_Path%
    MsgBox, 0, Информационное сообщение, Каталог %Attach_Path%`n для дальнейшей работы очищен!
     Return ; 
}

Для написания данного скрипта я использовал материалы с "Серого форума", статьи, примеры из Хранилища, отдельное спасибо The gray Cardinal, а также Androgen'у за его скрипты и подробные объяснения к ним. Буду рад, если кто-то поправит или предложит новые идеи по реализации данной задачи.