Comment afficher le corps du texte d'un mail ?

Résolu
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014 - 29 déc. 2008 à 23:10
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre 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;

13 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 déc. 2008 à 14:43
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
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 déc. 2008 à 00:25
bonsoir,

is TIdText
voir à mettre un autre type..

cantador
0
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014
30 déc. 2008 à 08:06
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.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 déc. 2008 à 11:39
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014
30 déc. 2008 à 12:44
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,
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 déc. 2008 à 13:23
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
0
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014
30 déc. 2008 à 14:36
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;
0
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014
30 déc. 2008 à 16:57
Merci bcp pour ces réponses, je vais m'y atteller j'ai tout ce qu'il me faut, merci encore.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
31 déc. 2008 à 21:15
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 !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
31 déc. 2008 à 21:16
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 !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
31 déc. 2008 à 21:27
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 !
0
vieuxpere Messages postés 195 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 17 décembre 2014
1 janv. 2009 à 17:00
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.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 janv. 2009 à 19:20
Voilà.

Cordialement, Bacterius !
0
Rejoignez-nous