Lecteur de mails FREE - John COLIBRI. |
- résumé : un lecteur pour les mails FREE. Utilise Indy POP3 SSL. Affiche la liste des mails, lecture et sauvegarde d'un mail sélectionné avec sauvegarde du texte et des pièces jointes
- mots clé : lecteur de mails, POP3, IMAP, tIdPop3, SSL, Secure Socket Layer, tIdSSLIOHandlerSocket
- logiciel utilisé : Delphi 7
- matériel utilisé : intel i3-8100, 3.6 gHz, 8GB memory, 128 G and 1 T hard
disc
- champ d'application : Delphi 1 à 7, 2006 à 2010, Xe
- niveau : développeur Delphi
- plan :
1 - Lire ses mails FREE Ayant crée un nouveau compte de mail FREE en vue d'un article, je n'arrivais pas lire ces mails par mon lecteur standard (écrit en Delphi 6 en utilisant les Sockets Windows).
Il s'avère que FREE utilise (actuellement par défaut) un serveur POP3 qui utilise le cryptage SSL (Sedure Socket Layer), ce que mon lecteur ne sait pas faire.
Cet article présente donc un lecteur simple utilisant INDY avec la couche SSL.
2 - Lecteur de mails Delphi Indy 2.1 - Principe
J'ai choisi de lire mes mails en utilisant le protocole POP3 (plutôt que IMAP ou un autre). Il faut donc utiliser les composant POP3 client Indy, ainsi que les composants pour gérer SSL
2.2 - Le client POP3 SSL Indy
Pour construire ce projet | créer une application Delphi VCL | |
poser un client tIdAntiFreeze (utilisé pour tous les clients Indy) | | poser un tIdSSLIOHandlerSocket
- initialiser SslOptions.Method à sslvSSLv23
| | poser un tIdPop3 (le client POP3) et initialiser - Host à pop3.free.fr
- Port : 995
- UserName avec votre nom utilisateur, ici drop.owner
- PassWord avec votre mot de passe, ici aa123abbb
De plus IoHandler doit référencer IdSSLIOHandlerSocket1 |
| poser un tIdMessage sur la forme | 2.3 - Connexion Pour connecter, if faut appeler \tIdPop3.\Connect
2.4 - Lecture des messages Pour lire les messages, nous avons choisi de procéder en deux étapes: - nous récupérons les en-têtes (From, To, Subject etc) et les affichons dans
une tListView. tIdPop3.CheckMessages nous fournit le nombre de messages et tIdPop3.RetrieveHeader remplit IdMessage1 avec les en-têtes d'un messages
- le clic sur la tListView lit le message et l'affiche
Voici la procédure qui lit les messages et les affiche dans la tListView:
Procedure TForm1.messages_Click(Sender: TObject);
Var l_mail_count, l_mail_index: Integer; Begin
With idpop3 Do Begin
header_listview_.Items.Clear;
If Not Connected
Then Exit;
l_mail_count:= CheckMessages;
mail_count_label_.Caption:= IntToStr(l_mail_count);
mail_size_label_.Caption:= IntToStr(RetrieveMailBoxSize Div 1024)+ ' K';
For l_mail_index := 1 To l_mail_count Do
Begin
RetrieveHeader(l_mail_index, IdMessage1);
With header_listview_.Items.Add Do
Begin
Caption := idMessage1.Subject;
SubItems.Add(idMessage1.From.Text);
SubItems.Add(DateToStr(idMessage1.Date));
SubItems.Add(idMessage1.Uid);
SubItems.Add(IntToStr(RetrieveMsgSize(l_mail_index)));
End; // with header_listview_
End; // for l_mail_index
End; // with idpop3 End; // messages_Click |
2.5 - Affichage d'un messages En cliquant une ligne de la tListView, nous récupérons le numéro du message. Puis - nous appelons tIdPop3.Retrieve qui garnit IdMessage1
- IdMessage1 a de nombreuses propriétés dont
- From, Subject etc
- MessagesParts qui contient
- soit du texte si le type d'attachement est tIdText
- soit un fichier dans le cas contraire
- si le messages est simple (sans parties MIME), le texte du message est contenu dans tIdMessages.Body
Voici notre procédure :
Procedure TForm1.header_listview_Click(Sender: TObject);
Var l_attachment_count, l_attachment_index: Integer;
Begin With idpop3 Do
Begin
Retrieve(1+ header_listview_.Selected.Index, IdMessage1);
from_label_.Caption := IdMessage1.From.Text;
to_label_.Caption := IdMessage1.Recipients.EmailAddresses;
cc_label_.Caption := IdMessage1.CCList.EMailAddresses;
subject_label_.Caption := IdMessage1.Subject;
date_label_.Caption := FormatDateTime('dd mmm yyyy hh:mm:ss', IdMessage1.Date);
priority_label_.Caption := IntToStr(Ord(IdMessage1.Priority) + 1);
receipt_label_.Caption := IdMessage1.ReceiptRecipient.Text;
organization_label_.Caption := IdMessage1.Organization;
// idMessage1.SaveToFile(l_save_mail_file_name+ '.txt');
mail_body_memo_.Lines.Clear;
l_attachment_count:= IdMessage1.MessageParts.Count;
For l_attachment_index := 0 To l_attachment_count- 1 Do
// tIdAttachmentFile for indy 10
If IdMessage1.MessageParts.Items[l_attachment_index] Is TIdAttachment
Then // general attachment
With attachment_listview_.Items.Add Do
Begin
Caption := TIdAttachment(IdMessage1.MessageParts.Items[l_attachment_index]).Filename;
SubItems.Add(TIdAttachment(IdMessage1.MessageParts.Items[l_attachment_index]).ContentType);
// mail_body_memo_.Lines.SaveToFile(l_save_mail_file_name+ Caption);
End
Else // body text
If IdMessage1.MessageParts.Items[l_attachment_index] Is TIdText
Then Begin
mail_body_memo_.Lines.Assign(TIdText(IdMessage1.MessageParts.Items[l_attachment_index]).Body);
// mail_body_memo_.Lines.SaveToFile(l_save_mail_file_name+ '_txt.txt');
End
Else display(IdMessage1.MessageParts.Items[l_attachment_index].ClassName);
// -- the body is not always parsed as a message part
If IdMessage1.Body.Text<> ''
Then mail_body_memo_.Lines.Text:= mail_body_memo_.Lines.Text+ IdMessage1.Body.Text;
End; // with idpop3 End; // header_listview_Click |
Notez que - en Indy 10 il y a un type tIdAttachmentFile (au lieu de tIdAttachment en Indy 9)
- notre code (celui dans le .ZIP) comporte aussi une mécanique de sauvegarde
des messages lus
2.6 - Effacement des mails Il suffit d'appeler tIdPop3. Delete en fournissant le numéro du mail
Dans notre cas, nous avons utilisé une tListView avec MultiSelect à True et HideSelection à False, et la procédure est :
Procedure TForm1.delete_selected_Click(Sender: TObject);
Var l_list_index: Integer; Begin
With header_listview_ Do
For l_list_index:= 0 To Items.Count- 1 Do
If Items[l_list_index].Selected
Then IdPop3.Delete(1+ l_list_index);
End; // delete_selected_Click |
Notez que
- l'effacement n'est effectif que lorsque nous appelons tIdPop3.Disconnect
2.7 - Déconnexion Nous appelons tIdPop3.DisConnect
2.8 - Librairies SSL
Pour que le programme fonctionne il faut assi placer dans le répertoire de l'EXE les librairies SSL utilisée par Indy: libeay32.dll ssleay32.dll
2.9 - Demo - voici la forme
- après avoir cliqué "connect"
- puis nous chargeons les en-têtes
- et chargeons un mail
3 - Commentaires 3.1 - Fonctionnement des mails Free Tout d'abord soulignons que nous utilisons FREE gratuitement. Donc je ne suis
pas réellement en bonne position pour les critiquer (encore que, si je ne payais pas FREE directement, je payais Orange qui ristournait une partie de mon payement à FREE. FREE est certes un bon nom commercial, mais juridiquement ...)
J'ai utilisé Free tout au début, avec des modems. Lorsque j'ai commencé à utiliser Internet, j'ai cotisé un peu pour avoir ADSL (tout en gardant mes mails @free.fr). Lorsqu'ils ont commencé à "dégrouper"
(utiliser leurs serveurs plutôt que ceux qu'ils louaient à France telecom), il arrivait que les opérateurs foiraient leur connexion. J'ai donc été déconnecté, sans aucun préavis. Impossible de joindre qui que ce soit. Sur Internet des
clients hurlaient et parlaient de procès. Soit disant nous n'étions pas des "clients professionnels". J'ai même utilisé une procédure où un employé de Free et un employé de France Telecom allaient examiner le problème. Sans aucun
résultat, chacun accusant l'autre. J'imagine que Free était bien trop occupé à "dégrouper" d'autres clients, et France Telemcom, dépité de leur réduction de loyer, faisait sa mauvaise tête. De rage je leur ai jeté ma FreeBox à la figure
avec le chèque de 99 euros qu'ils réclamaient. Je me suis alors inscrit à France Telecom chez qui je suis toujours, et qui me permet en plus d'avoir un IP fixe pour le site sur lequel se trouve cet article.
Free m'ai ensuite proposé, de nombreux mois plus tard, de me réabonner. J'imagine qu'ils avaient fini de dégrouper le reste de la France, et essayaient de récupérer les quelques clients perdus dans la bagarre. Je ne vous dirai pas
ici ce que je leur ai répondu.
Episode 2. Vers 2017 ma femme ne pouvait plus recevoir ses mails Free. En farfouillant un peu sur Internet, je me suis apperçu qu'ils utilisaient un
nouveau système "zimbra", et les paramètres de l'ancienne boite ne permettaient pas de lire ces mails. Lorsque la "nouvelle" boite était pleine, le compte FREE gérant les deux boîte se figeait. Comment les mails étaient répartis entre
l'ancien système et le nouveau reste un mystère. Il fallait alors utiliser https://zimbra.free.fr/zimbra.pl pour pouvoir lire les "nouveaux" mails et purger cette boite et pouvoir enfin utiliser les "anciens" mails.
Episode 3: pour un article il me fallait une nouvelle boite. J'ai naivement pensé qu'il serai plus simple (et depuis mon PC de dev) de créer ce compte sur Free. Ce que j'ai fait. Juste après la création, l'envoi de mails par le SMPT
orange ne fonctionnait pas. Il faut environ 2 heures à FREE pour mettre en place la nouvelle boite mail, ce qui est compréhensible. Au bout de deux heures j'ai pu envoyer un mail sans erreur, mais mon lecteur de mail Delphi 6 ne
récupérait rien. J'ai alors compris que la nouvelle boite utilisait la nouvelle mécanique FREE. J'ai alors utilisé leur lecteur de mail internet, et l'ai bien vu mes messages. Notez qu'il faut à présent utiliser
https://webmail.free.fr/?_task=mail&_mbox=INBOX et que "zimbra" a été remplacé par "roundcube". Soit. Mais pour mon article, je souhaitais lire mes mails par un programme Delphi, et
pas par leur lecteur Internet. J'ai donc passé encore un peu de temps à farfouiller, et j'ai finalement trouvé un article mentionnant qu'ils utilisaient SSL sur le port 995. Un heure plus tard le programme fonctionnait. D'où cet article
3.2 - Ecriture du lecteur Attention, le lecteur a été écrit en une heure et n'a pas subit de tests approfondis. Je dégage aussi toute responsabilité si vous perdez des mails. En fait dans le
.ZIP j'ai exclu cette partie (Exit en début de procédure)
3.3 - Sauvegarde des mails Dans le .ZIP j'ai laissé ma mécanique de sauvegarde. Elle permet
- de sauvegarder le texte complet du mail (avant analyse par Indy) dans un fichier .txt
Pour les curieux, voici le texte envoyé par Free:
Return-Path: <jcolibri@jcolibri.com> Delivered-To: drop.owner@free.fr Received: from smtp.smtpout.orange.fr (mx23-g26.priv.proxad.net [172.20.243.93]) by toaster8-g26.priv.proxad.net (Postfix) with ESMTP id CCDC3BC0531
for <drop.owner@free.fr>; Wed, 6 Nov 2019 14:47:55 +0100 (CET) Received: from smtp.smtpout.orange.fr ([80.12.242.124]) by mx1-g20.free.fr (MXproxy) with ESMTPS for drop.owner@free.fr
(version=TLSv1/SSLv3 cipher=AES128-SHA bits=128); Wed, 6 Nov 2019 14:47:55 +0100 (CET) X-ProXaD-SC: state=HAM score=0 X-ProXaD-Cause: (null) Received: from elex2 ([80.14.229.224]) by mwinf5d55 with ME
id Ndnr2100A4r85Vs03dnvTt; Wed, 06 Nov 2019 14:47:55 +0100 X-ME-Helo: elex2 X-ME-Auth: ZGFuaWVOkUU0ZXBoOgUfd2FuYWRvby5mcg== X-ME-Date: Wed, 06 Nov 2019 14:47:55 +0100 X-ME-IP: 80.14.229.224
Message-ID: <de9d37ad4ec9434304f403debfd362c5@mwinf5d55.me-wanadoo.net> From: "John COLIBRI" <jcolibri@jcolibri.com> Subject: mail pour test de lecteur FREE To: "DropBox" <drop.owner@free.fr>
Date: Wed, 6 Nov 2019 14:47:52 +0100 X-Priority: 3 X-Library: Indy 9.00.10 Return-Path: <jcolibri@jcolibri.com> Delivered-To: drop.owner@free.fr Received: from smtp.smtpout.orange.fr (mx23-g26.priv.proxad.net
[172.20.243.93]) by toaster8-g26.priv.proxad.net (Postfix) with ESMTP id CCDC3BC0531 for <drop.owner@free.fr>; Wed, 6 Nov 2019 14:47:55 +0100 (CET) Received: from smtp.smtpout.orange.fr ([80.12.242.124])
by mx1-g20.free.fr (MXproxy) with ESMTPS for drop.owner@free.fr (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128); Wed, 6 Nov 2019 14:47:55 +0100 (CET) X-ProXaD-SC: state=HAM score=0 X-ProXaD-Cause: (null)
Received: from elex2 ([80.14.229.224]) by mwinf5d55 with ME id Ndnr2100A4r85Vs03dnvTt; Wed, 06 Nov 2019 14:47:55 +0100 X-ME-Helo: elex2 X-ME-Auth: ZGFuaWVOkUU0ZXBoOgUfd2FuYWRvby5mcg== X-ME-Date: Wed, 06 Nov 2019 14:47:55 +0100
X-ME-IP: 80.14.229.224 Message-ID: <de9d37ad4ec9434304f403debfd362c5@mwinf5d55.me-wanadoo.net> From: "John COLIBRI" <jcolibri@jcolibri.com> Subject: mail pour test de lecteur FREE To: "DropBox" <drop.owner@free.fr>
Date: Wed, 6 Nov 2019 14:47:52 +0100 X-Priority: 3 X-Library: Indy 9.00.10 Bonjour, test de mail FREE Bien cordialement J Colibri Tel 01.42.83.69.36 . |
Notez au passage que le texte mentionne SSL v3, alors que le lecteur Indy doit utiliser v23. La lecture SSL est d'ailleurs très sensible à ce paramètre. - puis le corps du mail est sauvegardé en .TXT, et chaque pièce jointe
sauvegardée (mais pas exécuté) en tant que fichier
Pour la petite histoire, je m'étais lancé dans l'écriture d'un lecteur de mail parce que les premiers lecteurs Microsoft avaient la fâcheuse tendance d'ouvrir
systématiquement les pièces jointes. Comme mon mail est affiché sur chacune de mes pages, j'ai droit tous les matins à 100 ou 200 spams. Et les lecteurs Microsoft s'empressaient de lancer tous les virus que ces admirateurs anonymes
ne manquaient pas de m'envoyer. En fait les mails bruts tels qu'ils sont reçus par TCP no contiennent que du texte (et même en 7 bits de surcroît). Donc aucun virus ne peut s'exécuter. Si
ensuite nous analysons les parties MIME pour en extraire des fichiers .DOC ou autre, ces fichiers-là peuvent contenir des virus. Mais si personne ne les ouvre avec WORD, ce virus ne fera pas grand mal à quiconque.
Si un mail contient en pièce jointe de .DOC ou .ZIP ou autre .XLS, ces pièces jointes seront bien sauvegardées comme des .DOC, .ZIP etc, mais c'est à moi de décider si je souhaite lancer le lecteur adéquat
Mentionnons que notre lecteur actuel n'effectue pas une sauvegarde automatique de chaque mail lu. C'est après la lecture que l'utilisateur décide de sauvegarder ou non. Il fournir un nom et c'est ce nom qui est utilisé pour
sauvegarder le mail et ses pièces jointes
3.4 - Améliorations De nombreuses améliorations sont possibles - utiliser IMAP plutôt que POP3 (IMAP serait plus flexible, mais comme j'ai commencé avec POP3...)
- ajouter la partie "envoi de mails"
- ajouter une redirection pour lancer des lecteurs de pièces jointes dédiés (Acrobat ou Word) lorsque la pièce jointe est de type courant (.PDF, .DOC)
- passer en Indy 10
- mettre le programme sous Delphi XE, éventuellement en FireMonkey sur Android
- rendre la tListView triable par colonne (cf
tListView triable)
3.5 - Liens Quelques liens:
- Indy Pop3 Client Server : un exemle simple d'un serveur et d'un lecteur d'email Indy : les instructions de démarrage /
connexion, les commandes POP3 pour lister et lire les e-mails, l'affichage de la lecture de mails. Sources Delphi, diagrammes de Classe
- tListView triable) en cliquant sur le titre d'une colonne
4 - Télécharger le code source Delphi Vous pouvez télécharger:
Ce .ZIP qui comprend: - le .DPR, la forme principale, les formes annexes eventuelles
- les fichiers de paramètres (le schéma et le batch de création)
- dans chaque .ZIP, toutes les librairies nécessaires à chaque projet (chaque
.ZIP est autonome)
Ces .ZIP, pour les projets en Delphi 6, contiennent des chemins RELATIFS. Par conséquent: - créez un répertoire n'importe où sur votre machine
- placez le .ZIP dans ce répertoire
- dézippez et les sous-répertoires nécessaires seront créés
- compilez et exécutez
Ces .ZIP ne modifient pas votre PC (pas de changement de la Base de Registre, de DLL ou autre). Pour supprimer le projet, effacez le répertoire.
La notation utilisée est la notation alsacienne qui consiste à préfixer les identificateurs par la zone de compilation: K_onstant, T_ype, G_lobal,
L_ocal, P_arametre, F_unction, C_lasse. Elle est présentée plus en détail dans l'article La
Notation Alsacienne
Comme d'habitude: - nous vous remercions de nous signaler toute erreur, inexactitude ou
problème de téléchargement en envoyant un e-mail à jcolibri@jcolibri.com. Les corrections qui en résulteront pourront aider les prochains lecteurs
- tous vos commentaires, remarques, questions, critiques, suggestion d'article, ou mentions d'autres sources sur le même sujet seront de même les bienvenus à jcolibri@jcolibri.com.
- plus simplement, vous pouvez taper (anonymement ou en fournissant votre e-mail pour une réponse) vos commentaires ci-dessus et nous les envoyer en cliquant "envoyer" :
- et si vous avez apprécié cet article, faites connaître notre site, ajoutez un lien dans vos listes de liens ou citez-nous dans vos
blogs ou réponses sur les messageries. C'est très simple: plus nous aurons de visiteurs et de références Google, plus nous écrirons d'articles.
5 - L'auteur
John COLIBRI est passionné par le développement Delphi et les applications de Bases de Données. Il a écrit de nombreux livres et articles, et partage son temps entre le développement de projets (nouveaux projets, maintenance, audit, migration BDE, migration Xe_n, refactoring) pour ses clients, le
conseil (composants, architecture, test) et la
formation. Son site contient des articles
avec code source, ainsi que le programme et le calendrier des stages de formation Delphi, base de données, programmation objet, Services Web, Tcp/Ip et
UML qu'il anime personellement tous les mois, à Paris, en province ou sur site client. |