Mail-UDF / Variablenübergabe per $CmdLine oder .ini

  • Hallo Leute :D

    Ich bin gerade dabei, für mich ein kleines Backup-Programm zu schreiben, welches mit Hilfe von robocopy Files kopiert. Nun, jedesmal wenn ein Backup fehler produziert, werden diese von Robocopy, oder auch von meiner eigenen .exe in ein Log-File geschrieben, welches ich mir sehr gerne aufs Mail legen würde, damit ich die Logfiles nicht immer selbst anschauen (und suchen) muss.

    Ich habe dazu folgende Mail-UDF genommen (,welche schon im 2007 zu viel Gesprächsstoff geführt hatte):
    http://www.autoitscript.com/forum/topic/23…nd-attachments/

    Es gab auch schon mehrere Threads zu dieser UDF, wie dieser hier: [ gelöst ] Email Senden
    Leider half mir dieser auch nicht weiter..

    Original-UDF:

    [autoit]

    $SmtpServer = "smtp-server.provider.tld" ; address for the smtp-server to use - REQUIRED
    $FromName = "Test" ; name from who the email was sent
    $FromAddress = "mail@mail.ch" ; address from where the mail should come
    $ToAddress = "mail@mail.ch" ; destination address of the email - REQUIRED
    $Subject = "Userinfo" ; subject from the email - can be anything you want it to be
    $Body = "This Is The 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 = "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

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

    ;~ $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")
    MsgBox(0, "", $SmtpServer & @CRLF & $FromName & @CRLF & $FromAddress & @CRLF & $ToAddress & @CRLF & $Subject & @CRLF & $Body & @CRLF & $AttachFiles & @CRLF & $CcAddress & @CRLF & $BccAddress & @CRLF & $Username & @CRLF & $Password & @CRLF & $IPPort & @CRLF & $ssl)
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    ;~ MsgBox(0, "", $rc)
    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(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]

    Nun, wenn ich diese UDF in einem Script (oder auch kompiliert) verwende, funktioniert alles super (ich habe meine Maildaten natürlich nicht hier posten wollen).
    Wenn ich aber die E-Mail-Variablen per IniRead() einlese, dann kommt der Fehler Nummer 2: Der Transport konnte keine Verbindung zum Server herstellen:

    [autoit]

    $mailsettings = @ScriptDir & "\mailsettings.ini"
    $SmtpServer = IniRead($mailsettings, 'EMailSettings', 'SmtpServer', 'KeyNotFound')
    $FromName = IniRead($mailsettings, 'EMailSettings', 'FromName', 'KeyNotFound')
    $FromAddress = IniRead($mailsettings, 'EMailSettings', 'FromAddress', 'KeyNotFound')
    $ToAddress = IniRead($mailsettings, 'EMailSettings', 'ToAddress', 'KeyNotFound')
    $Subject = IniRead($mailsettings, 'EMailSettings', 'Subject', 'KeyNotFound')
    $Body = IniRead($mailsettings, 'EMailSettings', 'Body', 'KeyNotFound')
    $AttachFiles = IniRead($mailsettings, 'EMailSettings', 'AttachFiles', 'KeyNotFound')
    $CcAddress = IniRead($mailsettings, 'EMailSettings', 'CcAddress', 'KeyNotFound')
    $BccAddress = IniRead($mailsettings, 'EMailSettings', 'BccAddress', 'KeyNotFound')
    $Importance = IniRead($mailsettings, 'EMailSettings', 'Importance', 'KeyNotFound')
    $Username = IniRead($mailsettings, 'EMailSettings', 'Username', 'KeyNotFound')
    $Password = IniRead($mailsettings, 'EMailSettings', 'Password', 'KeyNotFound')
    $IPPort = IniRead($mailsettings, 'EMailSettings', 'IPPort', 'KeyNotFound')
    $ssl = IniRead($mailsettings, 'EMailSettings', 'ssl', 'KeyNotFound')

    [/autoit]

    Ich habe diese Variablen überprüft und sie werden eins zu eins richtig übergeben, aber es entsteht dieser Fehler.
    Ich stehe ziemlich auf dem Schlauch mit diesem Problem und hoffe, dass Ihr bessere Ideen habt als ich. :)

    Schlussendlich sollte es eine mail.exe geben, welcher ich bestimmte Parameter per $CmdLine übergeben kann (Der Body, das AttachFile und das Subject sollten schlussendlich per $CmdLine kommen, der Rest aus der Ini)

    Ich bedanke mich schonmal für eure Hilfe und hoffe, dass ich euch mit dem doch inzwischen ziemlich alten Problem nicht zu sehr nerve. :)

    Einmal editiert, zuletzt von TheSystemAlien (22. Oktober 2012 um 13:31)

  • Danke für die schnelle Hilfe...

    Das gesamte Script:

    Spoiler anzeigen
    [autoit]

    ;
    ;##################################
    ; Include
    ;##################################
    #Include<file.au3>
    ;##################################
    ; Variables
    ;##################################

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

    $mailsettings = @ScriptDir & "\mailsettings.ini"

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

    $SmtpServer = IniRead($mailsettings, 'EMailSettings', 'SmtpServer', 'KeyNotFound')
    $FromName = IniRead($mailsettings, 'EMailSettings', 'FromName', 'KeyNotFound')
    $FromAddress = IniRead($mailsettings, 'EMailSettings', 'FromAddress', 'KeyNotFound')
    $ToAddress = IniRead($mailsettings, 'EMailSettings', 'ToAddress', 'KeyNotFound')
    $Subject = IniRead($mailsettings, 'EMailSettings', 'Subject', 'KeyNotFound')
    $Body = IniRead($mailsettings, 'EMailSettings', 'Body', 'KeyNotFound')
    $AttachFiles = IniRead($mailsettings, 'EMailSettings', 'AttachFiles', 'KeyNotFound')
    $CcAddress = IniRead($mailsettings, 'EMailSettings', 'CcAddress', 'KeyNotFound')
    $BccAddress = IniRead($mailsettings, 'EMailSettings', 'BccAddress', 'KeyNotFound')
    $Importance = IniRead($mailsettings, 'EMailSettings', 'Importance', 'KeyNotFound')
    $Username = IniRead($mailsettings, 'EMailSettings', 'Username', 'KeyNotFound')
    $Password = IniRead($mailsettings, 'EMailSettings', 'Password', 'KeyNotFound')
    $IPPort = IniRead($mailsettings, 'EMailSettings', 'IPPort', 'KeyNotFound')
    $ssl = IniRead($mailsettings, 'EMailSettings', 'ssl', 'KeyNotFound')

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

    ;~ $SmtpServer = "smtp-server.provider.tld" ; address for the smtp-server to use - REQUIRED
    ;~ $FromName = "Test" ; name from who the email was sent
    ;~ $FromAddress = "mail@mail.ch" ; address from where the mail should come
    ;~ $ToAddress = "mail@mail.ch" ; destination address of the email - REQUIRED
    ;~ $Subject = "Userinfo" ; subject from the email - can be anything you want it to be
    ;~ $Body = "This Is The 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 = "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

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

    ;~ $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]

    ;##################################
    ; Script
    ;##################################
    Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
    ;~ MsgBox(0, "", $SmtpServer & @CRLF & $FromName & @CRLF & $FromAddress & @CRLF & $ToAddress & @CRLF & $Subject & @CRLF & $Body & @CRLF & $AttachFiles & @CRLF & $CcAddress & @CRLF & $BccAddress & @CRLF & $Username & @CRLF & $Password & @CRLF & $IPPort & @CRLF & $ssl)
    $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
    ;~ MsgBox(0, "", $rc)
    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(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]

    Inhalt der .INI:

    Spoiler anzeigen

    [EMailSettings]
    SmtpServer = smtp-server.provider.tld
    FromName = Armon Oswald
    FromAddress = donotreply@mail.ch
    ToAddress = mail@mail.ch
    Subject = Backupblabla
    Body = ThisIsTheBody
    AttachFiles =
    CcAddress =
    BccAddress =
    Importance = Normal
    Username = popusername
    Password = pop_password
    IPPort = 25
    ssl = 0

    Wie vorhin sind meine E-Mail-Daten zensiert.. Die Mail-Einstellungen sollten jedoch nicht so eine grosse Rolle spielen. Das Problem sollte meiner Meinung nach wo anders liegen... nur wo ist die gute frage :(
    Und wie gesagt, schlussendlich müssten dann die Variablen wie folgt aussehen (wegen der Kommandozeilenübergabe):

    Spoiler anzeigen
    [autoit]

    $mailsettings = @ScriptDir & "\mailsettings.ini"

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

    $SmtpServer = IniRead($mailsettings, 'EMailSettings', 'SmtpServer', 'KeyNotFound')
    $FromName = IniRead($mailsettings, 'EMailSettings', 'FromName', 'KeyNotFound')
    $FromAddress = IniRead($mailsettings, 'EMailSettings', 'FromAddress', 'KeyNotFound')
    $ToAddress = IniRead($mailsettings, 'EMailSettings', 'ToAddress', 'KeyNotFound')
    $Subject = $CmdLine[1]
    $Body = $CmdLine[2]
    $AttachFiles = $CmdLine[3]
    $CcAddress = IniRead($mailsettings, 'EMailSettings', 'CcAddress', 'KeyNotFound')
    $BccAddress = IniRead($mailsettings, 'EMailSettings', 'BccAddress', 'KeyNotFound')
    $Importance = IniRead($mailsettings, 'EMailSettings', 'Importance', 'KeyNotFound')
    $Username = IniRead($mailsettings, 'EMailSettings', 'Username', 'KeyNotFound')
    $Password = IniRead($mailsettings, 'EMailSettings', 'Password', 'KeyNotFound')
    $IPPort = IniRead($mailsettings, 'EMailSettings', 'IPPort', 'KeyNotFound')
    $ssl = IniRead($mailsettings, 'EMailSettings', 'ssl', 'KeyNotFound')

    [/autoit]
  • Hallp TheSystemAlien,

    ändere die beden Zeilen beim lesen aus der Ini für Port und SSL zu:

    [autoit]

    $IPPort = Int(IniRead($mailsettings, 'EMailSettings', 'IPPort', 25))
    $ssl = Int(IniRead($mailsettings, 'EMailSettings', 'ssl', 0))

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

    mit korrekten Zugangsdaten klappt es dann

    mfg autoBert