Librarie POP3 (Julien ?)
Publié : lun. 19/sept./2005 11:56
Voici (enfin) les sources de la librairie avec quelques comentaires :
Code : Tout sélectionner
ProcedureDLL POPInit(Adresse.s,User.s,MotDePasse.s) ; Initialise la librairie POP3.
; Initialisation
; Déclaration des structures
Structure POP
IP.s
CID.l
MotPasse.s
User.s
Port.l
EndStructure
; Déclaration des variables
Global POP.POP,*Buffer.l,Liste.l,NombreMessages.l,Taille.l
*Buffer = AllocateMemory(1)
POP\Port = 110
Retour.b
If InitNetwork () = 0
ProcedureReturn 4
EndIf
; Affectation des variables
POP\IP = Adresse
POP\User = User
POP\MotPasse = MotDePasse
ProcedureReturn 0
EndProcedure
ProcedureDLL POPEnvoi(Texte.s) ; Envoi du texte au serveur.
SendNetworkString(POP\CID,Texte + Chr(13) + Chr(10))
EndProcedure
ProcedureDLL POPReceive(TailleBuffer.l) ; Reçois le texte en attente avec timer.
FreeMemory(*Buffer)
*Buffer = AllocateMemory(TailleBuffer)
If *Buffer = 0 : ProcedureReturn 2 : EndIf
Sortie.b = 1
Repeat
If NetworkClientEvent(POP\CID) = 2
Taille = ReceiveNetworkData(POP\CID,*Buffer,TailleBuffer)
If Taille = TailleBuffer
FreeMemory(*Buffer)
*Buffer = AllocateMemory(TailleBuffer) ; Ne garde que la dernière reception........Suffit pour la repcetion du serv en mettant un buffer d'environ 2000 octets
If *Buffer = 0 : ProcedureReturn 2 : EndIf
Else
Sortie = 0
EndIf
EndIf
Delay(100)
Sortie + 1
Until (Sortie = 1 Or Sortie > 110) ; Sortie > 110 est le "Timer", soit environ 11 secondes (Il faudrait trouver une meilleure méthode)
If Sortie > 110 : ProcedureReturn 7 : EndIf
EndProcedure
ProcedureDLL POPConnexion() ; Connexion et authentification au serveur.
;{ Connexion
POP\CID = OpenNetworkConnection(POP\IP,POP\Port)
If POP\CID = 0 ; Ne peut pas se connecter
ProcedureReturn 1
EndIf
POPReceive(2000)
Reception.s = PeekS(*Buffer)
If FindString(LCase(Reception),"+ok",1) = 0 ; Si on ne reçoit rien du serveur
POP\CID = 0
ProcedureReturn 3
EndIf
;}
;{ USER
POPEnvoi("USER " + POP\User)
POPReceive(2000)
Reception.s = PeekS(*Buffer)
If FindString(LCase(Reception),"+ok",1) = 0 ; Si le nom d'utilisateur est mauvais
POP\CID = 0
ProcedureReturn 5
EndIf
;}
;{ PASS
POPEnvoi("PASS " + POP\MotPasse)
POPReceive(2000)
Reception = PeekS(*Buffer)
If FindString(LCase(Reception),"+ok",1) = 0 ; Si le mot de passe est mauvais. En général, lors d'un problème d'indentification,
; c'est ici qu'une erreur est renvoyée et non lors du nom d'utilisateur.
POP\CID = 0
ProcedureReturn 5
EndIf
;}
Liste = 0
ProcedureReturn 0
EndProcedure
ProcedureDLL POPListe() ; Liste le nombre de messages et leurs tailles respectives.
POPEnvoi("LIST")
POPReceive(2000)
Reception.s = PeekS(*Buffer)
If FindString(LCase(Reception),"+ok",1) = 0 ; Si la reception de la liste ne fonctionne pas.
ProcedureReturn 6
EndIf
Reception = Left(Reception,Len(Reception) - 3)
Reception = Right(Reception,Len(Reception) - FindString(Reception,Chr(10),1))
NombreMessages = CountString(Reception,Chr(13) + Chr(10)) + 1
Dim Messages.l(NombreMessages - 1)
For i = 0 To NombreMessages - 1
Reception = Right(Reception,Len(Reception) - FindString(Reception," ",1))
Messages(i) = Val(Left(Reception,FindString(Reception,Chr(13),1) - 1))
Reception = Right(Reception,Len(Reception) - Len(Str(Messages(i))) - 2)
Next i
Liste = 1
EndProcedure
ProcedureDLL POPNombreMessages() ; Renvoi le nombre de messages contenus dans la boite email.
If Liste = 0 ; Si il y a besoin d'une mise à jour de la liste
If POPListe() = 6 : ProcedureReturn 6 : EndIf
EndIf
ProcedureReturn NombreMessages
EndProcedure
ProcedureDLL POPRetirerFichier(Nom.s,Numero.l) ; Enregistre un message dans un fichier.
If Liste = 0 ; Si il y a besoin d'une mise à jour de la liste
If POPListe() = 6 : ProcedureReturn 6 : EndIf
EndIf
If Numero > NombreMessages : ProcedureReturn 9 : EndIf ; Si le message n'existe pas
FreeMemory(*Buffer) ; Recréation de la mémoire
*Buffer = AllocateMemory(10000)
If *Buffer = 0 : ProcedureReturn 2 : EndIf
Fichier.l = CreateFile(#PB_Any,Nom) ; Création du fichier
If Fichier = 0 : ProcedureReturn 8 : EndIf
POPEnvoi("RETR " + Str(Numero))
Sortie.b = 1
Repeat
If NetworkClientEvent(POP\CID) = 2
Taille = ReceiveNetworkData(POP\CID,*Buffer,10000)
If Taille = 10000
If FindString(LCase(PeekS(*Buffer)),"+ok",1)
Chaine.s = Right(PeekS(*Buffer),Len(PeekS(*Buffer)) - FindString(PeekS(*Buffer),Chr(10),1))
FreeMemory(*Buffer) ; Recréation de la mémoire
*Buffer = AllocateMemory(Len(Chaine))
If *Buffer = 0 : CloseFile(Fichier) : DeleteFile(Nom) : ProcedureReturn 2 : EndIf
PokeS(*Buffer,Chaine)
EndIf
WriteData(*Buffer,10000)
FreeMemory(*Buffer) ; Recréation de la mémoire
*Buffer = AllocateMemory(10000)
If *Buffer = 0 : CloseFile(Fichier) : DeleteFile(Nom) : ProcedureReturn 2 : EndIf
Else
If FindString(LCase(PeekS(*Buffer)),"+ok",1)
Chaine.s = Right(PeekS(*Buffer),Len(PeekS(*Buffer)) - FindString(PeekS(*Buffer),Chr(10),1))
FreeMemory(*Buffer) ; Recréation de la mémoire
*Buffer = AllocateMemory(Len(Chaine))
If *Buffer = 0 : CloseFile(Fichier) : DeleteFile(Nom) : ProcedureReturn 2 : EndIf
PokeS(*Buffer,Chaine)
EndIf
WriteData(*Buffer,Len(PeekS(*Buffer)) - 9)
CloseFile(Fichier)
Sortie = 0
EndIf
EndIf
Delay(100)
Sortie + 1
Until (Sortie = 1 Or Sortie > 110)
If Sortie > 110 : ProcedureReturn 7 : EndIf
EndProcedure
ProcedureDLL POPTailleMessage(Numero.l) ; Renvoi la taille du message.
If Liste = 0 ; Si il y a besoin d'une mise à jour de la liste
If POPListe() = 6 : ProcedureReturn 6 : EndIf
EndIf
If Numero > NombreMessages Or Numero = 0 : ProcedureReturn 9 : EndIf ; Si le message n'existe pas
ProcedureReturn Messages(Numero -1)
EndProcedure
ProcedureDLL POPRetirerBuffer(Numero.l) ; Enregistre un message dans un buffer.
If Liste = 0 ; Si il y a besoin d'une mise à jour de la liste
If POPListe() = 6 : ProcedureReturn 6 : EndIf
EndIf
If Numero > NombreMessages : ProcedureReturn 9 : EndIf ; Si le message n'existe pas
*Pointeur = AllocateMemory(POPTailleMessage(Numero) +500) ; Création de la mémoire ; Attention pour les gros messages !!!!!!!!!!
If *Pointeur = 0 : ProcedureReturn 2 : EndIf
POPEnvoi("RETR " + Str(Numero))
Sortie.b = 1
Repeat
If NetworkClientEvent(POP\CID) = 2
ReceiveNetworkData(POP\CID,*Pointeur,POPTailleMessage(Numero) + 500)
Chaine.s = PeekS(*Pointeur)
FreeMemory(*Pointeur) ; Recréation de la mémoire
*Pointeur = AllocateMemory(Len(Chaine))
If *Pointeur = 0 : ProcedureReturn 2 : EndIf
PokeS(*Pointeur,Chaine,Len(Chaine) - 9)
ProcedureReturn *Pointeur
EndIf
Delay(100)
Sortie + 1
Until (Sortie = 1 Or Sortie > 110)
If Sortie > 110 : ProcedureReturn 7 : EndIf
EndProcedure
ProcedureDLL POPQuitter() ; Quitte correctement.
POPEnvoi("QUIT")
POPReceive(1000)
POP\CID = 0
EndProcedure
ProcedureDLL POPEffacer(Numero.l) ; Marque un message comme effacé.
If Liste = 0 ; Si il y a besoin d'une mise à jour de la liste
If POPListe() = 6 : ProcedureReturn 6 : EndIf
EndIf
If Numero > NombreMessages : ProcedureReturn 9 : EndIf ; Si le message n'existe pas
POPEnvoi("DELE " + Str(Numero))
POPReceive(5000)
If FindString(LCase(PeekS(*Buffer)),"+ok",1) = 0 ; Si il est impossible de marquer le message à effacer
ProcedureReturn 10
EndIf
EndProcedure
ProcedureDLL POPAnnuler() ; Annule les messages marqués comme effacés.
POPEnvoi("RSET")
POPReceive(5000)
If FindString(LCase(PeekS(*Buffer)),"+ok",1) = 0 ; Si il est impossible d'annuler
ProcedureReturn 11
EndIf
EndProcedure
ProcedureDLL.s POPErreurTexte(Erreur.l) ; Renvoi le texte correspondant à une erreur.
Select Erreur
Case 1
ProcedureReturn "Connection impossible."
Case 2
ProcedureReturn "Impossible d'allouer la mémoire nécessaire."
Case 3
ProcedureReturn "Pas de réponse du serveur."
Case 4
ProcedureReturn "Les commandes réseau ne peuvent pas être initialisées."
Case 5
ProcedureReturn "Login ou mot de passe invalide."
Case 6
ProcedureReturn "Impossible de récupérer le nombre de messages."
Case 7
ProcedureReturn "Le serveur n'a pas répondu."
Case 8
ProcedureReturn "Impossible de créer le fichier."
Case 9
ProcedureReturn "Le message n'existe pas, numéro inconnu."
Case 10
ProcedureReturn "Le message n'a pas pu être effacé."
Case 11
ProcedureReturn "Impossible d'enlever les marques."
Default
ProcedureReturn "Erreur inconnue"
EndSelect
EndProcedure