Comment afficher le corps du texte d'un mail ? [Résolu]

Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
- - Dernière réponse : Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
- 1 janv. 2009 à 19:20
Bonjour, j'ai créé une application qui va rechercher les nouveaux mails reçus sur une boite spécifiée (via Indy de Delphi7), j'arrive par exemple à récupérer l'expéditeur et l'objet du message mais je n'arrive pas à récupérer le corps du texte (body).

Je ne sais pas comment faire, j'ai cru comprendre que la procédure d'extraction du corps du message était différente selon que le message a une pièce jointe ou pas, mais j'en sais pas plus et j'en suis même pas sur ...




J'ai écumé les forums et je n'ai rien trouvé, pourriez-vous m'aider, svp ?

Voici le code que j'utilise pour vérifier si j'ai de nouveaux mails :






procedure TForm11.Button3Click(Sender: TObject);


var NbrMsgs, i, j: Integer;


begin


// RECHERCHE LES NOUVEAUX MAILS


// Efface la liste
ListBox1.Clear;


//Renseignement des différentes infos de connexion
IdPOP31.Host     :=  Form2.Edit47.Text; // SERVEUR
IdPOP31.Port     := StrToIntDef(Form2.Edit46.Text, 110); // PORT
IdPOP31.Username := Form2.Edit45.Text;  // USER
IdPOP31.Password := Form2.edit40.Text; // MOT DE PASSE
try
try
//Connexion au serveur
IdPOP31.Connect;


//On récupère le nombre de messages
NbrMsgs := idPOP31.CheckMessages;
Label1.Caption:='Nombre de messages à traiter : '+IntToStr(NbrMsgs);  // NOMBRE DE MESSAGE
Label2.Caption:='Boite de réception ('+IntToStr(NbrMsgs)+')';


for i := 1 to NbrMsgs do
begin
//On récupère l'entête du ième message
IdPOP31.RetrieveHeader(i, IdMessage1);




// Si on a plusieurs parties dans le mail alors on a une pièce jointe
if IdMessage1.MessageParts.Count > 0 then
for j := 0 to IdMessage1.MessageParts.count -1 do
      begin
      // Est-ce une partie texte du mail ?
      if IdMessage1.MessageParts.Items[j] is TIdText then
      begin
      // A vous de traiter comme bon vous semble cette partie du mail
      Memo1.Lines.Add(TIdText(IdMessage1.MessageParts.Items[j]).Body.text);
      end;
      end;


//Affichage de quelques informations dans la liste
ListBox1.Items.Add(IdMessage1.Subject + ' de ' + IdMessage1.From.Address);


// Efface la liste des nouveaux messages
IdMessage1.Clear;


end;
except
// Affiche les erreurs liées au serveur distant s'il y en a
on e: exception do ShowMessage(e.Message);
end;
finally


//Le travail est terminé, on se déconnecte
IdPOP31.Disconnect;
end;
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
3
Merci
heu oui...
var
TabSubject, TabCorps : array of string;
à mettre en global dans l'unité, c'est-à-dire au dessus de implementation

pour la "Violation d'accès à la mémoire..." , il faut chercher avec un point d'arrêt où elle apparait..

cantador

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
bonsoir,

is TIdText
voir à mettre un autre type..

cantador
Commenter la réponse de cs_cantador
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Bonjour et merci de cette réponse,

Mais quel type mettre ? Pouvez-vous me donner un exemple de code à rentrer, svp.

J'ai besoin en fait de récuperer un string à afficher dans mon mémo quand je selectionne dans mon listbox un message.
Commenter la réponse de vieuxpere
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
J'ai besoin en fait de récuperer un string à afficher dans mon mémo quand je selectionne dans mon listbox un message.


Tu veux cliquer sur le sujet du message dans une listbox et avoir son texte (body) dans un mémo à côté.


Bref, ça revient à faire un emailer..


Il faut nécessairement assurer un lien entre les sujets et corps, c'est-à-dire avoir le même index.


Tu peux stocker le tout dans des tableaux de chaînes dans ta boucle :
for j := 0 to IdMessage1.MessageParts.count -1 do
et après tu fais ce que tu veux..

