LE CONTROLE dsSOCKET: CREER UNE APPLICATION MAIL SMTP

Introduction
Interface Application Cliente
Connexion
Serveur Prêt
Envoi de l'e-mai!
Conclusion
Téléchargement

Introduction

dsSocket est un contrôle Winsock (Windows Sockets) puissant qui a été developpé par Dolphin Systems et permet de créer des applications Internet (Client-Serveur).
dsSocket supporte la gestion de réseaux TCP et UDP. Nous verons juste le côté TCP dans cet article.

Ok, ok... la même chanson du précédent article [Application IRC] :^)

Bien, nous allons voir comment créer une application MAIL SMTP, c-à-d qui envoie juste des messages e-mail. SMTP est mis pour Simple Mail Transfer Protocol.

Cetta application vous permet (uniquement) d'envoyer un email internet. Vous pouvez spécifier à qui envoyer le message, la provenance du message, le message lui-même... Le programme se connecte à un serveur mail, s'identifie et envoie le message. Certains qualifiront ce programme de mailer anonyme (en fait, le serveur ne vérifie pas l'origine du message, et se charge d'envoyer juste le mail :^)

Créez un nouveau projet vb, allez dans Composants (Ctrl+T), cliquez sur parcourir et allez dans le répertoire dans lequel vous avez dézipper vos fichiers .ocx [c'était le fichier dsSocket.zip ], sélectionnez dsSocket32.ocx et cliquez sur OK. De retour à la boîte de dialogue composants, vérifiez que la case "Dolphin Systems dsSocket TCP/IP control" est cochée et cliquez de nouveau sur OK.

Créer une feuille frmMail

L'initialisation de notre projet est terminé :^), On passe au code !

Interface Application Cliente [Smtp Mailer]

On travaille maintenant avec la feuille frmMail. Ajoutez y ces contrôles:

Type Nom Description
TextBox txHost Contient l'adresse du serveur smtp
TextBox txTo L'e-mail du correspondant
TextBox txFrom L'e-mail d'origine (votre e-mail)
TextBox txSubject Zone où frapper le sujet du message
TextBox txUser Loggin - Pseudonyme... Pas important
TextBox txPassword Mot de passe... Pas important
CommandButton btnSend Bouton qui envoie le message au Serveur smtp
Label txStatus Affiche l'état de la connexion

Les zones de texte txUser et txPassword ne sont pas importantes... le serveur n'en a pas besoin. C'est pour créer un effet de style que je les ai mis :^)

Votre application cliente doit maintenant ressemble à ceci:

wsirc1.gif (6016 octets)

Passons maintenant au code !

Connexion

L'utilisateur vient de terminer le remplissage des textox, il clique sur Envoiyer:

Private Sub btnSend_Click()
'Gestion des erreurs...
'Si vous n'êtes pas connecté à Internet,
'dsSocket1.Connect peut causer une erreur !
'MAIS normalement, il devrait ouvrir la boîte de
'dialogue "Connection A Internet"... :^(
On Error Resume Next
    'Spécifie le port de communication
    'Pour les serveurs email, le port est 25
    dsSocket1.RemotePort = 25
    'Spécifie le serveur mail
    dsSocket1.RemoteHost = txHost
    'Connection au serveur (SMTP), on attend ensuite une réponse
    'venant du serveur. Et à l'arrive d'une réponse, l'évènement Receive
    'de dsSocket1 est déclenché
    dsSocket1.Connect
End Sub

 

Serveur Prêt

Le serveur est prêt à recevoir les données, on met donc à jour la barre d'état.

Private Sub dsSocket1_SendReady()
    'La connection au serveur est prête pour
    'le transfère de données
    txStatus = "Connecté au serveur Mail"
End Sub

 

Envoi de l'e-mail

