|
Droit de diffusion et
d'utilisation:
Tous les documents ou partie de document ainsi que le code
sont libres d'accès, mais ne peuvent pas être diffusés
sur d'autres sites HTTP, FTP ou autres, sans mon accord.
L'ensemble de mon code mis à votre diposition est libre d'utilisation
tant qu'il ne sert pas à la réalisation d'applications
payantes. Je demande juste aux personnes incluant mon code dans
leurs applications d'y laisser le commentaire mis en entête.
Avant Propos :
L'ensemble du code et explications que vous trouverez
dans ce document est basé sur Visual Basic 6.
Vous vous êtes déjà sans doute posé la question
de comment envoyer un e-mail ou bien en recevoir sans pour autant utiliser
les contrôles d'Outlook. Et bien pour cela nous allons directement utilisé
les sockets grâce aux composant Microsoft Winsock Control.
Ce tutorial a pour but de comprendre comment
fonctionne le contrôle Winsock. J'ai fait le choix de vous présentez ce contrôle
via le développement d'une application permettant de lire et écrire des mails.
Les sources principales sont les RFC 2821 (basé sur la 821) et 1939.
Ce tutorial se divise en trois parties :
- les contrôles nécessaires
- l'envoie d'un mail
- la réception d'un mail via POP3
Partie I : Les contrôles nécessaires :
Tout d'abord vous devez rajouter à votre projet
le composant Microsoft Winsock Control. Pour cela vous allez dans le menu
Projet puis Composants. La fenêtre suivante apparaîtra.

S'il n'apparaît pas dans la liste, essayer de
récupérer le fichier MSWINSCK.OCX sur autre machine et faîtes "Parcourir..."
afin de le sélectionner.
Ensuite vous devez coller sur votre Form le contrôle lui même :

Cette form est composée de 5 champs de saisie et un d'affichage. Le premier
nommé txtFrom permet de saisir l'expéditeur du mail. Le deuxième txtTo permet
de saisir le récepteur du mail. Le troisième txtSubject permet de saisir
le sujet du message. Le quatrième rtxtMail (de type RichTextBox) permet de
saisir le contenu du mail. Le cinquième txtServer permet de saisir le serveur
smtp à partir duquel vous souhaitez envoyer votre mail (généralement les
erveurs smtp n'autorise que les machines appartenant au même réseau d'émettre
des mails). Le sixième rtxtLog permet de voir ce que le serveur nous retourne
comme information.
Partie II - L'envoie d'un mail :
La première chose à faire est de déclarer une
variable permettant de capturer les évènements d'un contrôle Winsock.
Afin de capturer l'ensemble des évènements du
contrôle Winsock que vous avez collé sur la Form, il faut que les deux variables
pointent sur le même objet.
Voici le code complet de la Form :
Le code présent ci-dessus ne gère pas les erreurs.
Comme vous pouvez le contaster, plusieurs évènements
sont gérés dont la connexion, la déconnexion, la réception de messages et
la réception d'erreurs. Pour chaque envoi, la variable nextFalse est positionnée
à False car le programme doit attendre que le serveur est répondu avant de
d'envoyer la suite. Vous pouvez rencontrer deux types d'erreurs : les erreurs
liées à la connexion donc c'est l'évènement Error qui vous permettra de les
gérer, ou bien les erreurs retournées par le serveur si vous avez envoyé une
mauvaise commande. Dans ce dernier cas, c'est dans l'évènement DataArrival
qu'il faudra regarder la chaîne retournée par le serveur pour savoir si tout
c'est bien passé.
Lorsque vous envoyez de grosses données deux évènements
supplémentaires peuvent vous permettre de voir l'avancement : SendComplete
qui prévient quand le transfert est terminé, et SendProgress qui permet de
savoir le nombre d'octets envoyés.
Comme vous avez pû le constater, chaque instruction
encoyée se termine par vbCrLf qui permet de dire au serveur que c'est la fin
de l'instruction.
Partie III : La réception d'e-mail:
Pour la réception nous allons contruire une nouvelle
Form afin de lire les mails.
Ensuite vous devez coller sur votre Form le contrôle lui même :

Cette form se divise en deux parties. La partie du haut concernant la
connexion :
- le champ login : txtLogin
- le champ mot de passe : txtPassword
- le champ serveur : txtServer
- le bouton de connexion : btnConnect
- le bouton de déconnexion : btnDisconnect
La partie du bas compte 3 champ :
- une listbox à droite : lstMessage dans laquelle apparaîtront la liste
des messages
- une RichTextBox à droite : rtxtMessage dans laquelle vous verrez le contenu
du message
- une RichTextBox en bas : rtxtLog qui correspond à la fenêtre de log comme
por l'émission.
Le code que je fournis est des plus basiques.
C'est juste pour montrer que l'utilisation des sockets est toujours la même
chose. Le tout est de savoir ce que vous recevez et ce que vous devez envoyer.
Pour cela je vous renvoie aux différentes RFC ou alors à votre propre cahier
des charges si vous développez votre propre protocole de communication.
Voici le code complet de la Form :
Private WithEvents evt As Winsock
Private nextSend As Boolean
Private answer As String
Private nbrecept As Long
Private Sub btnConnect_Click()
Dim tmp As String
Set evt = ws
nbrecept = 0
ws.Connect txtServer, 110
While ws.State <> sckConnected
DoEvents
Wend
'Attente du message de bienvenue
nextSend = False
While nextSend = False
DoEvents
Wend
nextSend = False
ws.SendData "USER " & txtLogin.Text & vbCrLf
While nextSend = False
DoEvents
Wend
nextSend = False
ws.SendData "PASS " & txtPassword.Text & vbCrLf
While nextSend = False
DoEvents
Wend
If InStr(1, answer, "OK") > 0 Then
lblMessage.Caption = "Vous êtes connecté"
RecuperationNbMessage
Else
lblMessage.Caption = "Login/mot de passe incorrect"
End If
End Sub
Private Sub evt_ConnectionRequest(ByVal requestID As Long)
rtxtLog.Text = rtxtLog.Text & vbCrLf & "Demande de connexion au serveur"
End Sub
Private Sub evt_DataArrival(ByVal bytesTotal As Long)
Dim tmp As String
If ws.State = sckClosed Or ws.State = sckClosing Then Exit Sub
ws.GetData tmp, vbString, bytesTotal
rtxtLog.Text = txtLog.Text & Chr(13) & tmp
rtxtLog.Refresh
nextSend = True
End Sub
Private Sub evt_Error(ByVal Number As Integer, Description As String,
ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal
HelpContext As Long, CancelDisplay As Boolean)
MsgBox Number & " : " & Description
End Sub
|
Remarque :
Il est tout à fait possible qu'il y ait des erreurs dans le
document. Si vous en trouvez, ou bien souhaitez un peu plus
d'explication sur certains points, veuillez m'envoyer un message
privé via le forum afin de mettre à jour l'ensemble de ce document.
D'avance merci.
Documents réalisés par
Sébastien Curutchet
|