Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TIdMessage (Indy) Flags setzen (https://www.delphipraxis.net/194170-tidmessage-indy-flags-setzen.html)

Towmuz 24. Okt 2017 12:18

Delphi-Version: 10 Berlin

TIdMessage (Indy) Flags setzen
 
Tag auch,

ist es irgendwie möglich sowas hier zu veranstalten?

Delphi-Quellcode:
    MailReader := TIdMessage.Create;
    MailReader.LoadFromFile(Filename);
    ... mach was mit der Mail ...
    MailReader.Flags := {MailReader.Flags + }[mfSeen];
    MailReader.SaveToFile(Filename);
Also Maildatei (eml) von der Platte lesen und auf erledigt setzen, damit sie vom Programm als "schon bearbeitet" erkannt werden kann beim nächsten Durchlauf.

Der Ablauf oben läuft ohne Fehler und die Mail wird auch neu gespeichert, die Flags allerdings nicht. Warum?

mjustin 24. Okt 2017 13:20

AW: TIdMessage (Indy) Flags setzen
 
SaveToFile speichert nur die Mailheader und (optional) den Mailbody ab. Flags sind nicht darin enthalten.
Eine Lösung wäre, die SaveToFile Methode durch eine andere zu ersetzen, die auch weitere Informationen speichert. Dann muss LoadFromFile natürlich auch passend gemacht werden.

Towmuz 24. Okt 2017 14:20

AW: TIdMessage (Indy) Flags setzen
 
Wie funktioniert das denn regulär das eine Mail als gelesen markiert wird? Ist das was Serverseitiges? (Kein Plan von dem Thema)
Dieses SaveToFile umschreiben scheint mir ein enormer Aufwand zu sein :)

mjustin 24. Okt 2017 14:32

AW: TIdMessage (Indy) Flags setzen
 
Zitat:

Zitat von Towmuz (Beitrag 1384037)
Wie funktioniert das denn regulär das eine Mail als gelesen markiert wird? Ist das was Serverseitiges? (Kein Plan von dem Thema)
Dieses SaveToFile umschreiben scheint mir ein enormer Aufwand zu sein :)

Im Internet fand ich den Hinweis, dass dieses Flag von IMAP verwendet wird. In diesem Fall ist es serverseitig, d.h. der Client erfährt nach dem Abrufen der Nachricht, welche Flags diese bereits hat. Flags kann aber auch beliebig clientseitig verwendet / gesetzt werden. Daher heisst es auch ganz allgmein "Flags" (und nicht z.B. IMAPFlags).

nahpets 24. Okt 2017 14:48

AW: TIdMessage (Indy) Flags setzen
 
Soweit ich weiß, wird in der Regel die Verwaltung der Flags für gelesen ... vom Client übernommen.

Wenn Du z. B. von verschiedenen Rechnern mit unterschiedlichen Clients auf das gleiche Postfach zugreifst, wirst Du feststellen, dass die Anzeige der Gelesenmarkierung von Client zu Client abweicht.

Auch eine per Webinterface gelesene und entsprechend markierte Mail enthält im Client nicht die Gelesenmarkierung. Dito. umgekehrt.

Etwas überspitzt formuliert:

Man muss je Client alles lesen, egal wie oft man es woanders schon gelesen hat.

Bei IMAP mag das anders sein, wenn es von allen Clients unterstützt wird.

Towmuz 25. Okt 2017 07:05

AW: TIdMessage (Indy) Flags setzen
 
Ok dann anders gefragt. :)
Wie kann ich mit Delphi diese Flags setzen?

nahpets 25. Okt 2017 09:47

AW: TIdMessage (Indy) Flags setzen
 
Vermutlich eher garnicht, weil das (außer bei IMAP?) jeder Client für sich selbst erledigt.

Soweit ich weiß:

Fünf Clients mit Outlook und ein Postfach = fünf eigenständige Verwaltungen der Flags.

Dazu noch ein WebClient, FoxMail, Thunderbird und was weiß ich alles.

Jeder verwaltet selbst.

