AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

Ein Thema von wmenzel · begonnen am 9. Dez 2004 · letzter Beitrag vom 11. Mär 2010
Antwort Antwort
wmenzel

Registriert seit: 7. Mai 2004
Ort: Erlangen
2 Beiträge
 
Delphi 6 Professional
 
#1

Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 9. Dez 2004, 08:34
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
Siemens AG
I&S GIO IP 2
Tel. +49(0)9131-731897
Handy: 0173 39 275 61
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 9. Dez 2004, 13:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#3

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 9. Dez 2004, 14:26
Lass Dir von Luckie nicht den Mut gleich ganz nehmen

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.

......

P.S.: Mit dem Programm können sämtliche Dateien des Storage Formates, also zB auch Word Dokumente eingesehen werden.
Angehängte Dateien
Dateityp: zip storage_files.zip (3,3 KB, 176x aufgerufen)
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
9. Dez 2004, 14:28
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
wmenzel

Registriert seit: 7. Mai 2004
Ort: Erlangen
2 Beiträge
 
Delphi 6 Professional
 
#5

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 9. Dez 2004, 14:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 9. Dez 2004, 14:33
@Daniel: Und wie sieht es mit Outlook Express aus?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#7

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 9. Dez 2004, 14:35
@wmenzel: Und, wie sieht es mit meinem Ansatz aus

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.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#8

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 10. Dez 2004, 11:14
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.

......
Angehängte Dateien
Dateityp: zip storage_files_123.zip (4,2 KB, 136x aufgerufen)
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#9

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 13. Mai 2009, 21:14
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
  Mit Zitat antworten Zitat
panch

Registriert seit: 9. Mär 2010
Ort: Herrsching am Ammersee
7 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Wie kann ich Outlook-Header aus *.MSG-Dateien auslesen?

  Alt 11. Mär 2010, 14:47
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 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