AutoIT send E-mail error

时间:2016-08-31 18:07:01

标签: email syntax-error autoit

I am trying to find the errors in the following code. The function "_Mail" works perfectly if it's a separate script but as soon as I put it into a function the errors are showing up.

Please tell me how I can fix the code and where the errors stick or submit the corrected phrases.

#Include <file.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

;GUI
$Form1 = GUICreate("Form1", 317, 168, -1, -1)
$Label = GUICtrlCreateLabel("Label", 32, 8, 253, 29)
GUICtrlSetFont(-1, 15, 800, 4, "MS Sans Serif")
$Input1 = GUICtrlCreateInput("Input1", 68, 48, 185, 24)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Input2 = GUICtrlCreateInput("Input2", 68, 80, 185, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_PASSWORD))
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Button = GUICtrlCreateButton("Button", 102, 120, 113, 33)
GUISetState(@SW_SHOW)
;GUIend

Func _Mail()
   ;##################################
   ; Variables
   ;##################################
   $SmtpServer = "smtp.email.com"              ; address for the smtp-server to use - REQUIRED
   $FromName = "Name"                      ; name from who the email was sent
   $FromAddress = "From@email.com" ; address from where the mail should come
   $ToAddress = "To@email.com"   ; destination address of the email - REQUIRED
   $Subject = "TEST"                   ; subject from the email - can be anything you want it to be
   $Body = "TEST TEST TEST"                              ; the messagebody from the mail - can be left blank but then you get a blank mail
   $AttachFiles = ""                       ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
   $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 = "From@email.com"                    ; 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 = 465                            ; port used for sending the mail
   $ssl = 1                                ; enables/disables secure socket layer sending - put to 1 if using httpS
   ;~ $IPPort=465                          ; GMAIL port used for sending the mail
   ;~ $ssl=1                               ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS

   ;##################################
   ; Script
   ;##################################
   Global $oMyRet[2]
   Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
   $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
   If @error Then
       MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
   EndIf
   ;
   ; The UDF
   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
   ;
   ;
   ; Com Error Handler
   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
EndFunc

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $Button
            _Mail()
    EndSwitch
WEnd

1 个答案:

答案 0 :(得分:0)

在AutoIt中你无法在函数内声明函数! 您的脚本应如下所示:

#Include <file.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>

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

;GUI
$Form1 = GUICreate("Form1", 317, 168, -1, -1)
$Label = GUICtrlCreateLabel("Label", 32, 8, 253, 29)
GUICtrlSetFont(-1, 15, 800, 4, "MS Sans Serif")
$Input1 = GUICtrlCreateInput("Input1", 68, 48, 185, 24)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Input2 = GUICtrlCreateInput("Input2", 68, 80, 185, 24, BitOR($GUI_SS_DEFAULT_INPUT,$ES_PASSWORD))
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Button = GUICtrlCreateButton("Button", 102, 120, 113, 33)
GUISetState(@SW_SHOW)
;GUIend

While 1
   $nMsg = GUIGetMsg()
   Switch $nMsg
         Case $GUI_EVENT_CLOSE
            Exit
         Case $Button
            _Mail()
    EndSwitch
WEnd


Func _Mail()
   ;##################################
   ; Variables
   ;##################################
   Local $SmtpServer = "smtp.email.com"              ; address for the smtp-server to use - REQUIRED
   Local $FromName = "Name"                      ; name from who the email was sent
   Local $FromAddress = "From@email.com" ; address from where the mail should come
   Local $ToAddress = "To@email.com"   ; destination address of the email - REQUIRED
   Local $Subject = "TEST"                   ; subject from the email - can be anything you want it to be
   Local $Body = "TEST TEST TEST"                              ; the messagebody from the mail - can be left blank but then you get a blank mail
   Local $AttachFiles = ""                       ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
   Local $CcAddress = ""       ; address for cc - leave blank if not needed
   Local $BccAddress = ""     ; address for bcc - leave blank if not needed
   Local $Importance = "Normal"                  ; Send message priority: "High", "Normal", "Low"
   Local $Username = "From@email.com"                    ; username for the account used from where the mail gets sent - REQUIRED
   Local $Password = "Password"                  ; password for the account used from where the mail gets sent - REQUIRED
   Local $IPPort = 465                            ; port used for sending the mail
   Local $ssl = 1                                ; enables/disables secure socket layer sending - put to 1 if using httpS
   ;~ $IPPort=465                          ; GMAIL port used for sending the mail
   ;~ $ssl=1                               ; GMAILenables/disables secure socket layer sending - put to 1 if using httpS

   ;##################################
   ; Script
   ;##################################
   $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
   If @error Then
       MsgBox(0, "Error sending message", "Error code:" & @error & "  Description:" & $rc)
   EndIf
EndFunc

; The UDF
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
;
;
; Com Error Handler
Func MyErrFunc()
   Local $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