Bei der Suchmaschine meiner Wahl habe ich mal diese Suchwörter eingegeben: "delphi source tidmessages flag".

Dabei kam dann u. a. das heraus:

https://stackoverflow.com/questions/...ages-with-indy
http://www.e-iter.net/Knowledge/Indy9/007544.html

Wenn Du nun einen vollständig eigenständigen Mailclient schreiben möchtest, so musst Du Dir leider eine eigene Verwaltung der Flags implementieren.

Ein Austausch der Flags zwischen mehreren Clients, bzw. deren Zwischenspeicherung auf dem Server, scheint nicht möglich zu sein.
Bzw.: Wenn Du die Flags in die Datei schreibst, heißt das nicht, dass Clients von anderen Herstellern dies auswerten.

Momentan hab' ich jedenfalls keine auch nur halbwegs brauchbare Idee.

Beschreib' ggfls. mal etwas genauer, was Du vorhast, eventuell hat ja dann jemand 'nen Lösungsansatz.

Ok: Du möchtest die Datei lesen, verändern und wieder schreiben, aber wer soll danach dann was mit der veränderten Mail machen?

Towmuz 25. Okt 2017 11:07

AW: TIdMessage (Indy) Flags setzen
 
Ein bischen hat ich das schon vermutet, von wegen POP3 verwaltet die FLAGS nicht. (kA von der Materie)

Nach kurzem Überflug über die IMAP Technik, fällt die Flagsetzerei scheinbar aus,
Weil das Verwalten der Flags scheinbar nur auf dem Mailserver passiert und auch das als einzig Sinnvolle erscheint. :)

Mit nem Mailclient soll das nichts zu tun haben. Folgender Ablauf wars dann auch schon.
Geplant war:
  • Verzeichnis (Postfach mit *.eml) auslesen
  • Anhänge verarbeiten und Mail auf erledigt setzen
  • Nach 5 Min. wieder auf Anfang und nur Anhänge von nicht Erledigten bearbeiten
So müsste ich nicht noch irgendwas aus UID und MsgUID basteln um zu wissen welche Mail schon dran war.

MailSubject im Header kann man ja speichern und das Ganze so kenntlich machen, find ich irgendwie nich so doll, aber zur Not wirds dann wohl gehen :stupid:

nahpets 25. Okt 2017 12:19

AW: TIdMessage (Indy) Flags setzen
 
Werden die erledigten dann nachher noch benötigt?

Ansonsten: Erledigte einfach umbenennen, z. B. die Dateiendung in .erledigt ändern?

Dann gibt es bei der TIDMessage noch die ExtraHeaders.

Das ist letztlich eine TStringList. Dort kannst Du eigene Einträge machen, wichtig ist nur, dass sie nicht mit irgendwas bereits verwendetem kollidieren.

Sinngemäß müsstest Du dann über
Delphi-Quellcode:
IdMessage.ExtraHeaders.SetValue('X-Towmuz-HasDone',DateTimeToStr(Now));
einen Erledigungsvermerk setzen können und über
Delphi-Quellcode:
IrgendeineVariabel := IdMessage.ExtraHeaders.GetValue('X-Towmuz-HasDone');
überprüfen können.

Das geht so nicht, die Methoden sind nicht veröffentlicht.

Müsste aber über Values funktionieren.

Towmuz 25. Okt 2017 12:32

AW: TIdMessage (Indy) Flags setzen
 
Ui ExtraHeaders, das hab ich noch nicht gesehen, danke :) das wird den Zweck erfüllen.

Datei umbenennen/verschieben ist leider nicht möglich (was aber das Einfachste wäre)

Edit:

So hauts hin mit den ExtraHeadern

Schreiben:
Delphi-Quellcode:
    IdMessage.ExtraHeaders.AddValue('x-irgendwas', 'Ausgelesen');
    IdMessage.SaveToFile(_Filename);
Auslesen:
Delphi-Quellcode:
    stringDing := IdMessage.Headers.Values['x-irgendwas']; //Über Headers abfragen nicht über ExtraHeaders


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 Uhr.

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