Тема: AHK: 3 способа отправки почтовых сообчений из тела скрипта AHK_L
Намедни понадобилось организовать отправку писем из тела скрипа. Цель - обеспечить пересылку результатов работы скрипта на удаленную машину в условиях негарантированного подключения к Wifi.
Так как большинство найденного на этом форуме и на http://www.autohotkey.com разрабатывалось под AHK, а не под AHK_L, скрипты устарели и с ходу не работали. Да и вообще, информации по этому вопросу не много. В общем, собрал в кучу 3 рабочих способа и выкладываю в одном посте. Может, кому пригодится.
1) Отсылка писем при помощи библиотеки CDO. Найдено здесь: http://www.autohotkey.com/board/topic/6 … ery-ahk-l/
Код AHK_L:
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
#Warn ; Recommended for catching common errors.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
sFrom := "mymail@gmail.com"
sTo := "delivery@address.com"
sSubject := "Message_Subject"
sBody := "Message_Text"
sAttach := "" ;"Path_Of_Attachment" ; can add multiple attachments, the delimiter is [color=red]|[/color]
sServer := "smtp.gmail.com" ; specify your SMTP server
nPort := 465 ; 25
bTLS := True ; False
nSend := 2 ; cdoSendUsingPort
nAuth := 1 ; cdoBasic
sUsername := "mymail@gmail.com"
sPassword := "somepassword"
pmsg := ComObjCreate("CDO.Message")
pcfg := pmsg.Configuration
pfld := pcfg.Fields
pfld.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") := nSend
pfld.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") := 60
pfld.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") := sServer
pfld.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") := nPort
pfld.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") := bTLS
pfld.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") := nAuth
pfld.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") := sUsername
pfld.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") := sPassword
pfld.Update()
pmsg.From := sFrom
pmsg.To := sTo
pmsg.Subject := sSubject
pmsg.TextBody := sBody
Loop, Parse, sAttach, |, %A_Space%%A_Tab%
pmsg.AddAttachment := A_LoopField
pmsg.Send()
Преимущества и недостатки:
Преимущества:
Способ без заморочек поддерживает TLS и SSL (опробовано на яндексе и gmail)
Недостатки:
- Нету лог-файла
- Пароль хранится в скрипте в явном виде.
- Не нашел способ прописать кодировку заголовка и тела письма, для корректного отображения у получателя.
Способы решить данные проблемы наверняка есть, но рыться в дебрях CDO ради единичного случая...
2) Отправка писем при помощи утилиты Blat (http://www.blat.net)
Надежная и простая в использовании утилита. Можно использовать также вызовом DLL.
Код АНК, версия для exe:
Text = "%A_ScriptDir%\Testas.txt" ; Путь к файлу с телом письма
;~ Body = This is a message sent with blat.dll ; Либо тело письма здесь
eMail=delivery@address.com ; Адрес получателя
subj=-s "Test Blat application"
user=mymail@yandex.ru ; Логин. Для Яндекса - также и адрес отравителя в одном флаконе :)
pass=-pw somepassword ; Пароль
server=-server smtp.yandex.ru:587 ; Сервер:порт
x=-x "X-Header-Test: Can Blat do it? Yes it Can!"
debug=-debug -log blat.log -timestamp ; Параметры лог-файла
Blat_String = %Text% -to %eMail% -f %user% -u %user% %pass% %subj% %server% %debug% %x%
RunWait, blat.exe %Blat_String%, , Hide UseErrorLevel ;
Tooltip, %A_LastError% ; Проверяем на отсутствие ошибок
Sleep, 5000
ExitApp
Код AHK_L, версия для dll:
Text="%A_ScriptDir%\Testas.txt"
;~ Body = This is a message sent with blat.dll
eMail=delivery@address.com
subj=-s "Test Blat dll"
user=mymail@yandex.ru
pass=-pw somepassword
server=-server smtp.yandex.ru:587
x=-x "X-Header-Test: Can Blat do it? Yes it Can!"
debug=-debug -log blat.log -timestamp
Blat_String = %Text% -to %eMail% -f %user% -u %user% %pass% %subj% %server% %debug% %x% -attach %Text%
Blat_DLL:=DllCall("blat.dll\SendW",Str,Blat_String) ; Обратите внимание на букву W после команды Send. Она
; необходима для корректной передачи информации в Юникоде в
; DLL. Без нее скрипт АНК работать будет, а AHK_L - нет
msgbox %Blat_DLL% ; 0 => OK
exitapp
Форум поддержки Blat здесь: http://tech.groups.yahoo.com/group/blat/
За помощь в отладке скрипта под Blat_DLL спасибо Chip и Tim Musson.
Преимущества и недостатки:
Преимущества:
- Лог-файл
- Простота и самодостаточность
- Утилиту можно проинсталировать с профайлом пользователя по умолчанию - упрощается вызов и решается проблема безопасности пары логин/пароль.
Недостатки:
В принципе, недостаток один - Blat напрямую не поддерживает SSL. Проблему можно решить при помощи программы https://www.stunnel.org, но я пока не занимался.
3) Отправка писем при помощи утилиты Mailsend (http://www.muquit.com/muquit/software/m … lsend.html)
простая в использовании утилита, похожая на предыдущую. Основное преимущество - поддержка SSL
Код АНК, версия для exe:
eMail=delivery@address.com
subj="Test MailSend application"
user=mymail
from=mymail@gmail.com
pass=somepassword
server=smtp.gmail.com
Port=465
MailSend_String =-to %eMail% -from %from% -ssl -smtp %server% -port %Port% -sub %subj% +cc +bcc -v -auth-login -user %user% -pass %pass% -attach "Test.txt,a" -M "body line1: this is a body of message"
RunWait, MailSend.exe %MailSend_String%, , Hide UseErrorLevel
MsgBox,,, %A_LastError%, 3
ExitApp
Преимущества и недостатки:
Преимущества:
- Поддержка TLS и SSL (опробовано на Яндексе и gmail)
- Возможность указать кодировку письма.
Недостатки:
- Нету лог-файла. Т.е. отчет о соединении программа выводит в окно консоли, однако в файл записывать не умеет.
- Нету dll версии.
На момент поста все скрипты проверялись и были рабочими.
На очереди у меня тестовые прогоны всех скриптов в реальных условиях: отсылка накопившихся на данный момент отчетов (примерно 150 штук, вес до 3 мегабайт) и по 2 недели работы в дежурном режиме, т.е. пересылка отчетов по мере их генерации системой. По результатам - отпишусь.