Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1896 | Besucher online: 450
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Email über POP3 abfrufen


Autor: David Struthers
Sprache: VB.NET
Bewertung:
7.77 (3 votes)
Anzahl der Aufrufe: 24979
  
Kick it on dotnet-kicks.de  

Beschreibung:

Eine Klasse um Emails von einem POP3 Server zu lesen. Habe mal alles was ich so gefunden haben in einer Klasse zusammen gebaut. Es gibt bestimmt noch einiges zu verbessern aber Mails lassen sich ohne Probleme abrufen. Für konstruktive Kritik bin ich immer dankbar.


Beispielaufruf:

Dim pop As New POP3.Client
pop.Connect("pop.test.de", "xyz", "test0815")

'Liste der auf dem Server vorhanden Nachrichten abrufen
pop.GetMessageList()
Dim MessageList As New List(Of POP3.Client.MessageList)
' gibt eine List mit ID und Groesse der Mails zurück
MessageList = pop.GetMessageList()

' Hier wird z.B. die Mail mit ID Nr. 1 abgerufen
Dim m() As String = pop.GetMessage(1).Split(vbCrLf)
For i As Integer = 0 To m.Length - 1
debug.print(m(i))
Next
pop.Disconnect()



Abgelegt unter: POP3, Email, VB.NET.



Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
Public Class Client

    Private Client As New Net.Sockets.TcpClient
    Private POP3Stream As Net.Sockets.NetworkStream
    Private Connected As Boolean = False

    '''<summary>
    '''Verbindungssatus abfragen.
    '''</summary>
    Public ReadOnly Property ConnectionEstablished() As Boolean

        Get
            Return Connected
        End Get

    End Property

    '''<summary>
    '''Nachrichten Klasse
    '''</summary>
    Public Class MessageList

        Public ID As Int64
        Public Size As Int64

    End Class

    '''<summary>
    '''Verfügbarer POP3 Befehlssatz.
    '''</summary>
    Private Class Commands

        Public Const Delete As String = "DELE "
        Public Const GetMessage As String = "RETR "
        Public Const List As String = "LIST"
        Public Const Password As String = "PASS "
        Public Const Quit As String = "QUIT"
        Public Const ServerConfirm As String = "+OK"
        Public Const ServerNoMoreData As String = "."
        Public Const User As String = "USER "

    End Class

    '''<summary>
    '''Stellt die Verbindung zum POP3-Server her.
    '''</summary>
    '''<param name="Server">Servername (subdomain.domain.tld)</param>
    '''<param name="User">Benutzername</param>
    '''<param name="Password">Passwort</param>
    Public Sub Connect(ByVal Server As String, ByVal User As String, ByVal Password As String)

        If Connected = True Then Me.Disconnect()
        Try
            Me.Client.Connect(Server, 110)
            Me.POP3Stream = Me.Client.GetStream
            Me.CheckResponse(Me.GetResponse)
            Me.Send(Commands.User + User)
            Me.CheckResponse(Me.GetResponse)
            Me.Send(Commands.Password + Password)
            Me.CheckResponse(Me.GetResponse)
            Me.Connected = True
        Catch ex As Exception
            Me.Disconnect()
            Throw New ApplicationException(ex.Message, ex)
        End Try

    End Sub

    '''<summary>
    '''Trennt die Verbindung zum POP3-Server her.
    '''</summary>
    Public Sub Disconnect()

        If Connected = True Then
            Me.Send(Commands.Quit)
            Me.CheckResponse(Me.GetResponse())
            Me.Connected = False
            Me.Client.Close()
        End If

    End Sub

    '''<summary>
    '''Sendet POP3 Befehl zum Server.
    '''</summary>
    '''<param name="Command">POP3 Befehl</param>
    Private Sub Send(ByVal Command As String)

        Dim data As [Byte]() = Text.Encoding.ASCII.GetBytes(Command & vbCrLf)
        Me.POP3Stream.Write(data, 0, data.Length)

    End Sub

    '''<summary>
    '''Empfängt Antwort auf Send-Befehl vom Server.
    '''</summary>
    Private Function GetResponse() As String

        Dim SR As New IO.StreamReader(Me.POP3Stream)
        Dim SBuilder As New Text.StringBuilder
        Do While SR.Peek > -1
            SBuilder.Append(SR.ReadLine + vbCr)
        Loop
        Return SBuilder.ToString

    End Function

    '''<summary>
    '''Prüft ob die erhalten Antwort von GetResponse gültig ist.
    '''</summary>
    '''<param name="Response">Antort von GetResponse</param>
    Private Sub CheckResponse(ByVal Response As String)

        If Not String.Compare(Response.Substring(0, 3), Commands.ServerConfirm, False, Globalization.CultureInfo.CurrentCulture) = 0 Then
            Me.Client.Close()
            Me.Connected = False
            Throw New ApplicationException("Response " + Response + " not expected.")
        End If

    End Sub

    '''<summary>
    '''Gibt eine List(of POP3Message) der verfügbaren Nachrichten zurück.
    '''</summary>
    Public Function GetMessageList() As List(Of MessageList)

        If Me.Connected = False Then
            Throw New InvalidOperationException("Not connected!")
        End If
        Dim Pop3l As New List(Of MessageList)
        Me.Send(Commands.List)
        Dim Response() As String = Me.GetResponse.Split(vbCrLf)
        CheckResponse(Response(0))

        For i As Integer = 1 To Response.Length - 3
            Dim POP3m As New MessageList
            POP3m.ID = i
            POP3m.Size = Convert.ToInt64(Response(i).Split(" ")(1))
            Pop3l.Add(POP3m)
        Next

        Return Pop3l

    End Function

    '''<summary>
    '''Nachricht mit angebener Nummer vom Server lesen
    '''</summary>
    '''<param name="MessageID">MessageID</param>
    Public Function GetMessage(ByVal MessageID As Integer) As String

        If Me.Connected = False Then
            Throw New InvalidOperationException("Not connected!")
        End If
        Me.Send(Commands.GetMessage & MessageID)
        Me.CheckResponse(Me.GetResponse)
        Dim Response As String = Me.GetResponse
        Return Response

    End Function

End Class
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Thomas Reimelt schrieb am:  04.03.2008 11:53:44

Das ist ein Super Snippet, aber was jetzt eigentlich noch fehlt, ist ein Snippet, dass aus dieser Email String am Ende ein Emailobjekt wie zum Beispiel das MailMessage Objekt aus dem .net framework macht. Kennt jemand das vielleicht?

Gruß

Thomas
David Struthers schrieb am:  06.03.2008 12:34:04

Da wart ich auch drauf :)
Jan Welker schrieb am:  06.03.2008 12:38:09

Vielleicht sollte ich eine Snippet-Wish-List einbauen. :-)
Volker Steitz schrieb am:  07.03.2008 22:33:53

Zum Thema MailMessage Objekt - mal sehen was sich machen lässt.
Aber - wozu soll das MailMessage Objekt denn verwendet werden, was soll damit gemacht werden?
Volker
Thomas Reimelt schrieb am:  10.03.2008 16:59:12

Hallo,

so ein Objekt gibt es schon. Ich habe es hier gefunden: http://www.lumisoft.ee/lswww/download/downloads/Net/

Dem Objekt übergibt man in der Mime.Parse Funktion die Nachricht und kann dannach beqeum damit arbeiten. Zum Beispiel direkt auf die Attachments zugreifen, den Absender auswerten usw.

Gruß

Thomas


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.