Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen? (https://www.delphipraxis.net/35571-wie-kann-ich-outlook-header-aus-%2A-msg-dateien-auslesen.html)

wmenzel 9. Dez 2004 07:34


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

Luckie 9. Dez 2004 12:15

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
 
Tja. Zwei Möglichkeiten, nein drei:
  1. Du findest selbst mit einem HexEditor raus, wie die Dateien aufgebaut sind.
  2. Du findest was bei www.wotsit.org, eher unwahrschein, da es sich um ein properitäres Format von Microsoft handelt.
  3. Du findest ein Tool, welches dir die Mails in PlainText umwandelt.

sakura 9. Dez 2004 13:26

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:
OleCheck(StgOpenStorage(PWideChar(aFileName), nil, STGM_READWRITE or
      STGM_SHARE_EXCLUSIVE, nil, 0, FMessageFile));
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 MSDN-Library durchsuchenIStorage.

In einem Storage können vier verschiedene Datentypen hinterlegt sein. Die Demo zeigt die Nutzung zweier dieser: MSDN-Library durchsuchenIStream und widerrum IStorage. Das Demo-Programm öffnet die Storage Datei und enumeriert Dir alle Inhalte. Sub-Storages werden entsprechend im TreeView dargestellt, Nodes ohne Unternodes sind iA Streams.

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 9. Dez 2004 13:28

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:

wmenzel 9. Dez 2004 13:31

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

Luckie 9. Dez 2004 13:33

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
 
@Daniel: Und wie sieht es mit Outlook Express aus?

sakura 9. Dez 2004 13:35

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
 
@wmenzel: Und, wie sieht es mit meinem Ansatz aus :zwinker:

Zitat:

Zitat von Luckie
@Daniel: Und wie sieht es mit Outlook Express aus?

Einfach mit der Indy-Komponente TIdMessage öffnen, denke ich. Die sind plain-text, wenn exportiert.

...:cat:...

sakura 10. Dez 2004 10:14

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:...

norwegen60 13. Mai 2009 20:14

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

panch 11. Mär 2010 13:47

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:
var
  myBytesStream: TBytesStream;

...
        OS.Seek(0, soFromBeginning);
        OS.CopyFrom(myBytesStream, 0);
...
        aStorage.Commit(STGC_DEFAULT);
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?

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 20:08 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