cantador
Commenter la réponse de cs_cantador
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Bonjour et merci de ton information, j'en arrivez en effet aussi à ce constat.

Pourrez-tu me donner quelque ligne de code de la maniére dont tu t'y prendrez pour le fair.

Merci par avance,
Commenter la réponse de vieuxpere
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
procedure TForm11.Button3Click(Sender: TObject);


var NbrMsgs, i, j: Integer;
TabSubject, TabCorps : array of string;
begin


// RECHERCHE LES NOUVEAUX MAILS


// Efface la liste
ListBox1.Clear;


//Renseignement des différentes infos de connexion
IdPOP31.Host     :=  Form2.Edit47.Text; // SERVEUR
IdPOP31.Port     := StrToIntDef(Form2.Edit46.Text, 110); // PORT
IdPOP31.Username := Form2.Edit45.Text;  // USER
IdPOP31.Password := Form2.edit40.Text; // MOT DE PASSE
try
try
//Connexion au serveur
IdPOP31.Connect;


//On récupère le nombre de messages
NbrMsgs := idPOP31.CheckMessages;
SetLength(TabSuject,NbrMsgs);
SetLength(TabCorps,NbrMsgs);

Label1.Caption:='Nombre de messages à traiter : '+IntToStr(NbrMsgs);  // NOMBRE DE MESSAGE
Label2.Caption:='Boite de réception ('+IntToStr(NbrMsgs)+')';


for i := 1 to NbrMsgs do
begin
//On récupère l'entête du ième message
IdPOP31.RetrieveHeader(i, IdMessage1);


//Affichage de quelques informations dans la liste
ListBox1.Items.Add(IdMessage1.Subject + ' de ' + IdMessage1.From.Address);

TabSubject[i] := IdMessage1.Subject + ' de ' + IdMessage1.From.Address;

// Si on a plusieurs parties dans le mail alors on a une pièce jointe
if IdMessage1.MessageParts.Count > 0 then
for j := 0 to IdMessage1.MessageParts.count -1 do
      begin
      // Est-ce une partie texte du mail ?
      if IdMessage1.MessageParts.Items[j] is TIdText then
      begin
      // A vous de traiter comme bon vous semble cette partie du mail
      Memo1.Lines.Add(TIdText(IdMessage1.MessageParts.Items[j]).Body.text);
TabCorps[j] := IdMessage1.MessageParts.Items[j]).Body.text;
      end;
      end;


// Efface la liste des nouveaux messages
IdMessage1.Clear;


end;
except
// Affiche les erreurs liées au serveur distant s'il y en a
on e: exception do ShowMessage(e.Message);
end;
finally


//Le travail est terminé, on se déconnecte
IdPOP31.Disconnect;
end;

et

PROCEDURE TForm1.ListBox1Click(Sender: TObject);
VAR
  i: integer;
BEGIN
  FOR i := 0 TO (ListBox1.Items.Count - 1) DO
    IF ListBox1.Selected[i] THEN
    BEGIN
      Memo1.Clear;
      Memo1.Lines.Add(TabCorps[i]);
    END;
END;

à voir car pas testé...mais tu as du grain à moudre...

cantador
Commenter la réponse de cs_cantador
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Avant tout, merci pour la qualité de tes réponses !
Après quelques modifications ça compile, tu vois les lignes que tu m'as fait mettre dans le code avec le commentaire « // AJOUT ».


Par contre la commande s'exécute et au bout de quelque secondes de traitement, j'ai un message d'erreur "Violation d'accès à la mémoire..." puis "Opération de pointeur incorrecte".
Ca c'est mon premier problème.

Quant au second, je pense que dans ton code pour l’événement listboxclick, le « TabCorps n’est pas initialisé, non ?



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Voici le code compilable avec tes ajouts :

var NbrMsgs, i, j : Integer;
var Evo : String;


// AJOUT
TabSubject, TabCorps : array of string;
// AJOUT


begin


// RECHERCHE LES NOUVEAUX MAILS


// Efface la liste
ListBox1.Clear;


//Renseignement des différentes infos de connexion
IdPOP31.Host     :=  Form2.Edit47.Text; // SERVEUR
IdPOP31.Port     := StrToIntDef(Form2.Edit46.Text, 110); // PORT
IdPOP31.Username := Form2.Edit45.Text;  // USER
IdPOP31.Password := Form2.edit40.Text; // MOT DE PASSE
try
try
//Connexion au serveur
IdPOP31.Connect;


