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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 225 fois - Téléchargée 33 fois

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

Ajouter un commentaire Commentaires
Messages postés
206
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
14 septembre 2011

Bonjour,

Merci à toi casper pour cette source très pratique...

Par contre (je vais commencer à regarder de mon coté) saurais tu comment déterminé quels sont les "message non lu / nouveau" dans le nombre retourner par "NumberOfMails" ?

Merci

Très bonnes sources, et bien que pas très commenté, bien codé.
Messages postés
31
Date d'inscription
samedi 18 août 2007
Statut
Membre
Dernière intervention
15 mars 2016

salut
je suis un debutant en vb.net
est ce que quelqu'un pourrai m'expliquer comment on se sert de cette classe ?
merci
Messages postés
5
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
15 mai 2009

Coucou,

Le code fonctionne correctement en vb.net 2003

L'import de system.net.mail ne sert à rien

Il faut modifier la ligne :
If szTemp(0) <> "-" Then
en :
If Mid(szTemp,1,1) <> "-" Then

La ligne : myTextWriter.dispose() doit être supprimée.

Pour moi, le reste fonctionne (cnx, recup nb mail, lecture message, deconnexion).

Il reste à regarder les accentués.


En tout cas, bon boulot !!!
Messages postés
5
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
15 mai 2009

Coucou,

Le code fonctionne correctement en vb.net 2003

L'import de system.net.mail ne sert à rien

Il faut modifier la ligne :
If szTemp(0) <> "-" Then
en :
If Mid(szTemp,1,1) <> "-" Then

La ligne : myTextWriter.dispose() doit être supprimée.

Pour moi, le reste fonctionne (cnx, recup nb mail, lecture message, deconnexion).

Il reste à regarder les accentués.


En tout cas, bon boulot !!!
Messages postés
5
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
15 mai 2009

Coucou,

Le code fonctionne correctement en vb.net 2003

L'import de system.net.mail ne sert à rien

Il faut modifier la ligne :
If szTemp(0) <> "-" Then
en :
If Mid(szTemp,1,1) <> "-" Then

La ligne : myTextWriter.dispose() doit être supprimée.

Pour moi, le reste fonctionne (cnx, recup nb mail, lecture message, deconnexion).

Il reste à regarder les accentués.


En tout cas, bon boulot !!!
Afficher les 13 commentaires

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.