PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rudimentärer POP3 Client mit QT



TheDodger
16-01-2003, 09:43
Ich brauche einen sehr, sehr rudimentären POP3-Client.
Da ich z.Z. effektiv mit QT programmiere und ich das socket Zeuch unter C++ nur mit massiven compilerfehlern nicht zum laufen bekommen habe, nutze ich eben das QSocket Zeug aus der QT Bibliothek.

Ich bin mittlerweile auch soweit, das eine Verbindung mit dem POP-Server hergestellt wird. Authentifizierung inkl. :)

Leider komm ich nicht ganz klar, wie das die Trolls geregelt haben.
Ich möchte als ersten Step alle vorhanden Mails auf dem Server haben.
Krieg ich ja mit STAT, und nachher möchte ich von bestimmten Mails nur den Header haben ... und da fängt das ganze ominös zu werden.

In einer whil schleife frage ich dann die Mails ab [mit RETR x]
Jetzt werden aber Teile der 2.Mail irdendwo in die erste mit reinkopiert und so weiter.
Äusserst ungünstig das ganze. :(

Kann ich das nicht irdendwie anders lösen?
Meinethalben auch ohne QT.

anda_skoa
16-01-2003, 11:21
Eine while Schleife mit QSocket Zugriff ist schelcht, weil QSocket über die Eventloop arbeitet.

Du kannst natürlich in der while Schleife qApp->processEvents() machen, um die anstehenden Sachen zu bearbeiten, besser wäre es aber, wenn man einfach den Befehl an den Server schickt und erkennt, wann die Antwort da ist, um dann den nächsten Befehl zu senden.

Praktisch eine Art Statemachine.

Wenn es aus irgendwelchen Gründen notwending ist, blockierend zu arbeiten, dann kann man statt QSocket ein QSocketDevice benutzen.

Ciao,
_

TheDodger
16-01-2003, 14:59
Nun, while Schleife ist villeicht nicht ganz richtig ...
Ich kann dir gern mal den Code schicken, weil er etwas länger ist und wahrscheinlich hier ehh OffTopic werden würde.

TheDodger
16-01-2003, 15:44
Original geschrieben von anda_skoa
... besser wäre es aber, wenn man einfach den Befehl an den Server schickt und erkennt, wann die Antwort da ist, um dann den nächsten Befehl zu senden.

Praktisch eine Art Statemachine.


Nur wie?

anda_skoa
16-01-2003, 16:18
Dafür kenn ich das Protokoll zu wenig.

Ich denke an etwa so etwas:

Eine Klasse, die intern einen QSocket hat und auf dessen Signals entsprechende Slot connectet hat.

Die Klasse hat dann ähnliche Signals.

zB Klasse heißt POP3
(Pseudo Code)



POP3* pop = new POP3();
connect(pop, SIGNAL(connected()), this, SLOT(slotConnected());
//..

pop->connectToHost(...);


Dann in Folge


connect(pop, SIGNAL(mailReceived(const Mail&)), this, SLOT(slotMailReceived(const Mail&)));

pop->fetchMail(...); // hier ist ... die ID der mail, wie auch immer das aussieht.


fetchMail schickt die Andorderung und returned.
Der Server schickt nun die Mail, was am Socket radyRead() Signals auslöst.
Die POP3 Klasse baut darauf eine Instanz der Klasse Mail (oder einen QString) und emittet das mailReceived Signal, sobald die mail aus ist.
Ich nehme an, dass das Ende einer Mail im POP Protokoll spezifiziert ist.

Wenn das Signal eintrifft, siehst du in einer Liste nach, ob du noch an weiteren Mails interessiert bist und wenn ja, rufts du entsprechend fetchMail auf.

Ciao,
_