menu
  Home  ==>  articles  ==>  web  ==>  lecteur_de_mails_free   

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(SenderTObject);
  Var l_mail_countl_mail_indexInteger;
  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_indexIdMessage1);
        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(SenderTObject);
  Var l_attachment_countl_attachment_indexInteger;
  Begin
    With idpop3 Do
    Begin
      Retrieve(1+ header_listview_.Selected.IndexIdMessage1);

      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_indexIs 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_indexIs 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.TextIdMessage1.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(SenderTObject);
  Var l_list_indexInteger;
  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

    lecteur_de_mail_free

  • après avoir cliqué "connect"

    connexion_pop3_free

  • puis nous chargeons les en-têtes

    entete_mails_free

  • et chargeons un mail

    lecture_de_mail_free



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" :
    Nom :
    E-mail :
    Commentaires * :
     

  • 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.
Created: jan-04. Last updated: mar-2020 - 250 articles, 620 .ZIP sources, 3303 figures
Contact : John COLIBRI - Tel: 01.42.83.69.36 / 06.87.88.23.91 - email:jcolibri@jcolibri.com
Copyright © J.Colibri   http://www.jcolibri.com - 2001 - 2020
Retour:  Home  Articles  Formations  Développement Delphi  Livres  Pascalissime  Liens  Download
l'Institut Pascal

John COLIBRI

+ Home
  + articles_avec_sources
    + bases_de_donnees
    + web_internet_sockets
      – http_client
      – moteur_de_recherche
      – javascript_debugger
      + asp_net
      – client_serveur_tcp
      – site_editor
      – pascal_to_html
      – cgi_form
      + les_logs_http_bruts
      + les_blogs
      – intraweb_tutorial
      + services_web
      – serveur_web_iis
      – client_serveur_pop3
      – lecteur_mails_free
    + services_web_
    + prog_objet_composants
    + office_com_automation
    + colibri_utilities
    + uml_design_patterns
    + graphique
    + delphi
    + outils
    + firemonkey
    + vcl_rtl
    + colibri_helpers
    + colibri_skelettons
    + admin
  + formations
  + developpement_delphi
  + présentations
  + pascalissime
  + livres
  + entre_nous
  – télécharger

contacts
plan_du_site
– chercher :

RSS feed  
Blog