Что нового

[Автоматизация] Скришот + отправка по 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
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
{CodeWarn}
 

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 362
Репутация
586
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
Репутация
658
Народ,а можно сделать просто без кнопки?
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
Спасибо тебе добрый человек!!! Все работает
 
Верх