Gui mit Inputboxen für Email Script - Problem

  • Hi,

    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>

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

    #Region ### START Koda GUI section ### Form=
    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    $Form1 = GUICreate("form1", 242, 297, 193, 125)
    $smtp = GUICtrlCreateInput("smtp", 40, 48, 161, 21)
    $name = GUICtrlCreateInput("name", 40, 72, 161, 21)
    $absenderemail = GUICtrlCreateInput("absendermail", 40, 96, 161, 21)
    $adresse = GUICtrlCreateInput("adresse", 40, 120, 161, 21)
    $betreff = GUICtrlCreateInput("betreff", 40, 144, 161, 21)
    $txt = GUICtrlCreateInput("text", 40, 168, 161, 21)
    $ok = GUICtrlCreateButton("Email senden", 40, 240, 161, 41, 0)

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

    GUICtrlSetOnEvent($ok, "senden")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    WEnd

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

    $smtp = ""
    $s_SmtpServer = $smtp
    $name = ""
    $s_FromName = $name
    $absenderemail = ""
    $s_FromAddress = $absenderemail
    $adresse = ""
    $s_ToAddress = $adresse
    $betreff = ""
    $s_Subject = $betreff
    Dim $as_Body[2] ;
    $txt = ""
    $as_Body[0] = $txt
    $as_Body[1] = $txt

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

    func senden()
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    EndFunc

    [/autoit]

    Ich bekomme ganze Zeit einen Fehler angezeigt: Variable used without being declared.:
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    _INetSmtpMail (^ ERROR

    Ich verstehs nicht, Variable ist doch deklariert?!

    MFG

    D.

    Einmal editiert, zuletzt von Desaster (31. August 2008 um 15:52)

  • Hallo.

    Übernehme mal die Variablen aus der Funktion in das GUI.
    Dazu kommt, das dazu gerade in den letzten Tagen bereits ausführlich
    gesprochen wurde und Du 100%-ig dazu etwas über die Suchfunktion
    findest.
    Aber ich gehe davon aus, das Du ( @Desaster) noch gar nicht diese
    entdeckt hast, aber die gibt es hier rechts oben.

    Gruss, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl


  • Übernehme mal die Variablen aus der Funktion in das GUI.

    Hö ? Was soll das denn heißen ?

    Naja, lass dich von der nicht verrückt machen,
    die andern Topics hatten nämlich nichts mit deinem Script hier zu tun.
    Außer dass es auch ums E-Mail-Senden ging.

    Bei dir gibt es aber ein anderes Problem.
    Du hast die Variablen zwar deklariert, allerdings außerhalb der Funktion, in
    der die Mail-Funktion aufgerufen wird. Dort verlieren sie ihren 'scope', ihren
    Wirkungsbereich, dort sind sie nicht mehr zuständig. Außer du deklariest sie
    als Global.
    Ach, und "$s_SmtpServer = $smtp" ist wahrscheinlich das, was Crazy-A meinte.
    Das geht so nicht, so ist $s_SmtpServer nur gleich der ID des Inputs.
    Um den Wert zu übernehmen brauchst du GuiCtrlRead.

    So sollte es gehen:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>

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

    #Region ### START Koda GUI section ### Form=
    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    $Form1 = GUICreate("form1", 242, 297, 193, 125)
    $smtp = GUICtrlCreateInput("smtp", 40, 48, 161, 21)
    $name = GUICtrlCreateInput("name", 40, 72, 161, 21)
    $absenderemail = GUICtrlCreateInput("absendermail", 40, 96, 161, 21)
    $adresse = GUICtrlCreateInput("adresse", 40, 120, 161, 21)
    $betreff = GUICtrlCreateInput("betreff", 40, 144, 161, 21)
    $txt = GUICtrlCreateInput("text", 40, 168, 161, 21)
    $ok = GUICtrlCreateButton("Email senden", 40, 240, 161, 41, 0)

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

    GUICtrlSetOnEvent($ok, "senden")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    WEnd

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

    func senden()
    $s_SmtpServer = GUICtrlRead( $smtp )
    $s_FromName = GUICtrlRead( $name )
    $s_FromAddress = GUICtrlRead( $absenderemail )
    $s_ToAddress = GUICtrlRead( $adresse )
    $s_Subject = GUICtrlRead( $betreff )
    ;Dim $as_Body[2]
    ;$as_Body[0]
    ;$as_Body[1]
    $as_Body = GUICtrlRead( $txt )
    _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    EndFunc

    [/autoit]

    Wenn es Fehler beim Senden der Mail geben sollte: ForenSuche, denn dazu gibt es einige
    Topics mehr ;)

    mfg limette

    Edit:
    @Crazy-A:
    Vielleicht solltest du dir einen Post auch mal durchlesen.
    Denn nur weil im Thema das Wort "E-Mail Script" vorkommt, heißt das noch lange nicht,
    dass der Fehler auch da liegt. Hättest du dir den Code kurz angeguckt
    hättest du auch gesehen, dass sein Fehler in der Deklaration & Wertzuweisung lag.
    Folglich hat das nichts mit den anderen Topics zu tun, in denen es um fehlgeschlagene
    Mailsendungen geht. In diesem Fall hätte ein kleiner Hinweis auf den Wirkungsbereich
    von Variablen deinerseits auch gereicht, man muss nicht auf alles gleich den
    "Lies die Hilfe, surf durchs Forum !"-Stempel drücken.

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    Einmal editiert, zuletzt von limette (31. August 2008 um 11:59)

  • Die übertreiben das mit der Suchfunktion viel zu sehr -.-

    Also, hatte mich auch lange damit beschäftigt email zu senden. Doch das hat mit der Funktion die du nimmst nie geklappt.Probiers mal mit der hier die funktioniert zu 100% =)

    Spoiler anzeigen
    [autoit]

    #include<file.au3>
    Global $oMyRet[2]
    Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")

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

    $rc = _INetSmtpMailCom('', "", "", "", "", "Test <b>Ich habs geschafft!</b>", "", "","", "", "")
    If @error then
    msgbox(0,"Error sending message","Error code:" & @error & " Description:" & $rc)
    EndIf

    [/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_Username = "", $s_Password = "")
    $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.Cc = $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])
    If FileExists($S_Files2Attach[$x]) Then
    $objEmail.AddAttachment ($S_Files2Attach[$x])
    Else
    $i_Error_desciption = $i_Error_desciption & @lf & 'File not found to attach: ' & $S_Files2Attach[$x]
    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
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    ;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
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Sent the Message
    $objEmail.Send
    if @error then
    SetError(2)
    return $oMyRet[1]
    EndIf
    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]

    Edit: Ja ich weis das, das nicht die frage war, aber mit der Funktion kann er keine email z.B. an https://autoit.de/www.web.de schreiben.

    Einmal editiert, zuletzt von Greek (31. August 2008 um 13:11)

  • Jo, seine Probleme von "undeclared variable" lagen aber halt nicht an der
    Mail-Funktion :rolleyes:

    _InetSendSmtpMailCom findet mal allerdings auch
    mit der Forensuche... ;)
    Aber danach war halt nicht gefragt.

    mfg limette =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    • Offizieller Beitrag


    Du hast die Variablen zwar deklariert, allerdings außerhalb der Funktion, in
    der die Mail-Funktion aufgerufen wird. Dort verlieren sie ihren 'scope', ihren
    Wirkungsbereich, dort sind sie nicht mehr zuständig. Außer du deklariest sie
    als Global.

    Diese Aussage ist falsch!
    Variablen, die im Hauptprogramm deklariert werden, sind (in AutoIt) automatisch global.
    Zitat aus der Hilfe: "A variable's scope is controlled by when and how you declare the variable. If you declare a variable at the start of your script and outside any functions it exists in the Global scope and can be read or changed from anywhere in the script."

    Sein Problem besteht eher darin, dass er den Variablen Leerstrings übergeben hat.

  • Oh .... :whistling:
    Hab ich mich wohl vertan ^^
    Seit wann ist das so ?
    Ich dachte die Variablen im Main-Prog währen auch nur da verfügbar,..
    habe oft das Problem, dass ich auf Variablen, die im Main-Prog deklariert & definiert
    wurden in Funktionen nur zugreifen kann, wenn ich sie vorher als Global
    deklariert habe.
    Hm.. :rolleyes:
    Man lernt nie aus...

    ..
    MOMENT ...

    Zitat

    Ich bekomme ganze Zeit einen Fehler angezeigt: Variable used without being declared.:


    dann hatte ich doch Recht, oder ?! oO

    mfg limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Hm, du hast Recht. Wäre auch zu schön gewesen wenn nicht ;)

    Aber wie kommt es bei ihm dann zu dem Fehler von wegen 'undeclared variable' ?
    Ich meine, die Variable wurde deklariert, ob sie nun einen Wert hat oder nur ein
    leerer String ist ist doch total egal ?!

    limette

    Edit: ACH ... er hat die zum Zeitpunkt des Funktionsaufrufs ja noch garnicht deklariert,
    das folgt ja erst, wenn er aus der While-Schleife raus ist, aber da geht er ja nicht raus.
    Naja, aber meine Version mit den Variablen in der Funktion müsste passen ;)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    • Offizieller Beitrag

    Ach, ich sehe gerade, dass er Opt("GUIOnEventMode", 1) und GUIGetMsg() verwendet.

    Das ist so nicht erlaubt! Ersetze das GUIGetMsg() durch Sleep(100).

    Außerdem (und das ist der Grund für die Fehlermeldung) müssen die Variablen vor der While...WEnd-Schleife deklariert werden, weil das Script sonst gar nicht bis zu diesen Zeilen kommt und sie somit eben nicht deklariert sind.

  • Ist aber auch nur Suboptimal, dann sind
    sie zwar deklariert, haben aber bei Funktionsaufruf
    keinen Wert -->also: Werte in der Funktion zuweisen.
    Wie ich schon sagte :D
    Dann kann man sich auch das Deklarieren vorweg
    sparen und hat dann die Variablen eben nur Lokal in
    der Funktion (oder vertu ich mich jz wieder ?);
    --> können im Main-Prog nicht stören ^^

    limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

  • Zitat

    Man sollte sich angewöhnen, Variablen IMMER im entsprechenden Namespace zu deklarieren.


    Ist von Vorteil, klar =)
    Damit meinst du doch "Variablen immer da deklarieren, wo sie benötigt werden", oder ?
    Kenn mich da noch nicht so aus ^^
    Meine aber mal gelesen zu haben, dass man Variablen so spät wie möglich deklarieren soll..

    limette =)

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.

    • Offizieller Beitrag

    Meine aber mal gelesen zu haben, dass man Variablen so spät wie möglich deklarieren soll.

    Und wozu soll das gut sein?

    Ich habe es mir angewöhnt globale Variablen nur im Hauptprogramm zu deklarieren und Lokale entsprechend in den Funktionen (logisch!) und dort jeweils so früh wie möglich, also an den Anfang der Funktion bzw. des Hauptprogramms.

  • Joa genau, so mache ich das auch ^^
    Einfach zum Überblick...

    Öhm, das mit dem 'so spät wie möglich' stammt aus einem cpp-Tutorial,..
    keine Ahnung ^^

    limette

    There are only 10 types of people in the world:
    Those who understand binary - and those who don't.