//On récupère le nombre de messages
NbrMsgs := idPOP31.CheckMessages;


// AJOUT
SetLength(TabSubject,NbrMsgs);
SetLength(TabCorps,NbrMsgs);
// AJOUT


// Le nombre de méssage representera la valeur maximum du progressbar soit 100 %
ProgressBar1.Max:=NbrMsgs;


Label1.Caption:='Nombre de messages à traiter : '+IntToStr(NbrMsgs);  // NOMBRE DE MESSAGE
Label2.Caption:='Boite de réception ('+IntToStr(NbrMsgs)+')';


for i := 1 to NbrMsgs do
begin
//On récupère l'entête du Ième message
IdPOP31.Retrieve(i, IdMessage1);


// AJOUT
TabSubject[i] := IdMessage1.Subject + ' de ' + IdMessage1.From.Address;
// AJOUT


// Si on a plusieurs parties dans le mail alors on a une pièce jointe
if IdMessage1.MessageParts.Count > 0 then
for j := 0 to IdMessage1.MessageParts.count -1 do
      begin
      // Est-ce une partie texte du mail ?
      if IdMessage1.MessageParts.Items[j] is TIdText  then
          begin
          Evo:=IntToStr(i)+':';
          //Memo1.Lines.Add(Evo);
          // A vous de traiter comme bon vous semble cette partie du mail
          //Memo1.Lines.Add(TIdText(IdMessage1.MessageParts.Items[j]).Body.text);


          // AJOUT
          TabCorps[j] := TIdText(IdMessage1.MessageParts.Items[j]).Body.text;
          // AJOUT


          //ListBox2.Items.Add(Evo+TIdText(IdMessage1.MessageParts.Items[j]).Body.text);


          // Affichage du Progressbar - On incrémente le progressbar
          ProgressBar1.Position:=i;
          end;
      end;


//Affichage de quelques informations dans la liste
ListBox1.Items.Add(DateToStr(IdMessage1.Date)+' - '+IdMessage1.From.Address+' - '+IdMessage1.Subject);


// Efface la liste des nouveaux messages
IdMessage1.Clear;


end;


except
// Affiche les erreurs liées au serveur distant s'il y en a
on e: exception do ShowMessage(e.Message);
end;


finally
//Le travail est terminé, on se déconnecte
IdPOP31.Disconnect;
end;


// On réinitialise le progressBar
ProgressBar1.Position:=0;


end;
Commenter la réponse de vieuxpere
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
Merci bcp pour ces réponses, je vais m'y atteller j'ai tout ce qu'il me faut, merci encore.
Commenter la réponse de vieuxpere
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Pourquoi ne pas utiliser un TStringList plutôt qu'un array dynamique pur ?

Après tout, ce serait plus sûr, non ? (vu qu'une TStringList gère de façon interne un array of string lui-même).

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
SetLength(TabSubject,NbrMsgs + 1);
SetLength(TabCorps,NbrMsgs + 1);

Peut-être ?
Parfois j'ai cette erreur "Violation d'accès" et j'augmente la taille de mon array, et puis ça marche ...

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Bon j'ai réinstallé Indy et j'ai essayé : moi j'ai une erreur :

---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet Project1.exe a provoqué une classe d'exception EIdProtocolReplyError avec le message ' [AUTH] Error logging in. Please visit http://mail.yahoo.com
'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------

Pourtant j'ai bien un compte yahoo ... bizarre !

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
199
Date d'inscription
samedi 3 janvier 2004
Dernière intervention
17 décembre 2014
0
Merci
En tous cas, moi ca marche bien, merci à tous.
Si je peux vous aider n'hésitez pas.

Au fait,
SetLength(TabSubject,NbrMsgs + 1);
SetLength(TabCorps,NbrMsgs + 1);

Le + 1 a resolu  mon probléme de violation d'accés.
Commenter la réponse de vieuxpere
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
0
Merci
Voilà.

Cordialement, Bacterius !
Commenter la réponse de Bacterius

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.