Bien, bien... il faut maintenant envoyer l'e-mail. Pour cela, le programme doit suivre un ordre de traitement de données spécifique. Cet ordre est commun à tous les serveurs smtp du Net.
Rappelons que l'évènement dsSocket1_Connect() se déclenche lorsqu'un paquet d'informations arrive en provenance du serveur.
Comme exemple de serveur smtp: smtp.ifrance.com
Afin de tester le programme, envoyez moi un mail, et je répondrai.
Assez "blablaté", au travail :^)

La connection au serveur doit respecter un ordre précis et doit se faire en plusieurs étapes.
Voici le processus normal d'un échange:
0. Connexion au serveur
1. Reception du code 220
2. Envoi de l'instruction HELO
3. Reception du code 250
4. Envois et receptions pour les propriétés du message
5. Envoi de l'instruction DATA
6. Reception du code 354
7. Envoi de l'instruction SUBJECT
8. Reception du code 354
9. Envoi du corps du message
10. Envoi du signe . pour la fin du message
11. Reception du code 221
12. Envoi de l'instruction QUIT
13. Déconnection...

Private Sub dsSocket1_Receive(ReceiveData As String)

Static iState       As Integer
'La variable iState conserve l'état courant
'du processus d'échange de données (entre le serveur et le client)
'Cette variable sera mise à jour après chaque étape du processus
'd'envoi, ainsi on saura quelle est la commande suivante à envoyer
'au serveur
    
Dim iMsgNum         As Integer
'Le serveur communique avec nous via des numéros
'chaque numéro a sa signification, et iMsgNum se charge
'de garder le numéro qui se trouve dans le paquet d'informations
'envoyé par le serveur

Dim szMsg           As String
'szMsg comporte le corps du message

Dim i               As Integer
'variable bidon :^)

'On retient le numéro qui se trouve à gauche de ReceiveData (avant l'espace)
iMsgNum = Val(Left(ReceiveData, InStr(ReceiveData, " ")))

