Autor Beitrag
curtiss
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Do 02.07.09 15:30 
Hi,

ich hab nen kleinen email prozess, der zZ leider immer alle emails des entsprechenden pop3 Kontos abruft. Der Anwender hat die Option nur eine Kopie zu ziehen und holt sich somit immer wieder die gleichen und dann noch 1-2 aktuelle e-mails.

Mein gedanke den Zeitpunkt des letzten abrufs mit dem Absendedatum der E-Mail zu vergleichen ging nicht mehr auf, als ich gelesen hab das dieses datum völlig willkürlich und somit bedeutungslos ist.

Eine Prüfsumme über absender empfänger betreff absendedatum wäre zu imperformant.

Gibt es die Möglichkeit an ein empfangsdatum der Email zu kommen, welches vom POP3 server gesetzt wird? Das wäre ja vertrauensvoll und somit ne sichere sache, wenn ich es mit dem zeitpunkt des letzten abrufs vergleiche...

Ich nutze delphi 7 und die indy 9 Komponenten. Hab schon ein bisschen gegoogelt aber nichts gefunden. Wäre nett wenn mir jemand helfen könnte. Ich bin bestimmt nicht der erste der so eine Funktionalität haben möchte, bzw. realisiert hat.

In diesem Sinne, Curtiss.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

hab grad die property UID (Unique Identifier) gefunden. Ist diese Eindeutig? Sie müsste dann ja vom POP3 Server gesetzt werden und auf diesem wiederum eindeutig sein oder?

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

UID wäre aber wohl auch zu imperformant... alle emails des kontos mit allen vorhandenen emails vergleichen... das kann dann irgendwann schon ne ziemliche weile dauern.

Am besten wäre es auf das empfangsdatum zu prüfen, nur wie komm ich daran?

TIdPOP3 bietet soweit ich weis nicht die öglichkeit alle neuen emails oder alle email ab einem datum abzurufen, womit ich zumindest immer alle vorhanden header laden muss.

TIdMessage bietet aber auch nicht die möglichkeit das empfangsdatum zu liefern. Zumindest nicht in jedem fall wie ich gelesen habe siehe (forum.delphi-treff.d...howthread.php?t=9800).

Scheint so als stände ich mit meinem Problem allein da. Eine Idee war einen Regulären Ausdruck auf die Header anzuwenden, da im Header das empfangsdatum der E-Mail steht. aber dazu hab ich auch nicht viel gefunden.....
curtiss Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Do 09.07.09 10:05 
da die UID auch nicht immer gesetzt sein muss (Hängt vom Server ab) hab ich nun doch nen Hash gebildet und vergleiche diesen bei weiteren importen. Es ist zwar nicht umbedingt performant aber wohl die einzige Lösung. Man ist vom POP3 Protokoll her gezwungen, da es nichts eindeutiges gibt, alle Header zu holen und zu vergleichen.

Ich würde mir gerne andere Lösungsansätze ansehen, aber es ist nichts im Netz zu finden....
Wie zuvor gesagt, bin ich denn der einzige? Liest das hier überhaupt wer? :lol:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Do 09.07.09 10:57 
Die vom POP3-Server gesendete Liste mit X-UIDL-Einträgen sollte (laut Standard) jede Mail über ihre gesamte Existenz auf dem Server eindeutig identifizieren. Dies funktioniert auch bei einer vielzahl von Servern. Von daher reicht es oft, sich die Liste der X-UIDLs zu merken, die man bereits kennt. Taucht nun eine neue Mail auf, so ist auch die X-UIDL neu. Diese Liste darf nicht mit dem Message-Id-Header nach RFC 2822 sowie den Angaben aus RFC 821 verwechselt werden. Der Message-Id-Header kann als Grundlage für einen Message-Hash eingesetzt werden. Weitere Felder, die hier genutzt werden können, sind Date, From, To, CC, Content-Type (Bei Multipart-Mime-Messages enthält dieser einen Trenner, der für jede Mail eindeutig ist), sowie die zahlreichen Received-Zeilen. Viele POP3-Server bieten zudem die Möglichkeit, nur die Header einer Mail herunterzuladen.

