Indy
POP3 (TIdPOP3)
POP allgemein
Der Internet-Mail-Verkehr wird normalerweise über SMTP abgewickelt. Dies funktioniert jedoch nur, wenn der Zielserver, auf dem das Postfach des Empfängers liegt, ständig erreichbar ist. Der normale Internetnutzer ist mit seinem PC jedoch häufiger offline als online. Das Post Office Protocol (POP) ermöglicht es nun, dass ein Anwender sich bei seinem Mail-Provider nach Authentifizierung die Mails aus seinem Postfach auf seinen lokalen Rechner herunterladen kann. POP dient also nur zum Empfangen von Mails, nicht zum Versenden.
Siehe auch
- RFC 1939, Post Office Protocol Version 3, Mai 1996
IdPOP3
Als kleines Beispiel zur POP3-Komponente entwickeln wir eine Anwendung, die den aktuellen Inhalt eines POP3-Postfachs anzeigt.
Mit POP-Server verbinden
IdPOP31.Host := edHost.Text; IdPOP31.Port := StrToInt(edPort.Text); IdPOP31.Username := edUser.Text; IdPOP31.Password := edPassword.Text; IdPOP31.Connect;
Infos über Postfach ermitteln
CheckMessages ermittelt, wie viele Mails sich im Postfach auf dem POP-Server befinden; RetrieveMailBoxSize gibt die Größe des belegten Platzes in Bytes zurück. Hier wird durch 1024 geteilt, um den Wert in Kilobyte anzuzeigen. Zu beachten: Diese Aufrufe dürfen nicht im OnConnected-Ereignis der IdPOP3-Komponente ausgeführt werden. Dort funktionieren sie nicht.
if IdPop31.Connected then begin MailCount := IdPOP31.CheckMessages; lbMailboxSize.Caption := IntToStr(IdPOP31.RetrieveMailBoxSize div 1024) + ' KB'; lbMailCount.Caption := IntToStr(MailCount); end;
Infos über Mails abrufen
Die Methode RetrieveHeader, die die Nummer einer Mail (beginnend mit 1) und ein Objekt vom Typ TIdMessage erwartet, ermöglicht es, Informationen über eine Nachricht anzuzeigen, ohne sie komplett herunterzuladen. Als erstes muss also ein TIdMessage-Objekt instantiiert und nach Gebrauch wieder freigegeben werden. Alternativ kann auch die nicht sichtbare Komponente TIdMessage auf das Formular gesetzt und im Code verwendet werden wie in folgendem Beispiel unter dem Namen „IdMessage1“:
IdPOP31.RetrieveHeader(intIndex, IdMessage1); // Infos einer ListView hinzufügen itm := ListView1.Items.Add; itm.Caption := IdMessage1.Subject; //Betreff anzeigen itm.SubItems.Add(IdMessage1.From.Text); //Absender itm.SubItems.Add(DateToStr(IdMessage1.Date)); //Maildatum itm.SubItems.Add(IntToStr(IdPOP31.RetrieveMsgSize(intIndex))); //Mailgröße
Mail herunterladen
Die Methode Retrieve lädt die über den Index angegebene Mail vom Server herunter und speichert sie in einem IdMessage-Objekt. Daraus können dann die einzelnen Header-Daten extrahiert und in Labels angezeigt werden. Anschließend werden die weiteren Mail-Teile untersucht. Um Anhänge zu managen bietet Indy die Klasse TIdAttachment (keine Komponente). So wird bei jedem Mail-Teil geprüft, ob es sich um einen Anhang handelt (dann wird der Dateiname in einer ListView angezeigt) oder um normalen Text (dann wird er in einem Memo ausgegeben).
IdPOP31.Retrieve(ListView1.Selected.Index + 1, IdMessage1); // Anzeige aktualisieren LabelFrom.Caption := IdMessage1.From.Text; LabelRecipients.Caption := IdMessage1.Recipients.EmailAddresses; LabelCc.Caption := IdMessage1.CCList.EMailAddresses; LabelSubject.Caption := IdMessage1.Subject; LabelDate.Caption := FormatDateTime('dd mmm yyyy hh:mm:ss', IdMessage1.Date); LabelReceipt.Caption := IdMessage1.ReceiptRecipient.Text; LabelOrganization.Caption := IdMessage1.Organization; LabelPriority.Caption := IntToStr(Ord(IdMessage1.Priority) + 1); // Liste mit Mailanhängen und Mailbody for intIndex := 0 to Pred(IdMessage1.MessageParts.Count) do begin if (IdMessage1.MessageParts.Items[intIndex] is TIdAttachment) then begin li := ListViewMessageParts.Items.Add; li.Caption := TIdAttachment(IdMessage1.MessageParts.Items[intIndex]).Filename; end else begin // body text if Msg.MessageParts.Items[intIndex] is TIdText then begin Memo1.Lines.Clear; Memo1.Lines.AddStrings( TIdText(IdMessage1.MessageParts.Items[intIndex]).Body); end end; end;
Mail vom Server löschen
Die Methode Delete, der der Index der zu löschenden Mail übergeben wird, entfernt die Mail vom POP-Server.
IdPOP31.Delete(intIndex);
Verbindung trennen
Sobald die Verbindung zum Server nicht mehr benötigt wird, sollte sie getrennt werden.
IdPOP31.Disconnect;