Что нового

[Автоматизация] Скришот + отправка по e-mail одной кнопкой

WiseBird

Новичок
Сообщения
1
Репутация
0
Версия AutoIt: 3.x

Описание:
  • Запускам скомпилированный скрипт
  • Создаётся скриншот
  • Появляется форма. Вводим примечание
  • Нажимаем "послать"
  • Получаем мессажбокс "всё ок"

P.S. пользователей много. они повсюду. и они, в большинстве своём, бухи.


Добавлено:
Сообщение автоматически объединено:

Самым тупым образом срастил 2 скрипта. Оно даже работает. Осталось проверить на терминале, научить оно дописывать, например, в тело письма имя пользуна и выплёвывать окошко под примечание (в идеале).
Код:
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <File.au3>
#include <GDIPlus.au3>

; ### Заполнить:
$sFile = @TempDir&"\~12345_ScreenCapture.png"
$sFile2 = @TempDir&"\~12345_ScreenCapture2.png"

$SmtpServer = "mail.server.ru"              ; address for the smtp-server to use - REQUIRED
$FromName = "Гугл Корпорейшн, пользователь: "&@UserName                     ; name from who the email was sent
$FromAddress = "[email protected]" ; address from where the mail should come
$ToAddress = "[email protected]"   ; destination address of the email - REQUIRED
$Subject = "Скриншот ошибки"                   ; subject from the email - can be anything you want it to be
$AttachFiles = $sFile
$CcAddress = ""       ; address for cc - leave blank if not needed
$BccAddress = ""     ; address for bcc - leave blank if not needed
$Importance = "High"                  ; Send message priority: "High", "Normal", "Low"
$Username = "username"                    ; username for the account used from where the mail gets sent - REQUIRED
$Password = "password"                  ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 25                            ; port used for sending the mail
$ssl = 0                                ; enables/disables secure socket layer sending - put to 1 if using httpS
;~ $IPPort=465                          ; GMAIL port used for sending the mail

Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

If FileExists($sFile) Then FileDelete($sFile)
If FileExists($sFile2) Then FileDelete($sFile2)

$iPicHeight = 400/(@DesktopWidth/@DesktopHeight)

_ScreenCapture_Capture($sFile)
_ImageResize($sFile,$sFile2,400,$iPicHeight)


$hGUI = GUICreate("Жалуемся Витале!",410,$iPicHeight + 110,-1,-1,-1,$WS_EX_TOOLWINDOW)
$hPic = GUICtrlCreatePic($sFile2,5,5,400,$iPicHeight)
GUICtrlCreateLabel("Примечание:",10,$iPicHeight+15,100,20,0x01)
$hText = GUICtrlCreateEdit("",120,$iPicHeight+15,280,85)
$hSendBut = GUICtrlCreateButton("Отправить",10,$iPicHeight + 80,100,20)
$sText = ""
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $hSendBut
			$sText = GUICtrlRead($hText)
			If $sText = "" Then $sText = "<Примечаний нет>"
			GUIDelete($hGUI)
			_INetSmtpMailCom($SmtpServer,$FromName,$FromAddress,$ToAddress,$Subject,$sText,$AttachFiles,$CcAddress,$BccAddress,$Importance,$Username,$Password,$IPPort,$ssl)
			$error = @error
			If $error Then
				MsgBox(16,"ScreenSender","Во время отправки произошла ошибка! Код="&$error)
			Else
				MsgBox(64,"ScreenSender","Письмо успешно отправлено!")
			EndIf
			If FileExists($sFile) Then FileDelete($sFile)
If FileExists($sFile2) Then FileDelete($sFile2)
			Exit
	EndSwitch
WEnd

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail=""
EndFunc   ;==>_INetSmtpMailCom

Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc

Func _ImageResize($sInImage, $sOutImage, $iW, $iH)
    Local $hWnd, $hDC, $hBMP, $hImage1, $hImage2, $hGraphic, $CLSID, $i = 0

;OutFile extension , to use for the encoder later on.
    Local $Ext = StringUpper(StringMid($sOutImage, StringInStr($sOutImage, ".", 0, -1) + 1))

    ; Win api to create blank bitmap at the width and height to put your resized image on.
    $hWnd = _WinAPI_GetDesktopWindow()
    $hDC = _WinAPI_GetDC($hWnd)
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    _WinAPI_ReleaseDC($hWnd, $hDC)

    ;Start GDIPlus
    _GDIPlus_Startup()

    ;Get the handle of blank bitmap you created above as an image
    $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP)

    ;Load the image you want to resize.
    $hImage2 = _GDIPlus_ImageLoadFromFile($sInImage)

    ;Get the graphic context of the blank bitmap
    $hGraphic = _GDIPlus_ImageGetGraphicsContext ($hImage1)

    ;Draw the loaded image onto the blank bitmap at the size you want
    _GDIPLus_GraphicsDrawImageRect($hGraphic, $hImage2, 0, 0, $iW, $iH)

    ;Get the encoder of to save the resized image in the format you want.
    $CLSID = _GDIPlus_EncodersGetCLSID($Ext)

    ;Save the new resized image.
    _GDIPlus_ImageSaveToFileEx($hImage1, $sOutImage, $CLSID)

    ;Clean up and shutdown GDIPlus.
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _WinAPI_DeleteObject($hBMP)
    _GDIPlus_Shutdown()