Hatte mit dem doppelten Download von Mails aber auch schon mit Herrn Hauck (Autor des JanaServers) meine Freude: RFC822 (und RFC2822) lassen es nämlich zu, für die Duplikat-Prüfung von eMails die X-UIDL-Liste des POP3-Servers zu ignorieren (im RFC steht an der betreffenden Stelle SHOULD und nicht MUST). Bei einem defekten POP3-Server meines Providers bekam ich nun leider bei jedem Abruf andere X-UIDLs geliefert... Den Kompromiss der Header-Prüfung wollte Herr Hauck nicht umsetzen, obwohl er (selbst wenn nicht Default) im Einklang mit dem RFC gewesen wäre und auch mit defekten POP3-Servern besser funktioniert hätte (war noch zu ISDN-Zeiten, wo 300KB eine Ewigkeit für den DL gebraucht haben).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
curtiss Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Do 09.07.09 15:18 
Hey! Einer meldet sich ^^

Ok. Ich bilde mir ja nun wie gesagt nen Hash, damit bin ich auf der sicheren Seite. Was allerdings immernoch zeitraubend ist, ist sich jedesmal alle Header zu holen(auch wenn diese vieleicht schon 3 mal geprüft wurden und immernoch keine neue dabei ist...)

Meine Idee war nun folgende:

Ich hab beim ersten mal 10 mails im konto also ID 1 bis 10.
Diese werden geprüft und ich merke mir 10 Mails sind geprüft.
Bei der nächsten Prüfung habe ich 12 mails im konto und würde nun 12-10 = 2 Mails abrufen (ID 11 und 12) statt alle 12.

Das wirft allerdings so einige Fragen auf, auf die ich wie so oft noch keine antworten gefunden habe.

Wenn der Benutzer die Mail mit der id 5 löscht, rutschen dann 6-10 auf? Oder was passiert mit denen?
Wenn neue Mails kommen, haben die dann ID 1 oder ID 11 wenn zuvor 10 mails da waren?

Ich kann ja nicht unbedingt von einem Server mit dem ich grad arbeite/teste auf alle anderen schliessen!?

Gibst dafür vll. auch n RFC?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 10.07.09 10:35 
Jeder POP3-Server liefert dir eine Liste der Mails anhand einer (server-generierten) ID (oben genannte X-UIDL-Liste). Diese kann beliebig angeordnet werden, aber jede Mail, die dort auftaucht, bekommt immer wieder (i.d.R.) die gleiche ID (außer halt oben beschriebener Bug, den ich mal hatte). Du musst dir daher die X-UIDLs der Mails merken, die du bereits bearbeitet hast. Jede Mail, deren XUIDL du noch nicht kennst, lädst Du runter und prüfst deren Hash; alle anderen kannst Du ignorieren.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
curtiss Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Fr 10.07.09 11:34 
Wie rufe ich denn diese X-UIDL Liste ab? Ich zieh mir zZ wie gesagt alle Header und prüfe dann...
Nutze allerdings auch Indy 9 und Delphi 7 nicht das du da was anderes genutzt hast, ich hab soweit ich weis und in der doku gelesen habe nur zugriff auf UID einer einzigen mail / header und muss somit alle abrufen...
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Fr 10.07.09 12:32 
Ich würde es mal mit dieser Funktion versuchen:
ausblenden Delphi-Quelltext
1:
function TIdPOP3.UIDL(const ADest: TStrings; const AMsgNum: Integer = -1): Boolean;					

Damit kannst du die UIDL für eine bestimmte MessageID abfragen.
Wenn du aber keine ID angibst, solltest du die komplette Liste bekommen.
curtiss Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 59



BeitragVerfasst: Mo 13.07.09 10:41 
oh mann.....
@SvenAbeln : Ich fühl mich so doof ^^. Das is genau das was ich brauche. Jetzt läuft alles perfekt.
@BenBE : Und du hast es auch schon gesagt -.-' Aber ich dachte du meinst UID. Mit den UIDs hatte ich es ja schon probiert mir aber einzeln alle header gezogen usw. UIDL gibt mir ja A ne gesamt übersicht des Postfachs und b eindeutige ids zu einer mail...


Ich fühl mich grad n bissl doof aber danke für eure Hilfe!