Librarie POP3 (Julien ?)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Librarie POP3 (Julien ?)

Message par Oliv »

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
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Merci pour les sources,

j'ai vu que tu as enlevé le print (:



Par contre il y'a bien un problème avec POPNombreMessages() qui me renvoie toujours 1 qu'il y ai 0 ou 10 message sur le pop.

Par contre je ne comprend pas bien comment tu récupère tout ça, je vais voir le protocol pop

Beau boulot sinon!
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

julien a écrit :Merci pour les sources,

j'ai vu que tu as enlevé le print (:



Par contre il y'a bien un problème avec POPNombreMessages() qui me renvoie toujours 1 qu'il y ai 0 ou 10 message sur le pop.

Par contre je ne comprend pas bien comment tu récupère tout ça, je vais voir le protocol pop

Beau boulot sinon!
Je t'expliquerai un peu plus quand j'aurai récupéré le net chez moi.......d'ici la fin de la semaine j'espère
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Je peux placer mes petites remarques ? nan ? tant pis ^^
  • bon boulot ;)
  • déclare plutôt tes structures hors des procédures
  • utilise des constantes (en particulier pour les erreurs)
  • avec des contantes la fonction POPErreurTexte devient obsolète ^^
Dri :10:
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Dr. Dri a écrit :Je peux placer mes petites remarques ? nan ? tant pis ^^
  • bon boulot ;)
  • déclare plutôt tes structures hors des procédures
  • utilise des constantes (en particulier pour les erreurs)
  • avec des contantes la fonction POPErreurTexte devient obsolète ^^
Dri :10:
Merci, Pour les structures je les avais mis dedans pour tailbite, il me semblait que l'on ne pouvait pas les mettre en dehors.
Les erreurs ils faudrait utiliser des constantes mais surtout refaire complètement le système qui les donne.
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

J'ai modifié ton code pour recevoir, je n'ai pas compris pourquoi tu effacé le buffer pour garder les dernières donnée envoyé lors de la boucle (pas au début)
J'ai modifié comme ceci, et ça fonctionne avec l'autre code pour récupérer le nb de message. Je n'ai pas encore testé avec les autres fonctions

Code : Tout sélectionner


ProcedureDLL POPReceive(TailleBuffer.l) ; Reçois le texte en attente avec timer.
  FreeMemory(*Buffer)
  *Buffer = AllocateMemory(TailleBuffer)
  If *Buffer = 0 : ProcedureReturn 2 : EndIf
 Stop =0
  Sortie.b = 1
  Repeat
      If NetworkClientEvent(POP\CID) = 2
        Taille = ReceiveNetworkData(POP\CID,*Buffer,TailleBuffer)
            If Taille = TailleBuffer
            Stop  = 0
            Else
            Stop  = 1
            EndIf
      EndIf
    Delay(100)
    Sortie + 1
  Until (Stop = 1 Or Sortie > 110) ; Sortie > 110 est le "Timer", soit environ 11 secondes (Il faudrait trouver une meilleure méthode)
  If Sortie > 110 : ProcedureReturn 0 : EndIf
EndProcedure



La c'est le code pour retourner le nombre d'email, ça fonctionne

Code : Tout sélectionner

Procedure nb_message_pop()
  POPEnvoi("LIST")
  POPReceive(2000)
  Reception.s = PeekS(*Buffer)
    NombreMessages = CountString(Reception,Chr(13) + Chr(10))-1
   procedurereturn NombreMessages
   EndProcedure
Répondre