Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen (https://www.delphipraxis.net/215477-tidimap4-identifizieren-ob-anhang-vorhanden-ohne-ganze-nachricht-runterzuladen.html)

AuronTLG 11. Jul 2024 14:57

TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Moin,

ich hätte mal ein kleines Problem, zu dem ich aber gerade keine Lösung finde, lustigerweise eher wegen zu vielen Informationen, bei denen das, was ich suche, aber nicht dabei ist:

Ich rufe per TIDIMAP4.UIDRetrieveAllEnvelopes eine Nachrichtenliste ab. Diese Methode hat den großen Vorteil, dass sie blitzschnell ist und die dadurch abgerufenen TIDMessages alle wichtigen Informationen wie Betreff, Absender und Zeitpunkt beinhalten.
Problem ist, dass sie aber, wenn ich nichts übersehen habe, keinerlei Informationen diesbezüglich enthalten, ob es Anhänge gibt, da bei den Envelopes logischerweise keine MessageParts vorhanden sind, anhand denen man das z.B. feststellen könnte.

Was ich erreichen will ist, bei meiner Nachrichtenliste zu wissen, welche Nachrichten Anhänge haben, ohne dafür die langsameren Abrufmethoden des TIDIMAP4 wie UIDRetrieve verwenden zu müssen, denn ich will die Nachrichten in dem Moment ja noch gar nicht runterladen, sondern nur einen Überblick haben und dann ggf nur spezifische Nachrichten komplett abrufen.

Weiß wer, wie das zu erreichen ist? Bei meiner Recherche finde ich leider nur 129034903 Erklärungen dafür, wie man Anhänge verschickt, was ich aber schon weiß...

shebang 11. Jul 2024 22:45

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Vielleicht hilft dir das hier ja weiter: Parsing IMAP Email BODYSTRUCTURE for Attachment Names

himitsu 11. Jul 2024 23:34

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Nein. Dafür muß ja der Body runtergeladen werden, was er ja eigentlich nicht will.

Wenn es nicht im Header steht, dann muß nunmal der Rest (Body) runtergeladen werden.
Aber, wenn du beim Downloaden bereits den Inhalt dir ansehen kannst, dann könntest du mindestens den Rest des Downloads dann abbrechen, wenn die nötige Info bereits vorhanden ist, oder

Nja, normale Mailprogramme speichern sich dann das Runtergeladene (Cache), um es nicht mehrmals runterladen zu müssen.

AuronTLG 12. Jul 2024 08:16

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Zitat:

Zitat von himitsu (Beitrag 1538789)
Nein. Dafür muß ja der Body runtergeladen werden, was er ja eigentlich nicht will.

Wenn es nicht im Header steht, dann muß nunmal der Rest (Body) runtergeladen werden.
Aber, wenn du beim Downloaden bereits den Inhalt dir ansehen kannst, dann könntest du mindestens den Rest des Downloads dann abbrechen, wenn die nötige Info bereits vorhanden ist, oder

Nja, normale Mailprogramme speichern sich dann das Runtergeladene (Cache), um es nicht mehrmals runterladen zu müssen.


Joa, hatte ich schon befürchtet, aber die Hoffnung stirbt ja zuletzt. Die Structures runterladen ist zwar schneller als alles runterladen, aber in keinster Weise vergleichbar mit den Envelopes, bei denen man locker innerhalb von 0,2 Sekunden den Inhalt eines ganzen IMAP-Accounts zur Verfügung hat.
Heißt für mich, dass ich das wohl im Hintergrund machen muss, womit ich mich mit den verhassten Threads herumschlagen muss...

Rollo62 12. Jul 2024 08:44

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Vielleicht macht es Sinn die Header mit TIDIMAP4.UIDRetrieveAllEnvelopes vorab zu laden und dann über die HeaderInfo einen Hash zu bilden und in einer DB abzuspeichern.
Dann kann man in Ruhe in einem Hintergrundthread die Zusatzdaten laden und notfalls nach Analyse sofort verwerfen, und dem Hash die entsprechenden Flags zuweisen.
Damit wäre ein komplettes Downloaden und Speichern nicht nötig, nur eventuell temporär, und ein erneutes Downloaden nur OnDemand oder nach bestimmten Regeln (nur bei Anhang), was durch die Zuordnung zum Hash eindeutig geschützt wird.

AuronTLG 12. Jul 2024 09:06

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
So ähnlich war schon mein bisheriges Vorgehen: Mit TIDIMAP4.UIDRetrieveAllEnvelopes die Emailliste des Postfaches abrufen und bei Aufruf einer einzelnen Mail diese abrufen und deren Daten lokal abspeichern, so dass beim nächsten Aufruf alle Informationen aus der Datenbank bzw lokalem Speicher kommen.
Die Information zu den Anhängen war das einzige, was mir bei der EmailListe noch gefehlt hat.

Bei den Strukturen werde ich das auch noch so gestalten, dass er explizit nur die EMails auf dem Server rausfiltert, bei denen die Informationen noch fehlen oder bei denen etwas geändert wurde, womit sich der Aufwand dann in Grenzen halten sollte, sobald für die bestehenden Emails die Informationen schon abgerufen wurden.

himitsu 12. Jul 2024 09:43

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Wenn es um "eigene" Mails geht und man z.B. auch im Serverzentrum noch einen Server hat, oder auch mit PHP und Co. ginge es.

Also ganz nah am Mailserver (sehr schnelle Verbindung), könnte man dort sich die Mails laden und sich selbst die gewünschte Info in den Header schreiben ... dann hätte dein lokales Programm diese Info somit auch schon im schnellen Header zur Verfügung.
Bzw., bei einem eigenen Mailserver, könnte man sowas sich bestimmt auch als Plugin direkt hinzufügen.

AuronTLG 12. Jul 2024 10:18

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Hm, ich habe hier jetzt nur noch ein Problem mit:

Ich filtere per UIDSearchMailBox die Mails raus, die ich brauche und hole sie mir per UIDRetrieveStructure.
Soweit so gut.
Das Problem ist aber, dass die MessageParts der durch UIDRetrieveStructure abgerufenen TIDMessages allesamt grundsätzlich den "APart.PartType = mptAttachment" haben bzw die Bedingung "AMessage.MessageParts[I] is TIDAttachment" erfüllen.
Das heißt, absolut alles, selbst die plaintext, html und eingebetteten Bestandteile werden als Attachments erkannt, was absoluter Schwachsinn ist.
Bei Abruf per UIDRetrieve sind die MessageParts logischerweise korrekt, aber ich will ja eben nur wissen, was es für Anhänge gibt und sie NICHT direkt runterladen.

Nachtrag: Ich habe mal gegengetestet, was es ausmacht, UIDRetrieve anstatt UIDRetrieveStructure zu verwenden, und bei mir zumindest gibt es da zeitlich so gut wie keinen Unterschied, zumindest solange ich nicht direkt anfange, Anhänge direkt zu speichern etc.

AuronTLG 12. Jul 2024 10:42

AW: TIDIMAP4: Identifizieren, ob Anhang vorhanden ohne ganze Nachricht runterzuladen
 
Okay, anscheinend muss man die Variante von UIDRetrieveStructure verwenden, welche einen TIDImapMessageParts-Parameter verwendet und nicht den TIDMessage-Parameter.
Tut man dies, enthalten die TIDImapMessageParts tatsächlich alle Informationen, die man braucht.

Keine Ahnung, warum das so unnötig verworren sein muss, aber nun gut...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz