Autor Beitrag
flowstar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 123

WinME
D6 Enterprise
BeitragVerfasst: Mo 02.08.04 15:51 
Ich hole mit der Indy Pop3 Komponente eine Mail vom Server.
Ich habe folgenden Code um den Text in einem Memo Feld auszugeben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
begin
  Mail := TIdMessage.Create(Self);
  if IDPop31.CheckMessages > 0 then
  begin
    Memo1.Lines.Clear;
    IDPop31.Retrieve(1,Mail);
    Memo1.Lines := Mail.Body;
  end;


Aber er zeigt nicht an
Lasse ich das Subject der Mail anzeigen geht es.
Wo liegt der Fehler?
Speedy78
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 02.08.04 21:17 
Hi....

Ich wurde sagen mit -->

ausblenden Quelltext
1:
Memo1.Lines.Add(Mail.Body);					


sollte es klappen ;-)

Body von Indy Pop3 ist vom Typ TStrings, und sollte deshalb im Memo auch desgleichen Typs sein...

Gruss

SPEEDY
flowstar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 123

WinME
D6 Enterprise
BeitragVerfasst: Mo 02.08.04 22:00 
das is mir auch klar
Memo.Lines ist auch vom Typ TStrings

aber
ausblenden Delphi-Quelltext
1:
Memo.Lines.Add()					

muss ein String übergeben werden, also ein einzelner.
Geht also immernoch nicht!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 02.08.04 22:07 
ausblenden Delphi-Quelltext
1:
Memo1.Lines.Text := Mail.Body.Text;					


oder über Assign:

ausblenden Delphi-Quelltext
1:
Memo1.Lines.Assign(Mail.Body);					

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Speedy78
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 02.08.04 22:21 
Sorry....ich meinte so :oops:

ausblenden Quelltext
1:
Memo1.Lines.AddStrings(Mail.Body);					



MfG

SPEEDY
flowstar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 123

WinME
D6 Enterprise
BeitragVerfasst: Mo 02.08.04 22:25 
irgendwas stimmt da glaube ich mit dem abholen nicht.
Wenn ich es so mache, wird einfach leerer TExt ins Memo geschrieben. Es scheint mir so, als wäre der Body leer. Aber ich habe extra ein paar Mails mit Inhalt an mich gesendet.
Was mach ich da falsch?
Speedy78
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 03.08.04 22:20 
Hallo flowstar...

Voraussetzung:
Auf Deiner Form ist die TIdPop3 Komponente und die TIdMessage Komponente platziert. In meinem Beispiel habe ich die Namen der Komponenten so gelassen wie sie im Objektinspektor vorgeschlagen wurden (Also TIdPop3 --> IdPop31 und TIdMessage --> IdMessage1).

Du hast im Objektinspektor in IdPop31 den Host / Passwort / Username bereits eingegeben.

Folgendes solltest Du wissen:

1. Dein Mail, das Du Dir geschickt hast z.B. mit Outlook ist nur reiner Text (Du kannst in Outlook irgendwo wählen zwischen HTML / Rich-Text oder nur-Text).

Wenn Dein Mail, dass Du jetzt abrufen möchtest also im Format "nur-Text" ist, kannst Du es so in Dein Memo laden:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
IdPop31.Connect();
IdPop31.Retrieve(1,IdMessage1); // Lade Mail 1 in die Komponente IdMessage1
Memo1.Clear;
Memo1.Lines.AddStrings(IdMessage1.Body); // Lade den Mailtext in das Memo
IdPop31.Disconnect;


Sollte Dein Mail das Du abholen möchtest im Format "HTML" sein, dann ist dies zwingend ein Multipart Mail im MIME Format.
Nun den Text jetzt in das Memo zu laden muss zuerst geprüft werden ob es nun ein Multipart oder ein nur-Text Mail ist.
Folgendes Beispiel deckt beide Varianten ab:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
var
PartIndex : Integer; // 0 für Text  1 für HTML-Text
  
  // Body-Text ... -->
  begin 
    PartIndex := 0;
    IdPop31.Connect();
    IdPop31.Retrieve(1,IdMessage1);
    If IdMessage1.MessageParts.Count = 0 Then // check nur-Text..
      Begin
        Memo1.Clear;
        Memo1.Lines.AddStrings(IdMessage1.Body);
        IdPop31.Disconnect;
        Exit;
      end;

    // Multipart Mail ... -->
    If IdMessage1.MessageParts.Items[PartIndex] is TIdText Then
      Begin
        Memo1.Lines.Clear;
        Memo1.Lines.AddStrings(TIdText(IdMessage1.MessageParts.Items[PartIndex]).Body);
        IdPop31.Disconnect;
      end;

  end;