EndFunc
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Мой вариант + кнопка...

Код:
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <File.au3>

; ### Заполнить:
$sFile = @TempDir&"\~12345_ScreenCapture.png"

$SmtpServer = "smtp.mail.ru"              ; address for the smtp-server to use - REQUIRED
$FromName = "ScreenSender"                     ; name from who the email was sent
$FromAddress = "[email protected]" ; address from where the mail should come
$ToAddress = "[email protected]"   ; destination address of the email - REQUIRED
$Subject = "Новый Скрин..."                   ; subject from the email - can be anything you want it to be
$AttachFiles = $sFile
$CcAddress = ""       ; address for cc - leave blank if not needed
$BccAddress = ""     ; address for bcc - leave blank if not needed
$Importance = "Normal"                  ; Send message priority: "High", "Normal", "Low"
$Username = "login"                    ; username for the account used from where the mail gets sent - REQUIRED
$Password = "password"                  ; password for the account used from where the mail gets sent - REQUIRED
$IPPort = 25                            ; port used for sending the mail
$ssl = 0                                ; enables/disables secure socket layer sending - put to 1 if using httpS
;~ $IPPort=465                          ; GMAIL port used for sending the mail

Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

; ### GUI:
$hGUI = GUICreate($FromName,170,50,-1,-1,-1,$WS_EX_TOOLWINDOW)
$hSendBut = GUICtrlCreateButton("Сделать и отправить скрин",0,0,170,50)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $hSendBut
			GUICtrlSetState($hSendBut,$GUI_DISABLE)
			If FileExists($sFile) Then FileDelete($sFile)
			_ScreenCapture_Capture($sFile)
			Sleep(500)
			_INetSmtpMailCom($SmtpServer,$FromName,$FromAddress,$ToAddress,$Subject,"",$AttachFiles,$CcAddress,$BccAddress,$Importance,$Username,$Password,$IPPort,$ssl)
			GUICtrlSetState($hSendBut,$GUI_ENABLE)
	EndSwitch
WEnd

Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail=""
EndFunc   ;==>_INetSmtpMailCom

Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
научить оно дописывать, например, в тело письма имя пользуна и выплёвывать окошко под примечание (в идеале)

Код:
...

$Body = "Пользователь: "&@UserName

...

_INetSmtpMailCom($SmtpServer,$FromName,$FromAddress,$ToAddress,$Subject,$Body,$AttachFiles,$CcAddress,$BccAddress,$Importance,$Username,$Password,$IPPort,$ssl)

...
 

Arei

Скриптер
Сообщения
938
Репутация
115
OffTopic:
_INetSmtpMailCom почему этой воспользовались? Ведь есть более удобные функции.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Arei
например?
 

Arei

Скриптер
Сообщения
938
Репутация
115
у меня способ через dll

Код:
#include <GUIConstants.au3>
#include <File.au3>
AutoItSetOption('TrayIconHide', 1)

$SmtpServer = "smtp.mail.ru"            ; адрес SMTP сервера
$FromName = "Mail Sender"               ; имя отправителя
$FromAddress = "" ; адрес отправителя
$ToAddress = ""      ; адрес назначения
$Subject = "test_mail_8"              ; тема письма
$Body = "body_of_mail"            ; тело письма (сам текст письма)
$AttachFiles = ""; прикреплённые файлы к письму
$Username = ""            ; имя пользователя аккаунта, с которого отправляется
$Password = ""                     ; пароль аккаунта, с которого отправляется

$BlatArgs = "-t "&$ToAddress&" -f "&$FromAddress&" -s "&$Subject&" -body "&$Body&" -server "&$SmtpServer&" -u "&$Username&" -pw "&$Password&" -attach "&$AttachFiles
;Run (@scriptdir & "\blat. " & $BlatArgs, @ScriptDir, @SW_HIDE )
_SendMail($BlatArgs)