Select Case iMsgNum
'On envoie une commande en fonction de la réponse
'du serveur.
    Case 220
        '220 est le Message initial
        dsSocket1.Send = "HELO " & txHost & vbCrLf
        txStatus = "|-| Commande HELLO envoyée: Serveur Mail Prêt..."
        'A la prochaine reception de données, on passe à l'étape 1
        iState = 1
        
    Case 250
        'Si tout se passe bien, 250 est le message venant du serveur qui suit 220
        '250 signale au client qu'il peut commencer à passer
        'les informations sur le mail.
        Select Case iState
            Case 1:
                'Etape 2 si tout se passe bien :^)
                dsSocket1.Send = "MAIL FROM:<" & txFrom & ">" & vbCrLf
                txStatus = "|-| Commande MAIL FROM envoyée"
                iState = 2
            
            Case 2:
                'Etape 3 si tout se passe bien
                dsSocket1.Send = "RCPT TO:<" & txTo & ">" & vbCrLf
               'RCPT signifie RECIPIENT
                txStatus = "|-| Commande RCPT envoyée"
                iState = 3
                
            Case 3:
                'Etape 4 si tout se passe biensûre bien :^)
                'Bon au signale au serveur que l'envoi du message même (corps)
                'est prêt ! Tout ce qui suivra cette commande sera considéré
                'comme le message
                dsSocket1.Send = "DATA" & vbCrLf
                txStatus = "|-| Commande DATE envoyée"
                iState = 4
                'Après avoir envoyé DATA, le serveur se met en position de reception
                'du message, et envoi le nombre 354
                
            Case 5:
                'Etape 6... Vous connaissez la chanson :^)
                '
                'La commande QUIT dit bye au serveur
                dsSocket1.Send = "QUIT" & vbCrLf
                txStatus = "Déconnection du serveur"
                iState = 6
                
            End Select
            
    Case 354
        'Etape 5 si tout se passe bien
        
        'Si tout se passe bien, 354 est le message venant du serveur qui suit 250
        '354 signale au client qu'il peut commencer à passer
        'le message même (corps)
        
        iState = 5
        txStatus = "|-| Envoi du corps du message"
        'Sujet
        dsSocket1.Send = "Subject: " & txSubject & vbCrLf
        'le serveur est prêt pour le corps
        szMsg = txMessage
        dsSocket1.Send = szMsg
        'NOTE: Vous pouvez ajouter la signature de votre programme
        'dans le corps du message, en faisant:
        'szMsg = szMsg & vbCrLf & vbCrLf & vbCrLf & vbCrLf & _
        '        "Application de Mail Smtp - by Camernet Development"
        
        'Apres l'envoi du corps, on envoi un point pour signaler que
        'le corps du message est terminé.
        'NOTE: le . ne sera pas ajouté dans le corps, mais sert ici comme
        'un élément pour avertir le serveur
        dsSocket1.Send = "." & vbCrLf
        
        'Après cela, le serveur va envoyer le nombre 250
        'et   Case iState=5   va gérer ce nombre en fonction de l'étape
    
    Case 221
        'Etape 6 si tout se passe bien
        
        If iState = 999 Then 'Si erreur alors... Note: Voir Case 500
            txStatus = "Disconnected from mail server after error"
        Else 'Si sans erreur alors
            txStatus = "|-| Déconnecté du serveur"
        End If
        
        'La connection est terminée, on remet l'étape courante à 0
        'et on peut envoyer un autre mail
        iState = 0
    
    'Errorrrrr, Errrooor, System Alert ! Dangerous Intrusion !
    'S'il y a une erreur durant le processus de connection, alors le serveur
    'renvoi 500 suite à l'erreur.
    'L'erreur peut provenir de:
    '- Vous n'avez pas respecté les différentes étapes du processus
    '- Il Y'a une erreur (ex. de variable) dans
    '  le programme (1 chance sur 1000, vous avez ma GARANTIE :^)
    '- Le serveur a reçu pour ordre de n'accepter aucun envoi (assez courant, lors des mises à jours)
    '- Enfin, le serveur ne vous aime pas (il trouve que vous êtes null en vb au
    '  point de créer une application Mail Smtp qui fonctionne :^)
    '  Note: C'est pas de la provocation !
    
    Case 500 To 599
        'Y a erreur, quittons avant que le serveur explose
        dsSocket1.Send = "QUIT" & vbCrLf
        txStatus = "|-| Error! Erreur dans l'envoi du Mail"
        'Le serveur va ensuite envoyer le nombre 221.
        'On met iState à 999 pour que ce soit l'erreur qui soit
        'gérée par le programme à Case 221
        iState = 999
        
End Select
End Sub

Et c tout ! Pas trop compliqué !

Conclusion

FONCTIONNEMENT
Le fonctionnement est trop simple, cherchez vous même :^)

TOUJOURS PLUS...
Ceci n'est qu'un exemple très simple, il y a encore beaucoup à faire pour qu'il devienne une vraie application MAIL !! Ex. Vous devez ajouter la fonction POP, pour la reception de mail (on verra comment, c'est sûr), Gérer les fichiers attachés, gérer le code HTML...

PROBLEME ?
S'il y a un bug, ou si vous rencontrez un problème, envoyez moi juste un mail.

Téléchargement

C'est bien beau tout ça, mais où est le programme lui-même ? Il est là, du calme :^)

          wsMail.zip - Téléchargez le zip qui contient l'application de Mail Smtp

N'oubliez pas de télécharger dsSocket.zip si vous ne l'avez pas encore fait:

          dsSocket.zip - Téléchargez le zip qui contient l'ocx dsSocket (dsSocket32.ocx) [et l'ocx principal de Winsock (MsWinSck.ocx)].

Ensuite vous le dézippez soit dans c:\windows\system (de préférence) ou dans le repertoire de votre application  et le tour est joué !

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]