Entwickler-Ecke

Internet / Netzwerk - MIME Format


flowstar - Mo 02.08.04 15:51
Titel: MIME Format
Ich hole mit der Indy Pop3 Komponente eine Mail vom Server.
Ich habe folgenden Code um den Text in einem Memo Feld auszugeben:

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 - Mo 02.08.04 21:17

Hi....

Ich wurde sagen mit -->


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 - Mo 02.08.04 22:00

das is mir auch klar
Memo.Lines ist auch vom Typ TStrings

aber

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

muss ein String übergeben werden, also ein einzelner.
Geht also immernoch nicht!


BenBE - Mo 02.08.04 22:07


Delphi-Quelltext
1:
Memo1.Lines.Text := Mail.Body.Text;                    


oder über Assign:


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


Speedy78 - Mo 02.08.04 22:21

Sorry....ich meinte so :oops:


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



MfG

SPEEDY


flowstar - 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 - 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:


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:


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 - 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 - 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 - 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


einfach112 - 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 :

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