mattsk42 Posted August 2, 2018 Posted August 2, 2018 I have a script that pops up a window, lets you type things in, and then emails our helpdesk. It works. What I want to do is add 3 more buttons that allow you to attach 3 photos (or less) from your computer. Something simple as "Add attachment" and then you can browse for it. I don't even know where to begin with programming that button. If anyone could post an example, that would be great. Here's the current script (changed to pet.com because I like dogs): expandcollapse popup;expand popup ;#include <File.au3> ; =============================================================================================================================== ; Variables for the _INetSmtpMailCom ; =============================================================================================================================== Global Enum _ $g__INetSmtpMailCom_ERROR_FileNotFound = 1, _ $g__INetSmtpMailCom_ERROR_Send, _ $g__INetSmtpMailCom_ERROR_ObjectCreation, _ $g__INetSmtpMailCom_ERROR_COUNTER Global Const $g__cdoSendUsingPickup = 1 ; Send message using the local SMTP service pickup directory. Global Const $g__cdoSendUsingPort = 2 ; Send the message using the network (SMTP over the network). Must use this to use Delivery Notification Global Const $g__cdoAnonymous = 0 ; Do not authenticate Global Const $g__cdoBasic = 1 ; basic (clear-text) authentication Global Const $g__cdoNTLM = 2 ; NTLM Global $gs_thoussep = "." Global $gs_decsep = "," Global $sFileOpenDialog = "" ; Delivery Status Notifications Global Const $g__cdoDSNDefault = 0 ; None Global Const $g__cdoDSNNever = 1 ; None Global Const $g__cdoDSNFailure = 2 ; Failure Global Const $g__cdoDSNSuccess = 4 ; Success Global Const $g__cdoDSNDelay = 8 ; Delay #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <MsgBoxConstants.au3> ; This is to get the local username Local $myVar = "USERNAME" Local $myValue = EnvGet($myVar) ; This is the GUI #Region ### START Koda GUI section ### Form=f:\scripts\autoit\name-issue.kxf $Form1 = GUICreate("Submit a Helpdesk Ticket", 371, 260, 214, 199) ;~ $Pet = GUICtrlCreateLabel("Pet username:", 8, 8, 79, 17) $Label2 = GUICtrlCreateLabel("Issue with as much detail as possible:", 8, 7, 180, 17) ;~ $Name = GUICtrlCreateInput("", 88, 5, 105, 21) $Issue = GUICtrlCreateEdit("", 8, 25, 353, 200) $Submit = GUICtrlCreateButton("Submit", 8, 230, 75, 25) $Cancel = GUICtrlCreateButton("Cancel", 92, 230, 75, 25) ;~ $Label1 = GUICtrlCreateLabel("(example: jconnor)", 92, 26, 98, 17) ;~ $Label3 = GUICtrlCreateLabel("@pet.com", 195, 8, 60, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### ; These are for future use ;~ $ClientName = "ClientName##" ;~ $AtPet = "@pet.com##" While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $Submit ; Execute code when user presses the button Local $sSmtpServer = "smtp.gmail.com" ; address for the smtp-server to use - REQUIRED Local $sFromName = "" ; name from who the email was sent Local $sFromAddress = "user@pet.com"; address from where the mail should come Local $sToAddress = "helpdesk@pet.com" ; destination address of the email - REQUIRED Local $sSubject = StringUpper ($myValue); subject from the email - can be anything you want it to be Local $sBody = GUICtrlRead($Issue); the messagebody from the mail - can be left blank but then you get a blank mail Local $sAttachFiles = "" ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed Local $sCcAddress = "" ; address for cc - leave blank if not needed Local $sBccAddress = "" ; address for bcc - leave blank if not needed Local $sImportance = "Normal" ; Send message priority: "High", "Normal", "Low" Local $sUsername = "jconnor@pet.com" ; username for the account used from where the mail gets sent - REQUIRED Local $sPassword = "ajlkdjfawyfbna" ; password for the account used from where the mail gets sent - REQUIRED Local $iIPPort = 465 ; GMAIL port used for sending the mail Local $bSSL = True ; GMAIL enables/disables secure socket layer sending - set to True if using httpS Local $bIsHTMLBody = False Local $iDSNOptions = $g__cdoDSNDefault Local $rc = _INetSmtpMailCom($sSmtpServer, $sFromName, $sFromAddress, $sToAddress, $sSubject, $sBody, $sAttachFiles, $sCcAddress, $sBccAddress, $sImportance, $sUsername, $sPassword, $iIPPort, $bSSL, $bIsHTMLBody, $iDSNOptions) If @error Then MsgBox(0, "_INetSmtpMailCom(): Error sending message", _ "Error code: " & @error & @CRLF & @CRLF & _ "Error Hex Number: " & _INetSmtpMailCom_ErrHexNumber() & @CRLF & @CRLF & _ "Description: " & _INetSmtpMailCom_ErrDescription() & @CRLF & @CRLF & _ "Description (rc): " & $rc & @CRLF & @CRLF & _ "ScriptLine: " & _INetSmtpMailCom_ErrScriptLine() _ ) ConsoleWrite("### COM Error ! Number: " & _INetSmtpMailCom_ErrHexNumber() & " ScriptLine: " & _INetSmtpMailCom_ErrScriptLine() & " Description:" & _INetSmtpMailCom_ErrDescription() & @LF) Else Func _Sendmail() Dim $iMsgBoxAnswer $iMsgBoxAnswer = MsgBox(262208, "Success!", "Thank you.", 5) EndIf EndFunc ;==>_Enviarmail #Region UDF Functions ; The UDF ; #FUNCTION# ==================================================================================================================== ; Name ..........: _INetSmtpMailCom ; Description ...: ; Syntax ........: _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[, $bSSL = False[, $bIsHTMLBody = False[, $iDSNOptions = $g__cdoDSNDefault]]]]]]]]]]]]) ; Parameters ....: $s_SmtpServer - A string value. ; $s_FromName - A string value. ; $s_FromAddress - A string value. ; $s_ToAddress - A string value. ; $s_Subject - [optional] A string value. Default is "". ; $s_Body - [optional] A string value. Default is "". ; $s_AttachFiles - [optional] A string value. Default is "". ; $s_CcAddress - [optional] A string value. Default is "". ; $s_BccAddress - [optional] A string value. Default is "". ; $s_Importance - [optional] A string value. Default is "Normal". ; $s_Username - [optional] A string value. Default is "". ; $s_Password - [optional] A string value. Default is "". ; $IPPort - [optional] An integer value. Default is 25. ; $bSSL - [optional] A binary value. Default is False. ; $bIsHTMLBody - [optional] A binary value. Default is False. ; $iDSNOptions - [optional] An integer value. Default is $g__cdoDSNDefault. ; Return values .: None ; Author ........: Jos ; Modified ......: mLipok ; Remarks .......: ; Related .......: http://www.autoitscript.com/forum/topic/23860-smtp-mailer-that-supports-html-and-attachments/ ; Link ..........: http://www.autoitscript.com/forum/topic/167292-smtp-mailer-udf/ ; Example .......: Yes ; =============================================================================================================================== Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $bSSL = False, $bIsHTMLBody = False, $iDSNOptions = $g__cdoDSNDefault) ; init Error Handler _INetSmtpMailCom_ErrObjInit() Local $objEmail = ObjCreate("CDO.Message") If Not IsObj($objEmail) Then Return SetError($g__INetSmtpMailCom_ERROR_ObjectCreation, Dec(_INetSmtpMailCom_ErrHexNumber()), _INetSmtpMailCom_ErrDescription()) ; Clear previous Err information _INetSmtpMailCom_ErrHexNumber(0) _INetSmtpMailCom_ErrDescription('') _INetSmtpMailCom_ErrScriptLine('') $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>' $objEmail.To = $s_ToAddress If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress $objEmail.Subject = $s_Subject ; Select whether or not the content is sent as plain text or HTM If $bIsHTMLBody Then $objEmail.Textbody = $s_Body & @CRLF Else $objEmail.HTMLBody = $s_Body EndIf ; Add Attachments If $s_AttachFiles <> "" Then Local $S_Files2Attach = StringSplit($s_AttachFiles, ";") For $x = 1 To $S_Files2Attach[0] $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x]) 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) Return SetError($g__INetSmtpMailCom_ERROR_FileNotFound, 0, 0) EndIf Next EndIf ; Set Email Configuration $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = $g__cdoSendUsingPort $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") = $g__cdoBasic $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 $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = $bSSL ;Update Configuration 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 ; Set DSN options If $iDSNOptions <> $g__cdoDSNDefault And $iDSNOptions <> $g__cdoDSNNever Then $objEmail.DSNOptions = $iDSNOptions $objEmail.Fields.Item("urn:schemas:mailheader:disposition-notification-to") = $s_FromAddress ;~ $objEmail.Fields.Item("urn:schemas:mailheader:return-receipt-to") = $s_FromAddress EndIf ; Update Importance and Options fields $objEmail.Fields.Update ; Sent the Message $objEmail.Send If @error Then _INetSmtpMailCom_ErrObjCleanUp() Return SetError($g__INetSmtpMailCom_ERROR_Send, Dec(_INetSmtpMailCom_ErrHexNumber()), _INetSmtpMailCom_ErrDescription()) EndIf ; CleanUp $objEmail = "" _INetSmtpMailCom_ErrObjCleanUp() EndFunc ;==>_INetSmtpMailCom ; ; Com Error Handler Func _INetSmtpMailCom_ErrObjInit($bParam = Default) Local Static $oINetSmtpMailCom_Error = Default If $bParam == 'CleanUp' And $oINetSmtpMailCom_Error <> Default Then $oINetSmtpMailCom_Error = '' Return $oINetSmtpMailCom_Error EndIf If $oINetSmtpMailCom_Error = Default Then $oINetSmtpMailCom_Error = ObjEvent("AutoIt.Error", "_INetSmtpMailCom_ErrFunc") EndIf Return $oINetSmtpMailCom_Error EndFunc ;==>_INetSmtpMailCom_ErrObjInit Func _INetSmtpMailCom_ErrObjCleanUp() _INetSmtpMailCom_ErrObjInit('CleanUp') EndFunc ;==>_INetSmtpMailCom_ErrObjCleanUp Func _INetSmtpMailCom_ErrHexNumber($vData = Default) Local Static $vReturn = 0 If $vData <> Default Then $vReturn = $vData Return $vReturn EndFunc ;==>_INetSmtpMailCom_ErrHexNumber Func _INetSmtpMailCom_ErrDescription($sData = Default) Local Static $sReturn = '' If $sData <> Default Then $sReturn = $sData Return $sReturn EndFunc ;==>_INetSmtpMailCom_ErrDescription Func _INetSmtpMailCom_ErrScriptLine($iData = Default) Local Static $iReturn = '' If $iData <> Default Then $iReturn = $iData Return $iReturn EndFunc ;==>_INetSmtpMailCom_ErrScriptLine Func _INetSmtpMailCom_ErrFunc() _INetSmtpMailCom_ErrObjInit() _INetSmtpMailCom_ErrHexNumber(Hex(_INetSmtpMailCom_ErrObjInit().number, 8)) _INetSmtpMailCom_ErrDescription(StringStripWS(_INetSmtpMailCom_ErrObjInit().description, 3)) _INetSmtpMailCom_ErrScriptLine(_INetSmtpMailCom_ErrObjInit().ScriptLine) SetError(1) ; something to check for when this function returns Return EndFunc ;==>_INetSmtpMailCom_ErrFunc #EndRegion UDF Functions _Sendmail() Exit Case $Cancel Exit EndSwitch WEnd
FrancescoDiMuro Posted August 3, 2018 Posted August 3, 2018 @mattsk42 There are a lot of ways to do what you're trying to do. The first one, is select file per file with a FileOpenDialog(), and select the file(s) you want to attach to your email. Just dispose a button in your GUI, and everytime the user presses the button and select a file, add the path of the file to an array, which you have to attach here: Local $sAttachFiles = "" ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed Hope that helps Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette
mattsk42 Posted August 3, 2018 Author Posted August 3, 2018 I can create a thing that pops up a dialog to select a file with this (yes I know it's spelled wrong): Func atach() ; Create a constant variable in Local scope of the message to display in FileOpenDialog. Local Const $sMessage = "Select a single file of any type." ; Display an open dialog to select a file. Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "All (*.*)", $FD_FILEMUSTEXIST) If @error Then ; Display the error message. MsgBox($MB_SYSTEMMODAL, "", "No file was selected.") ; Change the working directory (@WorkingDir) back to the location of the script directory as FileOpenDialog sets it to the last accessed folder. FileChangeDir(@ScriptDir) Else ; Change the working directory (@WorkingDir) back to the location of the script directory as FileOpenDialog sets it to the last accessed folder. FileChangeDir(@ScriptDir) ; Replace instances of "|" with @CRLF in the string returned by FileOpenDialog. $sFileOpenDialog = StringReplace($sFileOpenDialog, "|", @CRLF) EndIf EndFunc ;==>atach And then I have this new button: $Attachments = GUICtrlCreateButton("Attachments", 170, 230, 75, 25) 1. How do I make that button open the file open dialog? 2. How do I combine the two so that it fills in what I attached INTO the line: Local $sAttachFiles = _______
FrancescoDiMuro Posted August 4, 2018 Posted August 4, 2018 @mattsk42 As I have said, there are several ways to do it Here it is a little hint for you: expandcollapse popup#include <Array.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) #Region ### START Koda GUI section ### Form= Global $frmSelectFiles = GUICreate("frmSelectFiles", 384, 249, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "ExitApplication") Global $btnAddFile = GUICtrlCreateButton("Add", 10, 16, 75, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetOnEvent(-1, "AddFile") $btnRemoveFile = GUICtrlCreateButton("Remove", 89, 16, 75, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetOnEvent(-1, "RemoveFile") $btnDisplayFiles = GUICtrlCreateButton("Display", 169, 16, 75, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetOnEvent(-1, "DisplayFiles") Global $lbFiles = GUICtrlCreateList("", 10, 48, 369, 188) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 Sleep(100) WEnd Func ExitApplication() Exit EndFunc Func AddFile() Local $strFilePath = FileOpenDialog("Select file:", @ScriptDir, "All files (*.*)") If @error = 1 Then ConsoleWrite("No file(s) selected." & @CRLF) ElseIf @error > 1 Then ConsoleWrite("Error while displaying the FileOpenDialog box. Error: " & @error & @CRLF) Else _GUICtrlListBox_AddString($lbFiles, $strFilePath) If @error Then ConsoleWrite("Error while adding the file '" & $strFilePath & "'. Error: " & @error & @CRLF) Else ConsoleWrite("File '" & $strFilePath & "' added correctly." & @CRLF) EndIf EndIf EndFunc Func RemoveFile() Local $intItemIndex = _GUICtrlListBox_GetCurSel($lbFiles) If @error Then ConsoleWrite("Error while getting the current selected Item index in the ListBox. Error: " & @error & @CRLF) Else _GUICtrlListBox_DeleteString($lbFiles, $intItemIndex) If @error Then ConsoleWrite("Error while deleting the Item at the index " & $intItemIndex & " in the ListBox. Error: " & @error & @CRLF) Else ConsoleWrite("Item with index " & $intItemIndex & " deleted correctly from the ListBox." & @CRLF) EndIf EndIf EndFunc Func DisplayFiles() Local $intItemCount, _ $arrFiles[1], _ $strFiles = "" $intItemCount = _GUICtrlListBox_GetCount($lbFiles) If @error Then ConsoleWrite("Error while getting the count of the Items in the ListBox. Error: " & @error & @CRLF) Else For $i = 0 To $intItemCount - 1 $arrFiles[$i] = _GUICtrlListBox_GetText($lbFiles, $i) If @error Then ConsoleWrite("Error while getting the text of the Item with index " & $i & ". Error: " & @error & @CRLF) Else ReDim $arrFiles[UBound($arrFiles) + 1] EndIf Next ReDim $arrFiles[UBound($arrFiles) - 1] EndIf _ArrayDisplay($arrFiles, "From the ListBox:") $strFiles = _ArrayToString($arrFiles, ";") If @error Then ConsoleWrite("Error while converting the array to string. Error: " & @error & @CRLF) Else ConsoleWrite("Here it is the string containing all the files you want to attach: " & @CRLF & _ $strFiles & @CRLF) EndIf EndFunc Just study it and have fun Best Regards. Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette
mattsk42 Posted August 6, 2018 Author Posted August 6, 2018 I think....I got this close. I can pull up my script, click attach and it pops up the screen, attach the file, but then when I click Submit, I get this error: $SFiles2Attach[$x]=_PathFull($S_Files2Attach[$x]_PathFull Error Unknown function name. (_PathFull) Here's what I have added: Global $frmSelectFiles = GUICreate("frmSelectFiles", 384, 249, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "ExitApplication") Global $btnAddFile = GUICtrlCreateButton("Add", 10, 16, 75, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetOnEvent(-1, "AddFile") $btnRemoveFile = GUICtrlCreateButton("Remove", 89, 16, 75, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetOnEvent(-1, "RemoveFile") $btnDisplayFiles = GUICtrlCreateButton("Display", 169, 16, 75, 25) GUICtrlSetFont(-1, 10, 800, 0, "Arial") GUICtrlSetOnEvent(-1, "DisplayFiles") Global $lbFiles = GUICtrlCreateList("", 10, 48, 369, 188) GUISetState(@SW_SHOW) <code> Case $Attachments Local $strFilePath = FileOpenDialog("Select file:", @ScriptDir, "All files (*.*)") If @error = 1 Then ConsoleWrite("No file(s) selected." & @CRLF) ElseIf @error > 1 Then ConsoleWrite("Error while displaying the FileOpenDialog box. Error: " & @error & @CRLF) Else _GUICtrlListBox_AddString($lbFiles, $strFilePath) If @error Then ConsoleWrite("Error while adding the file '" & $strFilePath & "'. Error: " & @error & @CRLF) Else ConsoleWrite("File '" & $strFilePath & "' added correctly." & @CRLF) EndIf Error is somewhere in the original script here: ; Add Attachments If $s_AttachFiles <> "" Then Local $S_Files2Attach = StringSplit($s_AttachFiles, ";") For $x = 1 To $S_Files2Attach[0] $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x]) 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) Return SetError($g__INetSmtpMailCom_ERROR_FileNotFound, 0, 0) EndIf Next EndIf
FrancescoDiMuro Posted August 6, 2018 Posted August 6, 2018 @milkmoron Did you add the "File.au3" library? This one: #include <File.au3> mattsk42 1 Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette
mattsk42 Posted August 6, 2018 Author Posted August 6, 2018 Wow that's it! Thank you. FrancescoDiMuro 1
FrancescoDiMuro Posted August 7, 2018 Posted August 7, 2018 Happy to have helped mattsk42 1 Click here to see my signature: Spoiler ALWAYS GOOD TO READ: Forum Rules Forum Etiquette
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now