vieuxpere
Messages postés195Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention17 décembre 2014
-
29 déc. 2008 à 23:10
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDerniè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;
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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...
vieuxpere
Messages postés195Date d'inscriptionsamedi 3 janvier 2004StatutMembreDernière intervention17 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;
// 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);
// 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);
// 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;
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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
---------------------------