2012-04-14 7 views
1

Ich arbeite am PHP-Projekt, das E-Mails vom IMAP-Server abrufen und in der lokalen Datenbank speichern sollte. Derselbe IMAP-Server kann von anderen E-Mail-Clients wie dem Postausgang usw. verwendet werden.Wie markiere ich IMAP-Nachricht als abgerufen?

Das Problem ist, wie Sie wissen, welche Nachrichten ich bereits abgerufen habe, und was nicht? Ich denke, Suche nach Datetime zu verwenden, aber ist es zuverlässig (ich hätte Cronjob, der auf Benutzerpostfach jede Minute zugreifen würde, und nach E-Mails überprüfen, aber nicht sicher, ob Datetime einige Probleme verursachen kann, zum Beispiel wenn fast Gleichzeitig kommen kurze Nachricht und Nachricht mit großem Anhang).

Ich habe über System-Tags nachgedacht, aber der Benutzer kann sie über den E-Mail-Client ändern, damit ich mich auf sie verlassen kann und sie nicht ändern und den Client nicht verwirren will.

Als nächstes habe ich über benutzerdefinierte Tags nachgedacht, aber nicht alle IMAP-Server unterstützen sie (und unsere Software muss so flexibel wie möglich sein).

Eine gute Idee, wie ich dieses Problem lösen könnte?

Antwort

3

Verfolgen Sie die aktuell höchste synchronisierte UID des Ordners, den Sie synchronisieren, und überprüfen Sie, ob der UIDVALIDITY-Wert des Ordners übereinstimmt.

Eindeutige Bezeichner werden streng aufsteigend in der Mailbox zugewiesen; Wenn jede Nachricht der Mailbox hinzugefügt wird, erhält sie eine höhere UID als die Nachricht (en), die zuvor hinzugefügt wurde. Im Gegensatz zu Nachrichtensequenznummern sind eindeutige Identifikatoren nicht notwendigerweise zusammenhängend.

+0

http://stackoverflow.com/questions/1084780/getting-only-new-mail-from-an-imap-server fand ich eine andere ähnliche Position, und ich bekam Idee wetzen zu tun, wenn UIDVALIDITY ‚doesn t übereinstimmen. Vielen Dank! – Ivica

+0

Es gibt ein Problem. PHP imap_search Funktion unterstützt keine Suche von Nachrichten nach UID, scheint, dass ich nur Daten verwenden kann :( – Ivica