![]() |
Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Hallo,
wir haben in der Firma jede Menge Mails von Outlook in Form von *.msg-Dateien gespeichert, deren Name nicht sehr bezeichnend ist. Wie kann ich mit Delphi den Header der Mails auslesen, damit ich den Dateien einen passenderen Namen geben kann? Ich verwende Delphi 6.0. Für jeden Tipp bin ich dankbar. Wolfram Menzel :coder: Siemens AG I&S GIO IP 2 Tel. +49(0)9131-731897 Handy: 0173 39 275 61 |
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Tja. Zwei Möglichkeiten, nein drei:
|
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Liste der Anhänge anzeigen (Anzahl: 1)
Lass Dir von Luckie nicht den Mut gleich ganz nehmen :mrgreen:
Anbei findest Du mal ein kleines Delphi Projekt, welches die Message Datei öffnet und Dir die Daten anzeigt. Als erstes mal zum Aufbau der Datei. Die Dateien werden, zumindest bei den neueren Office Versionen von Outlook im Stream-Format (ActiveX.pas -> IStorage) gespeichert. Das Öffnen einer solchen Datei ist denkbar einfach.
Delphi-Quellcode:
Der erste Parameter ist der Dateiname, dann geben wir an, dass wir aus der Datei lesen wollen und als letztes übergeben wir eine Variable vom Typ
OleCheck(StgOpenStorage(PWideChar(aFileName), nil, STGM_READWRITE or
STGM_SHARE_EXCLUSIVE, nil, 0, FMessageFile)); ![]() In einem Storage können vier verschiedene Datentypen hinterlegt sein. Die Demo zeigt die Nutzung zweier dieser: ![]() Wenn Du im Programm jetzt einen Stream auswählst, so wird dieser eingelesen und dargestellt. Zur besseren Ansicht habe ich die Daten in einer Doppelansicht Hexadezimal/ClearText dargestellt. Einfach mal durchschauen, wenn Du noch fragen hast, kannst Du ja hier fragen. ...:cat:... P.S.: Mit dem Programm können sämtliche Dateien des Storage Formates, also zB auch Word Dokumente eingesehen werden. |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Internet / IP / LAN" nach "Windows API" verschoben.
Und die Lösung ist reine WinAPI, deswegen schubse ich es mal hier weg :zwinker: |
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Danke für die Tipps.
zu 1.) Wenn alle *.msg-Dateien den gleichen Aufbau hätten, wäre das natürlich kein Problem. Leider ist dem aber nicht so. Manchmal finde ich mit einem Hexeditor in einer bekannten Mails (als msg-Datei gespeichert) keine verwertbaren Angaben. zu 2.) Völlig richtig, dort ist leider nichts zu finden. zu 3.) Schön wäre es, wenn ich irgendwo solche Tools fände, ich habe aber schon sehr lange gesucht und nichts in der Art gefunden. Für jede weitere Idee bin ich dankbar. Wolfram Menzel Siemens AG I&S GIO IP 2 Tel. +49(0)9131-731897 Handy: 0173 39 275 61 |
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
@Daniel: Und wie sieht es mit Outlook Express aus?
|
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
@wmenzel: Und, wie sieht es mit meinem Ansatz aus :zwinker:
Zitat:
...:cat:... |
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt anbei noch einmal das Programm, so dass es auch direkt die Header-Daten ausliest. Momentan, nach ersten übereinstimmenden Tests, geht das Programm davon aus, die Headerdaten im Stream __substg1.0_007D001F zu finden (Office 2003). Evtl. muss man hier noch eine Logik finden. In Office 2000 wäre der Stream __substg1.0_007D001E.
...:cat:... |
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Hallo zusammen,
die Beiträge haben mir recht gut weiter geholfen. Es klappt auch einwandfrei, das Empfangsdatum einer Mail (Outlook 2003 und Outlook 2007) auszulesen. Probleme gibt es aber mit selbst gesendeten Mails. Hier existiert der Stream __substg1.0_007D001F nicht und ich habe auch keinen anderen gefunden, in dem das "Gesendet-Datum" ausgelesen werden kann. Kann jemand weiter helfen? Viele Grüsse Gerd |
Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Schönen Tag allerseits,
gerade frisch wegen des vorliegenden Threads angemeldet, will ich ihn aus der Versenkung emporheben und schauen, ob mir jemand einen Tip geben kann, wie ich einen geänderten Stream nicht nur speichern, sondern auch seine Länge, die in meinem Fall kürzer ist als zuvor, enstprechend anpassen kann. Zu Testzwecken habe ich mir den von sakura dankenswerterweise erstellten und zur Verfügung erstellten Quellcode geholt und damit ein wenig experimentiert. Die, wie mir scheint, für mich entscheidende Methode ist dabei die Methode LoadHeaders, denn darin erhalte ich über den TOLEStream OS Zugriff auf meinen Stream, den ich tatsächlich ändern und speichern kann (in Wahrheit ersetze ich seinen Inhalt vollständig durch einen neuen Inhalt). Mein Problem besteht nun aber darin, daß beim Speichern des geänderten Streams die alte Länge (Size) des Streams nur dann an die neue Länge angepaßt wird, wenn der Stream länger ist, nicht jedoch wenn er kürzer ist. Folgende Zeilen hab ich in die oben genannte Methode zum Experimentieren eingefügt:
Delphi-Quellcode:
Die Frage also: Wie kann ich den alten Stream-Inhalt löschen bzw. die Länge des Streams auf 0 zurücksetzen, bevor ich den neuen Inhalt zuweise?
var
myBytesStream: TBytesStream; ... OS.Seek(0, soFromBeginning); OS.CopyFrom(myBytesStream, 0); ... aStorage.Commit(STGC_DEFAULT); Diese Frage mag nun dem einen oder anderen als eine dumme Frage erscheinen und vielleicht denke ich ebenfalls so, sobald ich die Antwort kenne, doch im Moment bin ich leider ein wenig ratlos. Kurz zu mir: Um es gleich vorweg zu sagen, ich bin eigentlich alles andere als ein Pascal-Neuling (Turbo Pascal kenne ich beispielsweise seit er Version 2), aber mit Compound Documents, die zwar ein alter Hut, aber dennoch neu für mich sind, und dem Haufen verschiedener Streams und Storages, die Delphi 2010 mitbringt, habe ich als der Ab-und-zu-Programmierer, der ich seit Anfang der 90er bin, keinerlei Erfahrungen. Ich bedanke mich gleich mal vorab für die Hilfe. Viele Grüße Franz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 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 by Thomas Breitkreuz