E-Mails abrufen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    E-Mails abrufen

    Huhu ihr :)

    ich würde gerne per Klick auf einen Button E-Mails eines bestimmten Kontos abrufen lassen.
    Mein Code:

    VB.NET-Quellcode

    1. Imports System.Text.Encoding
    2. Public Class Client
    3. Private Client As New Net.Sockets.TcpClient
    4. Private POP3Stream As Net.Sockets.NetworkStream
    5. Private Connected As Boolean = False
    6. '''<summary>
    7. '''Verbindungssatus abfragen.
    8. '''</summary>
    9. Public ReadOnly Property ConnectionEstablished() As Boolean
    10. Get
    11. Return Connected
    12. End Get
    13. End Property
    14. '''<summary>
    15. '''Nachrichten Klasse
    16. '''</summary>
    17. Public Class MessageList
    18. Public ID As Int64
    19. Public Size As Int64
    20. End Class
    21. '''<summary>
    22. '''Verfügbarer POP3 Befehlssatz.
    23. '''</summary>
    24. Private Class Commands
    25. Public Const Delete As String = "DELE "
    26. Public Const GetMessage As String = "RETR "
    27. Public Const List As String = "LIST"
    28. Public Const Password As String = "PASS "
    29. Public Const Quit As String = "QUIT"
    30. Public Const ServerConfirm As String = "+OK"
    31. Public Const ServerNoMoreData As String = "."
    32. Public Const User As String = "USER "
    33. End Class
    34. '''<summary>
    35. '''Stellt die Verbindung zum POP3-Server her.
    36. '''</summary>
    37. '''<param name="Server">Servername (subdomain.domain.tld)</param>
    38. '''<param name="User">Benutzername</param>
    39. '''<param name="Password">Passwort</param>
    40. Public Sub Connect(ByVal Server As String, ByVal User As String, ByVal Password As String)
    41. If Connected = True Then Me.Disconnect()
    42. Try
    43. Me.Client.Connect(Server, 110)
    44. Me.POP3Stream = Me.Client.GetStream
    45. Me.CheckResponse(Me.GetResponse)
    46. Me.Send(Commands.User + User)
    47. Me.CheckResponse(Me.GetResponse)
    48. Me.Send(Commands.Password + Password)
    49. Me.CheckResponse(Me.GetResponse)
    50. Me.Connected = True
    51. Catch ex As Exception
    52. Me.Disconnect()
    53. Throw New ApplicationException(ex.Message, ex)
    54. End Try
    55. End Sub
    56. '''<summary>
    57. '''Trennt die Verbindung zum POP3-Server her.
    58. '''</summary>
    59. Public Sub Disconnect()
    60. If Connected = True Then
    61. Me.Send(Commands.Quit)
    62. Me.CheckResponse(Me.GetResponse())
    63. Me.Connected = False
    64. Me.Client.Close()
    65. End If
    66. End Sub
    67. '''<summary>
    68. '''Sendet POP3 Befehl zum Server.
    69. '''</summary>
    70. '''<param name="Command">POP3 Befehl</param>
    71. Private Sub Send(ByVal Command As String)
    72. Dim data As [Byte]() = ASCII.GetBytes(Command & vbCrLf)
    73. Me.POP3Stream.Write(data, 0, data.Length)
    74. End Sub
    75. '''<summary>
    76. '''Empfängt Antwort auf Send-Befehl vom Server.
    77. '''</summary>
    78. Private Function GetResponse() As String
    79. Dim SR As New IO.StreamReader(Me.POP3Stream)
    80. Dim SBuilder As New System.Text.StringBuilder
    81. Do While SR.Peek > -1
    82. SBuilder.Append(SR.ReadLine + vbCr)
    83. Loop
    84. Return SBuilder.ToString
    85. End Function
    86. '''<summary>
    87. '''Prüft ob die erhalten Antwort von GetResponse gültig ist.
    88. '''</summary>
    89. '''<param name="Response">Antort von GetResponse</param>
    90. Private Sub CheckResponse(ByVal Response As String)
    91. If Not String.Compare(Response.Substring(0, 3), Commands.ServerConfirm, False, Globalization.CultureInfo.CurrentCulture) = 0 Then
    92. Me.Client.Close()
    93. Me.Connected = False
    94. Throw New ApplicationException("Response " + Response + " not expected.")
    95. End If
    96. End Sub
    97. '''<summary>
    98. '''Gibt eine List(of POP3Message) der verfügbaren Nachrichten zurück.
    99. '''</summary>
    100. Public Function GetMessageList() As List(Of MessageList)
    101. If Me.Connected = False Then
    102. Throw New InvalidOperationException("Not connected!")
    103. End If
    104. Dim Pop3l As New List(Of MessageList)
    105. Me.Send(Commands.List)
    106. Dim Response() As String = Me.GetResponse.Split(vbCrLf)
    107. CheckResponse(Response(0))
    108. For i As Integer = 1 To Response.Length - 3
    109. Dim POP3m As New MessageList
    110. POP3m.ID = i
    111. POP3m.Size = Convert.ToInt64(Response(i).Split(" ")(1))
    112. Pop3l.Add(POP3m)
    113. Next
    114. Return Pop3l
    115. End Function
    116. '''<summary>
    117. '''Nachricht mit angebener Nummer vom Server lesen
    118. '''</summary>
    119. '''<param name="MessageID">MessageID</param>
    120. Public Function GetMessage(ByVal MessageID As Integer) As String
    121. If Me.Connected = False Then
    122. Throw New InvalidOperationException("Not connected!")
    123. End If
    124. Me.Send(Commands.GetMessage & MessageID)
    125. Me.CheckResponse(Me.GetResponse)
    126. Dim Response As String = Me.GetResponse
    127. Return Response
    128. End Function
    129. End Class


    Aber bei dem Convert (Zeile 138) bekomme ich folgende Meldung:

    Fehler bei der Überladungsauflösung, da keine zugreifbare "Convert" diese Anzahl von Argumenten akzeptiert.

    Wie kann ich das beheben, bzw. kennt jemand eine bessere Lösung ?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Hat hier wirklich niemand eine Idee ?
    Ich möchte ja nicht drängeln aber ich benötige das dringend :(
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Ich habe mal einfach so getestet:


    Quellcode

    1. Dim a As Integer
    2. Dim Response() As String = {"123 456 789", "234 765 987"}
    3. For i = 0 To 1
    4. a = Convert.ToInt64(Response(i).Split(" ")(0))
    5. Debug.Print(a)
    6. Next i



    Das ging problemlos. Vielleicht solltest du mal probieren die Function in mehrere
    Zeilen zu trennen.
    Die OpenPop3.dll ist wirklich super :)

    Aber wie kann ich nun beim Abrufen prüfen, ob die mails bereits gelesen wurden ?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Das musst du selbst bewerkstelligen. Du musst dir ein System überlegen, z.B. das Datum, Betreff und Absender mit den bereits vorhandenen Mails vergleichen. Nur wenn keine Übereinstimmung ist wird die E-Mail als "Neu" angezeigt. Ansonsten musst sie ja nicht nochmal hinzufügen.

    Ich habe es allerdings einfacherer gelöst, indem ich nach dem Abholen die E-Mail im Konto lösche, somit sind automatisch alle Mails die sich im Konto befinden neue Mails.