Ich hoffe dies hilft dir für's erste :wink:

Ach ja, ist das Mail nicht Multipart, kommt es nicht drauf an, ob die Variable "PartIndex" 0 oder 1 ist...

Gruss

SPEEDY
flowstar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 123

WinME
D6 Enterprise
BeitragVerfasst: Mi 04.08.04 23:18 
wenn ich es so mache, wird im Memo Feld angezeigt: This is a multi-part message in MIME format.
Aber nicht der Text der email.
Ich frage mich langsam, ob "body" überhaupt der Text der email ist. Aber was sonst?
Speedy78
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 05.08.04 20:54 
flowstar hat folgendes geschrieben:
wenn ich es so mache, wird im Memo Feld angezeigt: This is a multi-part message in MIME format.
Aber nicht der Text der email.
Ich frage mich langsam, ob "body" überhaupt der Text der email ist. Aber was sonst?


Dies passiert, wenn Du eine Multipart Message versuchst mit meinem ersten Code-Abschnitt in das Memo zu lesen !!!

Probier es doch mal mit dem längeren Code-Abschnitt, denn der deckt beide Varianten ab.

Übrigens ist "body" der Text der E-Mail ! Lies mein obiges Beispiel nochmals aufmerksam durch und leg zum testen ein neues Projekt an. Zieh die IdMessage und IdPop31 Komponente auf deine Form, plaziere ein Memo auf der Form und einen Button. Kick den zweiten Code-Abschnitt von mir in die TForm1.Button1Click procedure vom Button und probier das ganze noch einmal...

Es funzt totsicher denn ich habs selbst bei mir ausprobiert.... :wink:

Gruss

SPEEDY
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 05.08.04 21:12 
IMHO müsste PartIndex 2 sein:

0 = MIME Benachrichtigung
1 = Textfassung
2 = HTML\RTF\Formatierte Fassung
3 ... n = Attachments

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
einfach112
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 168

xp
del7
BeitragVerfasst: So 23.04.06 22:57 
Titel: kleines problem ...
Hallo ! Ich nutze auch derzeit die idpop-kompo von indy ....
Ich habe hierbei ein kleines anderes problem !
mir macht folgendes zu schaffen ...

und zwar IdMessage selber ...
ich rufe meine mails folgendermassen ab :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);
var
i, inhalt :integer;
intIndex: integer;
   itm: TListItem;
begin

//Der Login
  idPOP31.Host := 'pop.gmx.net';
  idPOP31.Port := 110;
  idPOP31.Username := 'meineaddy@gmx.de;
  idPOP31.Password := '
passwort';
  idPOP31.Connect;
//Caption beschriften

Form1.Caption := '
Sie haben '+Inttostr(IDpop31.CheckMessages)+' Nachrichten auf dem Server, die zusammen '+InttoStr(IDpop31.RetrieveMailBoxSize div 1024)+ ' kb groß sind';
testvar :=i;
For i := 1 to IDPop31.CheckMessages do begin
IDMessage1.Clear;
inhalt:= idpop31.CheckMessages;
IDpop31.Retrieve(i,IDMessage1);
itm := lvHeaders.Items.Add;
         itm.ImageIndex := 4;
         itm.Caption :=  IDMessage1.Subject;
         itm.SubItems.Add(IDMessage1.From.Address);
         itm.SubItems.Add(DateToStr(IDMessage1.Date));
         itm.SubItems.Add((IntToStr(IDpop31.RetrieveMsgSize(i) div 1024)+'
kb'));


somit habe ich ja nun alles Emails komplett abgerufen und habe sie schön in meiner liste stehen !
wie aber kann ich jetzt dieses IDMessage1. direkt mit einer nummer ansprechen ?
mit IdPop31.Retrieve(1,IdMessage1);
muss ich mich ja dann nochmal verbinden mit dem server aber das habe ich doch schon gemacht !
die ganzen daten sind doch jeweils in den durch oben stehende schleife jeweils in den IDMessages enthalten !
ich muss doch irgendwie sagen können zeige mir von der 5ten Idmessage die runtergeladen wurde den body an ....
also irgendwie muss ich die doch in der schleife irgendwie in so ne art nummerierten temp body schreiben können oder ?!
Denn bei outlook oder thunderbird werden die mails ja auch sofort runter geladen und nicht erst dann wenn ich nen betreff anklicke


Versteht jemand was ich meine ?!
ich verstehe es zwar selber noch kaum aber hoffe mal auf das beste !
thx schonmal im voraus !
cu
einfach112

_________________
sorry bin noob !