Abholen von Mails mit den Indy-Komponenten (TidPOP3)

Auch für das Empfangen empfiehlt es sich, die INDY-Komponenten zu verwenden. In den "hauseigenen" Komponenten habe ich kein Hinweis gefunden, wie die Authentifizierung am POP3-Server erfolgt. Hier also ein kurzen Beispiel für den Mailempfang

In das Formular ist eine TIdPOP3 (zu finden unter INDY-Clients) und eine TIdMessage (zu finden unter INDY-Misc) aufzunehmen.

Zunächt wird der Mailserver angegeben (hier GMX):

POP->Host="pop.gmx.net"; // die TidPOP3 Komponente

Dann müssen für die Authentifizierung Username und Passwort vorgegeben werden :

POP->Username="********"; // Indy 9 BCB 2006 vorher TIdPOP3->UserId
POP->Password="*******";

Vorgabe des Portes des POP3-Servers (ist auch schon so Standard):

POP->Port=110;

Nun können wir eine Verbindung herstellen:

POP->Connect();

Nun schauen wir erstmal nach ob überhaupt Mails da sind:

int AnzahlMails=POP->CheckMessages();

Im Fehlerfall wird 0 zurückgegeben. Wenn Mails da sind, können wir diese nun abholen. Dazu wird die TidMessage-Komponente benötigt, sowie ein boolscher Wert, der uns mitteilt, ob die Abholung erfolgreich war:

 
	 

In den einzelnen Teilen einer Message wird nun nachgeschaut, was enthalten ist. Ist es Text wird er wie hier in einem MemoFeld (Memo1) angezeigt. Ist es ein Anhang, wird dieser gespeichert. Dann wird die Mail von Server gelöscht.

bool ergebnis;
for(int x=1;x<=AnzahlMails;x++)
	{
	IdMessage->Clear();
 	ergebnis=POP->Retrieve(x,IdMessage);
	if(ergebnis)
		{
		if(IdMessage->MessageParts->Count>0)
			{
			for(int y=0;y<IdMessage->MessageParts->Count;y++)
			{
			TIdText *msgText= dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[y]);
			TIdAttachment *att= dynamic_cast<TIdAttachment*>(IdMessage->MessageParts->Items[y]);
			if(msgText&&msgText->ClassNameIs("TIdText"))
				{
				Memo1->Lines=msgText->Body;
				}
			else if(att&&att->ClassNameIs("TIdAttachment"))
				{
				att->SaveToFile("g:\\"+att->FileName);
				}
			}
			else
				Memo1->Text=IdMessage->Body->Text;
		
		}
	 POP->Delete(x); //Mail vom Server löschen
	}

Dies ist wirklich nur ein Demo. Das Objekt IdMessage hat natürlich noch das Subject-Feld, die ganzen Adress- und Datumsfelder die ausgewertet werden können und ggf. müssen. Jedoch ist damit erstmal ein Grundstock gelegt. Und zu guter Letzt nicht vergessen die Verbindung wieder zu schließen. Mithilfe dieses Quickies ist es dann wohl kein Problem mehr, einen eMailchecker für den Systray zu programmieren.

POP->Disconnect();

Siehe auch: Versenden einer eMail mit den Indy-Komponenten (IdSMTP)

Zur Übersicht

Beschreibung zu weiteren Indy-Komponeten: