Bonjour,
J'ai placé ce topic dans la catégorie Windev mais le problème que je rencontre est plus "général", il concerne plus une généralité quant à l'utilisation des protocoles POP et IMAP.
Je suis en train de créer un mini client de messagerie qui va servir à recevoir les mails de plusieurs adresses mail.
J'utilise donc les fonctions disponibles en WLangage comme indiquée dans le projet exemple "WDMAIL".
Voici en résumé à quoi ressemble ma fonction à l'heure actuelle :
Explications simplifiées :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 LOCAL oEmailRecu est un clEmail dynamique oSessionIMAP est un EmailSessionIMAP oSessionPOP est un EmailSessionPOP3 tstEmailNonLus est un tableau de Emails oSessionPOP.Nom = "User@Ndd.fr" oSessionPOP.MotDePasse = "Password" oSessionPOP.AdresseServeur = "pop.Ndd.fr" oSessionPOP.Port = 110 oSessionIMAP.Nom = "User@Ndd.fr" oSessionIMAP.MotDePasse = "Password" oSessionIMAP.AdresseServeur = "imap.Ndd.fr" oSessionIMAP.Port = 993 oSessionIMAP.Option = optionSSL EmailChangeTimeOut(15) SI EmailOuvreSession(oSessionPOP) = Faux ALORS RENVOYER(Faux) FIN EmailChangeTimeOut(10*60) bMailDejaRecu est un booléen = Faux EmailLitDernier(oSessionPOP) TANTQUE bMailDejaRecu = Faux _ET_ Email.EnDehors = Faux Si :EstLeDernierMessageRecu() ALORS bMailDejaRecu = Vrai SINON oEmailRecu = allouer un clEmail() oEmailRecu:p_stEmail.Expediteur = Email.Expéditeur ... // Traitement lié à la réception d'un email EmailLitPrécédent(oSessionPOP) FIN FIN EmailFermeSession(oSessionPOP) EmailChangeTimeOut(15) SI EmailOuvreSession(oSessionIMAP) = Faux ALORS RENVOYER(Faux) FIN EmailChangeTimeOut(10*60) tstEmailNonLus = EmailRécupèreTout(oSessionIMAP,ertNonLus) POUR TOUT objEmail DE tstEmailNonLus oEmailRecu = allouer un clEmail() oEmailRecu:p_stEmail.Sujet = objEmail.Sujet ... // Traitement lié à la réception d'un email FIN EmailFermeSession(oSessionIMAP)
En POP : Je lis le dernier email de la boite de réception et le compare avec le dernier email que j'ai recu (email stocké en HF). Si c'est le même cela veut dire que j'ai fini de traiter tous les mails recus entre mes deux synchronisation.
En Imap : Je traite les emails considérés comme non-lus sur la boite de réception.
En testant l'application, je me suis rendu compte de plusieurs problèmes :
- En POP, si le mail que j'ai stocké a été supprimé du serveur, ma boucle va remonté jusqu'au premier mail de la boite de réception en espérant retrouver le mail enregistré....
- En IMAP : Si un nouveau mail arrive et est lu par une autre application (webmail par exemple), celui-ci n'est plus considéré comme non-lu. Il ne ressort donc pas à l'appel de tous les emails non-lus de Windev. Cet email ne sera donc jamais réceptionné par mon application.
Pour faire simple, j'ai un gros problème à trouvé la bonne technique pour détecter les nouveaux mails de la boite de réception.
Mes contraintes :
- Je ne dois pas supprimer systématiquement les emails du serveur après les avoir reçus.
- Synchroniser tous les emails de la boite de réception. J'ai essayé d'utiliser la date et l'heure de ma dernière synchronisation pour traiter uniquement les emails reçus après cette date/heure. Mon problème est que le client final doit pouvoir déplacer un email d'un perso-dossier vers la boite de réception pour que l'application le traite. En me basant sur la date/heure, l'email déplacé n'est pas pris en compte s'il est plus ancien que ma date/heure...
- J'ai essayé d'enregistrer l'identifiant de chaque mail reçu. A chaque synchronisation, je traitais tous les emails de la boite de réception pour les comparer à ma liste : si l'email n'était pas dans ma liste, c'est que c'était un nouveau ! Le principe est OK mais le temps de traitement est vraiment trop long !
Bref je ne sais plus où chercher !
Est-ce que quelqu'un a une piste sur le bon algorithme à mettre en place pour une bonne détection des nouveaux mails déjà rencontré mon problème?
Partager