Problem bei E-Mail übertragung bei Automatischer Listbox auswahl

  • VB.NET

Es gibt 71 Antworten in diesem Thema. Der letzte Beitrag () ist von EIKI.

    Problem bei E-Mail übertragung bei Automatischer Listbox auswahl

    Hallo

    Ich arbeite im Moment an einem Programm welches E-Mails Automatisch empfängt und Benutzerfreundlich darstellen soll.
    Das Grund Projekt habe ich von folgender Seite (klick mich).
    Das Projekt habe ich abgecodet und es funktioniert auch alles. Soweit so gut. als nächstes habe ich dann angefangen das Programm zu Automatisieren sodass es beim starten schon die E-Mails aus meinem Postfach einliest.
    Ich bin jetzt an dem Punkt das das Programm die E-Mails zwar Downloadet und ich sie auch manuell auswählen kann aber ich weiß halt eben nicht wie ich das Automatisieren kann.
    Der Folgende Code zeigt das Original:

    VB.NET-Quellcode

    1. 'Auswahl der E-Mail mit einem Doppelklick auf den Eintrag in der Listbox
    2. Private Sub ListBox2_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox2.DoubleClick
    3. Dim Index_Num As String
    4. Dim StrRetr As String
    5. TextBox1.Text = ""
    6. Try
    7. Index_Num = (ListBox2.SelectedIndex + 1).ToString
    8. StrRetr = ("RETR " + Index_Num + vbCrLf)
    9. GetEmails(StrRetr)
    10. Catch ex As Exception
    11. MsgBox(ex.Message)
    12. End Try
    13. End Sub
    14. 'Hier wird die gewünschte E-Mail "Geöffnet"
    15. Sub GetEmails(ByVal Server_Command As String)
    16. Dim m_buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(Server_Command.ToCharArray())
    17. Dim stream_Reader As StreamReader
    18. Dim TxtLine As String = ""
    19. Try
    20. m_sslStream.Write(m_buffer, 0, m_buffer.Length)
    21. stream_Reader = New StreamReader(m_sslStream)
    22. Do While stream_Reader.Peek() <> -1
    23. TxtLine += stream_Reader.ReadLine() & vbNewLine
    24. Loop
    25. franfrage = TxtLine.Split("%")
    26. For Each Me.subs In franfrage
    27. counter += 1
    28. If counter = 2 Then
    29. Subject = subs
    30. End If
    31. If counter = 4 Then
    32. Nachricht = subs
    33. End If
    34. Next
    35. TextBox1.Text = TxtLine
    36. TextBox2.Text = Subject
    37. TextBox3.Text = Nachricht
    38. Catch ex As Exception
    39. MsgBox(ex.Message)
    40. End Try
    41. End Sub


    Ich hätte jetzt gerne das das Programm diesen Vorgang jetzt mit jeder E-Mail macht die sich in der ListBox befindet und anschließend die Variable Subject in einer Anderen ListBox ausgibt.
    Ich habe es schon mit einer For Each schleife Probiert weis aber nicht genau wie ich das Stück:

    VB.NET-Quellcode

    1. Index_Num = (ListBox2.SelectedIndex + 1).ToString
    2. StrRetr = ("RETR " + Index_Num + vbCrLf)
    3. GetEmails(StrRetr)


    Jetzt umsetzen soll. Da wenn ich es so mache:

    VB.NET-Quellcode

    1. 'Sub wird von einem Timer gestartet
    2. Sub ReadMsg()
    3. Dim i As Integer
    4. TextBox1.Text = ""
    5. For i = 0 To ListBox1.Items.Count - 1
    6. Try
    7. GetEmails(("RETR " + (ListBox2.SelectedItem + 1)).ToString + vbCrLf)
    8. Catch ex As Exception
    9. MsgBox(ex.Message)
    10. End Try
    11. Next
    12. End Sub


    eine MsgBox mit dem Inhalt: Ungültige Konvertierung von der Zeichenfolge RETR in Typ Double

    Vielen Dank das ihr euch die Mühe macht meinen Text zu lesen und mir hoffentlich auch eine Lösung, welche wahrscheinlich sehr einfach ist, für mein Problem bereithaltet.


    MFG EIKI
    Willkommen im Forum. :thumbup:

    EIKI schrieb:

    Ungültige Konvertierung von der Zeichenfolge RETR in Typ Double
    Da wird offensichtlich versucht, ein String, in dem wahrscheinlich "Osterhase" drin steht, in ein Double zu konvertieren.
    Lektion 1, wie schon der @ErfinderDesRades: schrieb: Weg mit Try / Catch, schließlich wollen wir Fehler finden und nicht verschleiern. Beim EMail-Empfang kann es allerdings sinnvoll sein, wenn der Code als solcher fertig ist, den Mail-Server-Zugriff mit einem Try / Catch abzusichern, allerdings nicht in dieser Entwicklungsphase.
    Lektion 2: Option Strict On. Das verhindert, dass Du einen String inkrementierst und andere lustige Sachen. Sinnvoll ist es, jedem Deiner Projekte automatisch diese Einstellung zu geben, da progst Du wesentlich ruhiger.
    Lektion 3: Die IDE redet mit Dir. Höre auf sie, in den meisten Fällen hat sie Recht. Du bekommst in Deinem Programm angezeigt, was für Parameter eine Funktion erwartet. Überladungen werden angezeigt, Du kannst zwischen ihnen wechseln, wenn Du mit der Maus auf den kleinen Pfeil klickst.
    -----
    Setze diese Sachen erst mal in Ruhe um und beseitige die Fehler, die Dir durch Option Strict On angezeigt werden. Probiere mal, dies ohne die explizite Hilfe des Forums hinzubekommen. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist ein Rudiment aus der VB-Vor-Zeit. In C# ist das fest eingebaut.
    Für das Projekt selbst:
    Projekt -> Eigenschaften -> Kompilieren

    und für alle Projekte als Standard:
    Tools -> Options ->
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe jetzt Option Strict auf On gesetzt und alle Fehler die mir dann gezeigt wurden verbessert.
    wenn ich dann das Debugging starte bleibt das Programm an dem Punkt hängen den auch schon der ErfinderDesRades bemängelt hat.
    Das war der Teil hier:

    VB.NET-Quellcode

    1. For i = 0 To ListBox1.Items.Count - 1
    2. Try
    3. GetEmails(("RETR " + (ListBox2.SelectedItem + 1)).ToString + vbCrLf)
    4. Catch ex As Exception
    5. MsgBox(ex.Message)
    6. End Try
    7. Next


    Der sieht jetzt bei mir ohne irgendwelche Fehlermeldungen in der Fehlerlist so aus:

    VB.NET-Quellcode

    1. For i = 0 To ListBox1.Items.Count - 1
    2. GetEmails("RETR " + ListBox2.SelectedItem.ToString + vbCrLf)
    3. Next


    An diesem Punkt:

    VB.NET-Quellcode

    1. GetEmails("RETR " + ListBox2.SelectedItem.ToString + vbCrLf)

    kommt nämlich die Fehlermeldung
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    und ich weis im Moment nicht wie ich das Problem lösen könnte.

    Ich bedanke mich schon mal im Voraus für eure Antworten.


    MFG EIKI
    der fehler sagt (ich finde, nicht uneindeutig), dass irgendetwas in dieser Zeile Nothing ist, und trotzdem hat jmd. einen '.' dahintergeschrieben, und meint, er könne iwas abrufen von Nothing.
    -Zitat von ErfinderDesRades (aus nem anderes Thema)

    Hast du ein Item ausgewählt? Wenn nicht, wird das vielleicht der Fehler sein.
    Mfg
    Vincent

    Das ist ja grade eins der Probleme das ich nicht genau weis wie ich dem Programm sagen soll das das item welches es gerade in der Schleife ausgewählt hat dann auch das ist welches er unter dem selected item zu verstehen hat.

    MFG EIKI

    EIKI schrieb:

    das item welches es gerade in der Schleife ausgewählt hat
    ist nicht das SelectedItem.
    Das SelectedItem hat üblicherweise den Focus.
    Was soll denn da nach der Operation ToString in besagtem String drin stehen?
    Vllt. gehst Du mal mit ner For-Schleife durch und siehst Dir an, was da bei Item(i).ToString so rauskommt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei dem original Programm wurde das item durch einen Doppelklick ausgewählt.
    Das ist der original code:

    VB.NET-Quellcode

    1. Private Sub ListBox2_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox2.DoubleClick
    2. Dim Index_Num As String
    3. Dim StrRetr As String
    4. TextBox1.Text = ""
    5. Try
    6. Index_Num = (ListBox2.SelectedIndex + 1).ToString
    7. StrRetr = ("RETR " + Index_Num + vbCrLf)
    8. GetEmails(StrRetr)
    9. Catch ex As Exception
    10. MsgBox(ex.Message)
    11. End Try
    12. End Sub


    Ich habe den Code eben jetzt umgeschrieben und anstatt Selected.Item Selected.Index eingefügt. Nun sieht der code wie folgt aus:

    VB.NET-Quellcode

    1. Sub ReadMsg()
    2. Dim i As Integer
    3. TextBox1.Text = ""
    4. For i = 0 To ListBox2.Items.Count - 1
    5. GetEmails("RETR " + (ListBox2.SelectedIndex + 1).ToString + vbCrLf)
    6. Next
    7. End Sub


    Jetzt kommt zwar der eben genannte Fehler während des Debuggens nicht mehr aber das Programm gibt eine MsgBox mit dem Inhalt, dass der Index außerhalb des Arraybereiches Liege. Was mache ich da im Moment falsch und was muss ich durch was ersetzen?
    Ach Danke für die Aufklärung über die genaue Bedeutung von SelectedItem.


    MFG EIKI

    EIKI schrieb:

    VB.NET-Quellcode

    1. GetEmails("RETR " + (ListBox2.SelectedIndex + 1).ToString + vbCrLf)
    Hast Du Dich davon überzeugt, dass da der richtige String drin steht?
    Wenn ja: Wie?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich das Programm Debuggen lasse und an der selben Stelle wo:

    VB.NET-Quellcode

    1. GetEmails("RETR " + (ListBox2.Items(i)).ToString + vbCrLf)

    steht und davor

    VB.NET-Quellcode

    1. MsgBox(ListBox2.Items(i).ToString)

    schreibe dann kommt während der debuggung die MsgBox mit dem Namen der E-Mail die in meiner Listbox am höchsten ist.
    Ich hoffe es war das was du meinst.


    MFG EIKI
    Mach es doch einfach mal so:

    VB.NET-Quellcode

    1. For i = 1 To ListBox2.Items.Count
    2. GetEmails("RETR " & i.ToString & vbCrLf)
    3. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank RoadFromGemany,
    Und auch an alle anderen die mir mit dem Option Strict On Vb wieder ein Stück näher gebracht haben.

    MFG EIKI

    PS: Soll ich das Thema als erledigt markieren und dann bei weiteren Fragen zu dem Programm ein neues aufmachen oder einfach die dann einfach wieder hier rein schreiben?
    @ErfinderDesRades Ich denke Schon das Ich das Problem soweit es für mich zu verstehen ist verstanden habe.
    Wenn es jedoch ein anderer Fehler war als eine Falsche Auswahl des Indexes oder Allgemein eine Falsche For Schleife dann wäre ich dir doch sehr verbunden mir diesen Fehler näher zu bringen sodass ich beim nächsten mal weiß was ich wie machen muss und das dann auch Richtig verstehe.


    MFG EIKI
    Naja, du hattest ja 2 verschiedene Fehler gebaut, der erste war

    EIKI schrieb:

    An diesem Punkt:

    VB.NET-Quellcode

    1. GetEmails("RETR " + ListBox2.SelectedItem.ToString + vbCrLf)
    kommt nämlich die Fehlermeldung
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    Weißt du nun, welches Objekt nicht festgelegt war?

    Der nächste Fehler war anners:

    VB.NET-Quellcode

    1. GetEmails("RETR " + (ListBox2.SelectedIndex + 1).ToString + vbCrLf)
    Jetzt kommt zwar der eben genannte Fehler während des Debuggens nicht mehr aber das Programm gibt eine MsgBox mit dem Inhalt, dass der Index außerhalb des Arraybereiches Liege.
    Hierzu 2 Fragen:
    1. Warum kommt hier keine Fehlermeldung mit Angabe der Fehlerzeile, sondern nur sone ganz unverständliche Messagebox? Weil da ist ja nirgends ein Array.
    2. wo tritt der Fehler wirklich auf?
      (diese Frage kann hier garnet beantwortet werden, solange 1) nicht beantwortet ist.)
    Zu deiner ersten Frage (Die mit dem Objektverweis): Den Code hast du ja.
    Dort war der Fehler das ich geschrieben habe
    ListBox2.SelectedItem.ToString
    und wie RodFromGermany beschrieben hat, dass das SelectedItem üblicherweise nur den Focus hat und nicht wie von mir fälschlich angenommen das Item darstellt welches gerade die Schleife durchläuft.

    Jetzt zu deiner geplanten ersten Frage: Ich verstehe das jetzt so, dass die ListBox als das Array dargestellt wird. SelectedIndex gibt den Index an der vom User ausgewählt wurde aber nicht den der gerade die Schleife durchläuft(und gebraucht wäre).


    Frage zwei(drei) las ich hier vorerst im Raum stehen, da sie wie du schon sagtest
    (diese Frage kann hier garnet beantwortet werden, solange 1) nicht beantwortet ist.)
    sich die Antwort auch aus Antwort eins ergibt. (Falls ich mich dort Täusche bitte ich um Verbesserung deinerseits, dies gilt auch für den Rest des Textes.)



    MFG EIKI
    1. kurz gesagt: das SelectedItem ist Nothing, wenn kein Item selektiert ist.
    2. Der Grund, warum du nur die Messagebox bekommst, und keinen CodeStop mit allen zum Debuggen erforderlichen Infos liegt in post#2: offensichtlich hieltest du es für nicht nötig, die TryCatchens wegzumachen.
      Dann gibts halt diese zT. völlig irreführenden Messageboxen, die einen auf ganz abwegige Gedanken bringen können (Listbox als Array darstellen). Nee, der Fehler ist irgendwo in GetEmail() - ich weiß auch nicht wo, da gebich mir auch keine Mühe drüber nachzudenken, denn wenn der TryCatch weg wäre, sähe man es auf Anhieb und ganz genau.
      TryCatch ist ein heißes Eisen