Jump to content

Make button to attach files to email script


Recommended Posts

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):

;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

 

Link to comment
Share on other sites

@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:

 

Link to comment
Share on other sites

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 = _______

 

Link to comment
Share on other sites

@mattsk42
As I have said, there are several ways to do it :)
Here it is a little hint for you:

#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:

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...