Home » Tutorials » Netzwerk und Internet » Indy

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

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;

Beispielprogramm