|
Le
protocole SMTP permet l'envoi d'e-mails. Le
tutorial ci dessous sert permet l'envoi
d'e-mails de MOINS de 1000 caractères (les
champs "from:", "to:" et
"Subject:" compris). Pour envoyer
plus de 1000 caractères ou des pièces
jointes, il faudrait utiliser la même
procédure mais avec un encodage appelé MIME.
(voir www.salemioche.com
)
InitNetwork() ; Initialise les fonctions réseau.
*Buffer = AllocateMemory(2000)
ClientID.l
;
Collecte des informations.
Serveur.s
= InputRequester("Adresse","Entrez l'adresse du
serveur SMTP","smtp.tele2.fr")
Port.s = InputRequester("Port","Entrez le port du serveur
SMTP","25")
Email_Envoi.s = InputRequester("Votre adresse","Entrez votre adresse
e-mail","olimenez@wanadoo.fr")
Email_Destinataire.s = InputRequester("Adresse du
destinataire","Entrez l'adresse e-mail du destinataire.","olimenez@wanadoo.fr")
Nom.s = InputRequester("Votre nom","Entrez votre nom","Olivier")
Eol.s = Chr(13) +Chr(10) ; End of line : Fin de ligne, permet de faire un retour à la ligne.
Global Eol,*Buffer
Procedure Controle(Numero.w)
If Val(Left(PeekS(*Buffer),3)) <> Numero ; On vérifie
si le serveur renvoi le code de validation et
non le code d'erreur, Si ce n'est pas le bon
code on renvoi 0 sinon 1. (Code pour chaque
commande plus bas)
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
EndProcedure
Procedure Envoi_Reception(ConnectionID.l,Texte.s,Numero.w)
SendNetworkString(ConnectionID,Texte
+ Eol) ; On envoi la commande sur l'IDConnection suivie de Eol, ce qui fait
comprendre au serveur que toute la commande
est envoyée.
Repeat
FreeMemory(*Buffer)
; Cette
ligne et celle du dessous servent à vider le
buffer.
*Buffer = AllocateMemory(2000)
ReceiveNetworkData(ConnectionID,*Buffer,2000)
; On reçoit
les réponses du serveur.
Debug PeekS(*Buffer)
; Fait
voir ce que l'on reçoit dans le buffer.
Until NetworkClientEvent(ConnectionID)
<> 2 ; On répète la boucle tant que toutes le données en attente ne sont
pas reçues.
ProcedureReturn Controle(Numero)
EndProcedure
Procedure Quitter(ConnectionID.l)
Envoi_Reception(ConnectionID,"QUIT",221) ; On ne
vérrifie pas la réponse car de toute façon
on va couper la connection au serveur.
CloseNetworkConnection(ConnectionID)
; On
coupe la connection.
End ; On
quitte le programme
EndProcedure
;
Connection au serveur avec l'adresse et le
port rentrés.
Debug "Connection"
ClientID = OpenNetworkConnection(Serveur,Val(Port))
If ClientID = 0 ; Si on ne peut pas se connecter au serveur
MessageRequester("Erreur","Ne
peut pas se connecter.",#MB_ICONError) : End
Else ; Sinon on continue
; On reçoit
ce que nous dit le serveur à la connection.
Repeat
FreeMemory(0) ; Cette
ligne et celle du dessous servent à vider le
buffer.
*Buffer = AllocateMemory(2000)
ReceiveNetworkData(ClientID,*Buffer,2000)
; On reçoit
les réponses du serveur.
Debug PeekS(*Buffer)
; Fait
voir ce que l'on reçoit dans le buffer.
Until NetworkClientEvent(ClientID)
<> 2 ; On répète la boucle tant que toutes le données en attente ne sont
pas reçues.
; Envoi
de la première commande : "HELO",
elle est obligatoire et doit être effectuée
en premier.
; Le
paramètre (ici "Test") est le nom
de l'émetteur.
Debug "HELO"
If Envoi_Reception(ClientID,"HELO
Test",250) = 0 ; Si la réponse serveur n'est pas égale à 250.
MessageRequester("Erreur","Ne
peut pas envoyer la comande HELO." + Eol + Left(PeekS(*Buffer),3),#MB_ICONError) : Quitter(ClientID)
; On
donne le code d'erreur renvoyé par le serveur
et on quitte.
Else ; sinon
on continue.
; Envoi
de la commande : "MAIL FROM:", elle
sert à faire connaitre l'adresse de la
personne qui a envoyé au serveur.
; Le
paramètre (ici c'est un InputRequester() )
est l'adresse de l'émetteur et doit être
entre "<" et ">".
Debug "MAIL
FROM:"
If Envoi_Reception(ClientID,"MAIL
FROM: <" + Email_Envoi + ">",250) = 0 ; Si la
réponse serveur n'est pas égale à 250.
MessageRequester("Erreur","Ne
peut pas envoyer la commande MAIL FROM:" + Eol + Left(PeekS(*Buffer),3),#MB_ICONError) : Quitter(ClientID)
Else ; sinon
on continue.
; Envoi
de la commande : "RCPT TO:", elle
sert à donner l'adresse e-mail du
destinataire.
; Le
paramètre (ici c'est un InputRequester() )
est l'adresse du destinataire et doit être
entre "<" et ">".
Debug "RCPT
TO:"
If Envoi_Reception(ClientID,"RCPT
TO: <" + Email_Destinataire + ">",250) = 0 ; Si la
réponse serveur n'est pas égale à 250.
MessageRequester("Erreur","Ne
peut pas envoyer la commande RCPT TO:" + Eol + Left(PeekS(*Buffer),3),#MB_ICONError) : Quitter(ClientID)
Else ; sinon
on continue.
; Envoi
de la commande : "DATA", elle sert
à indiquer au serveur que l'on envoi des
e-mails.
Debug "DATA"
If Envoi_Reception(ClientID,"DATA",354) =
0 ; Si la réponse serveur n'est pas égale à 354.
MessageRequester("Erreur","Ne
peut pas envoyer la commande DATA" + Eol + Left(PeekS(*Buffer),3),#MB_ICONError) : Quitter(ClientID)
Else ; sinon
on continue.
; Envoi
du message, il doit obligatoirement être
teminé par Eol + "." + Eol pour que
le serveur comprenne que le message est fini.
Icic, le dernier Eol n'apparait pas car il est
inclu dans Envoi_Reception()
;
"From:" sert à faire savoir au
logiciel de messagerie qui est l'envoyeur (pas
obligatoire).
;
"To:" sert à faire savoir au
logiciel de messagerie qui est le recepteur
(pas obligatoire).
;
"Subject:" sert à faire savoir au
logiciel de messagerie quel est l'objet (pas
obligatoire).
Debug "RCPT
TO:"
If Envoi_Reception(ClientID,"From:
" + Chr(34) + Nom + Chr(34) + " <" + Email_Envoi + ">" + Eol
+ "To: <"+ Email_Destinataire + ">" + Eol
+ "Subject: " + InputRequester("Sujet","Entrez
le sujet du message","") + Eol + InputRequester("Message","Entrez
votre message","") + Eol + ".",250) = 0
MessageRequester("Erreur","Ne
peut pas envoyer le message" + Eol + Left(PeekS(*Buffer),3),#MB_ICONError) : Quitter(ClientID)
Else ; sinon
on continue.
Quitter(ClientID)
; On
ferme la connection et on arrête le programme
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
|