Problem mit E-Mail Skript

  • Hallo Freunde

    Ich habe schon wieder ein Problem mit einem Skript. Die zwei Skripte Test.au3 und SMTP Mailer.au3 sind auch im Anhang. Hier einmal der Code.

    Zuerst die Test.au3.

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.4.0
    Author: myName
    Version: 1.0.0
    Date: theDate

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #include "C:\Programmieren\AutoIt\SMTP Mailer.au3"

    [/autoit] [autoit][/autoit] [autoit]

    BlockInput(1)

    [/autoit] [autoit][/autoit] [autoit]

    $SmtpServer = "asmtp.mail.xxx.ch" ; address for the smtp-server to use - REQUIRED
    $FromName = "Test" ; name from who the email was sent
    $FromAddress = "test@test.net" ; address from where the mail should come
    $ToAddress = "test@test.net" ; destination address of the email - REQUIRED
    $Subject = "Test" ; subject from the email - can be anything you want it to be
    $Body = "" ; the messagebody from the mail - can be left blank but then you get a blank mail
    $AttachFiles = "" ; the file you want to attach- 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 = "test@test.net" ; username for the account used from where the mail gets sent - REQUIRED
    $Password = "test" ; password for the account used from where the mail gets sent - REQUIRED
    $IPPort = 25 ; 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

    [/autoit] [autoit][/autoit] [autoit]

    $Body = "Test1"
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error = 1 Then
    $Body = "Test2"
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then
    For $i = 5 to 1 Step -1
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If Not @error Then
    ExitLoop
    EndIf
    Sleep(30000)
    Next
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    BlockInput(0)

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]


    Hier die SMTP Mailer.au3.

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.4.0
    Author: Jos (http://www.autoitscript.com/forum/index.php?showtopic=23860)
    Version: 1.0.0
    Date: 24.02.2010

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #include-once
    #Include<file.au3>

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit] [autoit][/autoit] [autoit]

    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(62) : $S_Files2Attach = ' & $S_Files2Attach & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
    If FileExists($S_Files2Attach[$x]) Then
    $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

    [/autoit]


    Ich habe bei der Test.au3 natürlich die richtigen Daten meines SMTP Servers eingetragen. Mein Problem liegt in der if @error Abfrage in der Test.au3. Wenn ich diese Abfrage weglasse, funktioniert es, ansonsten aber nicht. Wenn ich die If @error = 1 Then Abfrage im Skript habe, dann hängt sich das Skript auf, also es wird pausiert. Mit der If @error = 1 Then Abfrage wollte ich erreichen, dass das E-Mail 5x versucht wird zu senden, falls das erste Mal fehlschlägt.

    Was habe ich falsch gemacht? @error wird ja von der SMTP Mailer.au3 auf 1 gesetzt, wenn ein Fehler auftritt, oder?

  • Moin,

    [autoit]

    If @error = 1 Then

    [/autoit]


    So gibst du @error einen Wert in der If-Abfrage ;)

    Probier es lieber mal so:

    [autoit]

    If @error == 1 Then

    [/autoit]

    Lg, Fabian

  • Jupi jetzt läufts. Vielen Dank.

    If @error Then... würde auch funktionieren, oder?

    Ich habe noch eine kleine Frage und zwar zu folgendem

    [autoit]

    If @error == 1 Then
    $Body = "Test2"
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If @error Then
    For $i = 5 to 1 Step -1
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    If Not @error Then
    ExitLoop
    EndIf
    Sleep(30000)
    Next
    EndIf
    EndIf

    [/autoit]

    Wenn jetzt @error==1 ist dann wird ja noch einmal versucht zu senden. Wenn das senden dann klappt, wird dann @error=0 gesetzt? Ansonsten würde ja bei der inneren If Abfrage die For Schleife 5 Mal ausgeführt und auch nie verlassen da Not @error nie zutrifft und ich würde etwa 6 Mails bekommen, obwohl es beim zweiten oder dritten Versucht bereits geklappt hat.

    Oder anderst gefragt, was ist der Rückgabewert der Funktion INetSmtpMailCom(...)? Bei Fehler @error=1 und bei keinem Fehler @error=0? Werde aus der SMTP Mailer.au3 nicht so schlau.

    Einmal editiert, zuletzt von Helveticus (22. Mai 2010 um 13:16)


  • If @error Then... würde auch funktionieren, oder?

    Then wird einfach immer ausgeführt, wenn @error nicht 0 ist.


    Wenn jetzt @error==1 ist dann wird ja noch einmal versucht zu senden. Wenn das senden dann klappt, wird dann @error=0 gesetzt? Ansonsten würde ja bei der inneren If Abfrage die For Schleife 5 Mal ausgeführt und auch nie verlassen da Not @error nie zutrifft und ich würde etwa 6 Mails bekommen, obwohl es beim zweiten oder dritten Versucht bereits geklappt hat.

    Oder anderst gefragt, was ist der Rückgabewert der Funktion INetSmtpMailCom(...)? Bei Fehler @error=1 und bei keinem Fehler @error=0? Werde aus der SMTP Mailer.au3 nicht so schlau.

    Nein @error wird bei jedem Aufruf auf 0 gesetzt.
    Und so wie ich SMPT Mailer.au3 verstehe steht Error 2 für nicht erfolgreiches Senden und @error 1 für COM Error handle ;)

  • Hallo Helveticus,

    Zitat von Hilfe

    COM-Erweiterungen mit AutoIt
    Eine kurze Einführung

    Was ist COM?
    COM steht für "Component Object Model" und bezeichnet Microsofts Weg, Software über eine gemeinsame Schnittstelle miteinander zu verbinden. Die Interfaces sind in einem COM-Objekt definiert.

    mfg (Auto)Bert

  • VIelen Dank Bert.

    Ich habe noch eine Frage. Bei z.B. RunAs steht beim Rückgabewert für Fehler "Gibt 0 zurück und setzt @error auf ungleich Null.". Heisst das, dass @error auf 1 gesetzt wird?