Func _SendMail($CMDstring)
    $BlatDLL = DllOpen ("blat.dll")
    Do
        $result=DllCall($BlatDLL,"int","Send","str",$CMDstring)

        Select
            Case $result[0] = 13
                MsgBox(16,"Ошибка. Код ошибки " & $result[0], "Не могу открыть временный файл во временной папке")

            Case $result[0] = 12
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Не указаны или не найдены в реестре аргументы -server или -f")

            Case $result[0] = 3
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Не могу прочитать файл с текстом письма или приложенный файл")

            Case $result[0] = 2
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Почтовому серверу не понравился адрес отправителя; или он отказал нам в подключении; или неверный пароль; или не найден файл с текстом письма")
            Case $result[0] = 1
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Не могу открыть SMTP сокет. Проверьте подключение к Интернету; либо неверные аргументы")
            Case $result[0] <> 0
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Неизвестная ошибка")
        EndSelect
    Until $result[0] = 0
    DllClose ($BlatDLL)
EndFunc ;

мне кажется более удобный в использовании, но 1 минус dll(лишний файл),но можно его с помощью FileInstall засунуть в файл.
 

joiner

Модератор
Локальный модератор
Сообщения
3,401
Репутация
596
SECTOR
как сделать отправку , если есть прокси?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Александр, не знаю, функция не моя...

Arei, имхо _INetSmtpMailCom и есть самый удобный способ отправки ;)
 

Arei

Скриптер
Сообщения
938
Репутация
115
Сравни сколько там кода,а сколько тут.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
Arei [?]
Сравни сколько там кода,а сколько тут.
это не показатель удобства. удобство, если ты делаешь телодвижений и извилиношевелений меньше. по мне, оба метода одинаковы с точки зрения удобства. в случае с CDO, надо чтобы он был установлен в системе. это так, для подавляющего большинства систем.
 

Arei

Скриптер
Сообщения
938
Репутация
115
соглашусь, что мой способ удобнее. :smile:
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Arei, имхо вы в пустую это пишите... Это скорее всего никому не интересно! Ведь каждый и так выбирает то, что считает удобным... ;)
 

_Lexa98_

Осваивающий
Сообщения
551
Репутация
25
Народ,а можно сделать просто без кнопки?
1)запускаешь скрипт
2)делается скрин
3)отправляется на mail
:wacko:
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Смотри первый пост... Убери GUI и всё... Все функции даны... Проблем не вижу...
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Народ,а можно сделать просто без кнопки?
1)запускаешь скрипт
2)делается скрин
3)отправляется на mail
:wacko:

Код:
#include <ScreenCapture.au3>

$Screen = @TempDir & '\screenshot.jpg'
_ScreenCapture_Capture($Screen)
Do
Until FileExists($Screen)

$FromAddress = 'от кого письмо'
$ToAddress = 'кому письмо'
$Subject = 'тема письма'
$Body = 'текст письма'
$Attachment = $Screen ;файл для отправки
$SMTPServer = 'smtp.mail.ru'
$Username = 'логин@mail.ru'
$Password = 'пароль'
$Port = '2525'

$str = "http://schemas.microsoft.com/cdo/configuration/"
$hMAIL = ObjCreate ("CDO.Message")
    With $hMAIL
        .From = $FromAddress
        .To = $ToAddress
        .Subject = $Subject
        .TextBody = $Body
        .AddAttachment ($Attachment) ;файл для отправки
    EndWith
    With $hMAIL.Configuration.Fields
        .Item ($str & "sendusing") = 2
        .Item ($str & "smtpserver") = $SMTPServer ;SMTP Server
        .Item ($str & "smtpauthenticate") = 1
        .Item ($str & "sendusername") = $Username
        .Item ($str & "sendpassword") = $Password ;Пароль SMTP-сервер
        .Item ($str & "smtpserverport") = $Port ;Порт
        .Update
    EndWith
$hMAIL.Send
 

fuflik

Новичок
Сообщения
5
Репутация
0
Объясните дубу что мы меняем в третей строке??? куда путь указывать? и следует ли что то менять. При проверке выдает "C:\Program Files (x86)\AutoIt3\SciTE\pochta3.au3"(3,10) : warning: $Screen: possibly used before declaration. P.S. Сразу не пинайте. Спасибо
 

Tech

Новичок
Сообщения
12
Репутация
1
Уважаемый дуб, @TempDir - путь к каталогу, который содержит временные файлы.
Т.е. для Win7 это C:\Users\UserName\AppData\Local\Temp


Добавлено:
Сообщение автоматически объединено:

Код:
$Screen  @TempDir & '\screenshot.jpg'
надо заменить на
Код:
$Screen = @TempDir & '\screenshot.jpg'

(Пысы: найдите одно отличие)


(Пыспысы: да, вы правы, не было =)
 

fuflik

Новичок
Сообщения
5
Репутация
0
Спасибо тебе добрый человек!!! Все работает
 
Верх