Classe de connexion pop3 avec téléchargement des messages

Contenu du snippet

Voici une classe de récupération de mails faite en Vb.NET 2005.

Il est possible d'enregistrer les messages au format eml.

Source / Exemple :


Imports System
Imports System.IO
Imports System.Net
Imports System.Data
Imports System.Net.Mail
Imports System.Collections
Imports System.Net.Sockets

' class de connexion POP3
' Téléchargement des messages

Public Class clsPOP3

#Region "Declarations privées"
    Private co As TcpClient
    Private ns As NetworkStream
    Private sr As StreamReader

    Private Server As String
    Private ServerPort As Integer = 110
    Private User As String
    Private PWord As String

    Private NbMails As Integer = 0

    Private NetStrm As NetworkStream
    Private RdStrm As StreamReader
#End Region

#Region "Properties Publiques"

    ' Nom de l'utilisateur
    Public Property UserName() As String
        Get
            Return User
        End Get
        Set(ByVal value As String)
            User = value
        End Set
    End Property

    ' Mot de passe
    Public Property PassWord() As String
        Get
            Return PWord
        End Get
        Set(ByVal value As String)
            PWord = value
        End Set
    End Property

    ' Nom du serveur
    Public Property ServerName() As String
        Get
            Return Server
        End Get
        Set(ByVal value As String)
            Server = value
        End Set
    End Property

    ' Numéro du port de connexion
    Public Property ServerPortNumber() As Integer
        Get
            Return ServerPort
        End Get
        Set(ByVal value As Integer)
            ServerPort = value
        End Set
    End Property

    ' Obtient le nombre de mails
    Public ReadOnly Property NumberOfMails() As Integer
        Get
            Return NbMails
        End Get
    End Property
#End Region

    ' Evenement renvoyant les informations de connexion etc...
    Public Event ConnectionStatus(ByVal message As String)

    ' Reception des messages et sauvegarde
    ' ou non dans un fichier
    Public Function receiveMessage(ByVal messageIndex As Integer, ByRef messageStream As String, Optional ByVal saveFileName As String = "") As Boolean
        Dim szTemp As String
        Dim sOut As String
        Dim message As String = ""
        Try
            sOut = "RETR " & messageIndex.ToString() & vbCrLf
            SendStream(sOut)
            szTemp = sr.ReadLine

            RaiseEvent ConnectionStatus(szTemp)

            Dim tempString As String = ""
            If szTemp(0) <> "-" Then
                While szTemp <> "."
                    tempString = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.Convert(System.Text.Encoding.ASCII, System.Text.Encoding.UTF8, EncodeByte(szTemp)))
                    message = message & tempString & vbCrLf
                    szTemp = sr.ReadLine()
                End While
            End If

            messageStream = message

            '  Sauvegarde du mail
            If saveFileName <> "" Then
                Dim myFile As New System.IO.FileInfo(saveFileName)
                Dim myTextWriter As System.IO.TextWriter

                myTextWriter = myFile.CreateText()
                myTextWriter.Write(messageStream)
                myFile = Nothing
                myTextWriter.Close()
                myTextWriter.Dispose()
                Return True
            End If

            Return True
        Catch ex As Exception
            RaiseEvent ConnectionStatus(ex.Message.ToString())
            Return False
        End Try

    End Function

    ' Supprime le message passé en paramètre
    Public Function DeleteMessage(ByVal messageIndex As Integer) As Boolean
        Dim data As String = "DELE " & messageIndex.ToString & vbCrLf

        SendStream(data)

        Dim tmpString As String = sr.ReadLine()
        If tmpString.Substring(0, 4) = "-ERR" Then
            MsgBox("Could Not Delete Message")
            RaiseEvent ConnectionStatus("Le message " & messageIndex & " n'a pas été supprimé !")
            Return False
        Else
            RaiseEvent ConnectionStatus("Le message " & messageIndex & " a été supprimé !")
            Return True
        End If
    End Function

    ' Connection à la boite
    Public Function connect() As Boolean

        NbMails = 0
        Dim retServer As String
        Try
            ' Initialisation
            co = New TcpClient(Server, ServerPort)
            ns = co.GetStream()
            sr = New StreamReader(co.GetStream())
            'sr.ReadLine()

            Dim sOut As String = "USER " & User & vbCrLf

            ' Envoi du login
            SendStream(sOut)
            retServer = sr.ReadLine
            RaiseEvent ConnectionStatus(retServer)

            ' Envoi du mot de passe
            sOut = "PASS " & PWord & vbCrLf
            SendStream(sOut)
            retServer = sr.ReadLine
            RaiseEvent ConnectionStatus(retServer)

            If retServer.Substring(0, 4) <> "-ERR" Then
                NbMails = RecupMsgInfo(1)
                RaiseEvent ConnectionStatus("Nombre de mails: " & NbMails.ToString())
                Return True
            Else
                RaiseEvent ConnectionStatus("Identification refusée !")
                Return False
            End If
        Catch ex As Exception
            RaiseEvent ConnectionStatus(ex.ToString())
            Return False
        End Try

        

    End Function

    ' Déconnexion
    Public Function Disconnect() As Boolean
        Dim sOut As String
        Dim retString As String

        sOut = "QUIT" & vbCrLf

        SendStream(sOut)
        Try
            retString = sr.ReadLine()
            RaiseEvent ConnectionStatus(retString)
        Catch ex As Exception
            RaiseEvent ConnectionStatus(ex.Message)
        End Try

        sr.Close()
        ns.Close()
        co.Close()
        Return True
    End Function

    ' Envoi des commandes
    Private Sub SendStream(ByVal s As String)
        Dim FluxSortant() As Byte
        FluxSortant = EncodeByte(s)
        Try
            ns.Write(FluxSortant, 0, FluxSortant.Length)
        Catch ex As Exception
            RaiseEvent ConnectionStatus(ex.Message)
        End Try
    End Sub

    ' Encodage des commandes pour POP3
    Private Function EncodeByte(ByVal s As String) As Byte()
        Return System.Text.ASCIIEncoding.ASCII.GetBytes(s.ToCharArray())
    End Function

    ' Recupération du nombre de message
    ' ou du corps des messages
    Private Function RecupMsgInfo(ByVal iMode As Integer, ByVal ParamArray i() As Integer) As Integer
        Dim FluxSortant As String = ""
        Dim sTempLigne As String = "+OK "

        Select Case iMode
            Case 1
                FluxSortant = "STAT" + vbCrLf
            Case 2
                FluxSortant = "LIST " + i(0).ToString() + "\r\n"
        End Select

        Dim sTemp As String() = {"0"}

        Try
            Do
                SendStream(FluxSortant)
                sTempLigne = sr.ReadLine()
                RaiseEvent ConnectionStatus(sTempLigne)

                sTemp = sTempLigne.Split(" ")

            Loop While (sTempLigne = "+OK ")
        Catch ex As SocketException
            RaiseEvent ConnectionStatus("Erreur lors du chargement des messages" & vbCrLf & ex.ToString())
        Catch ex As ArgumentException
            RaiseEvent ConnectionStatus("Erreur lors du chargement des messages" & vbCrLf & ex.ToString())
        End Try

        Try
            Dim iWordCount As Integer = 0
            For iWordCount = 0 To sTemp.Length - 1
                If IsNumeric(sTemp(iWordCount)) Then
                    Return Integer.Parse(sTemp(iWordCount))
                End If
            Next

        Catch ex As Exception
            RaiseEvent ConnectionStatus(ex.Message)
            Return 0
        End Try

    End Function

End Class

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.