Outlook .msg Dateien interpretieren/auslesen

    • VB.NET
    • .NET (FX) 4.0

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

      Outlook .msg Dateien interpretieren/auslesen

      Grüss Gott Gemeinde ;)

      Hab heute was feines für euch. Und zwar: Was sind .msg Dateien und wie kann ich die Dinger auslesen?
      Was sind den nun diese Dateien. Naja im Grunde sind das Mails, die von Outlook generiert werden.
      Der Aufbau ist relativ simpel, es ist eine Containerdatei, die den ganzen Inhalt des Mails beinhaltet. Soweit so nice.

      Doch wie kann man die Dinger auslesen? Relativ simpel -> Editor öffnen, drag and drop, fertig! Naja, das ist mal die halbe Miete.
      Theoretisch wird alles nötige angezeigt. Aber leider nicht so, dass man zum Beispiel gezielt Inhalte auslesen könnte.

      Doch hierbei kommt uns die Edanmo Klasse zur Hilfe. (mvps.org/emorcillo/en/code/grl/storage.shtml)
      Diese Klasse dient einfach nur dazu, Container Dateien zu öffnen und die eingebetteten Dateien zu lesen und als Stream auszugeben.

      Wer noch nie gesehen hat, wie eine Containerdatei von innen aussieht, kann zum Beispiel 7Zip benutzen um sie zu öffnen. (siehe Anhang 7zip...) (übrigens lassen sich so auch EXE usw. öffnen)

      Wer die Edanmo Klasse schon mal benutzt hat, der hat gemerkt, dass vom gewünschten Inhalt immer nur der Anfangsbuchstabe angezeigt wird. Doch ich habe eine Möglichkeit gefunden alles auszugeben.
      Und zwar muss man den Stream in einer For Schleife auslesen und immer wieder zusammenfügen . Relativ simpel, wenn man das weiss (hab übrigens nirgends eine Lösung gefunden, musste selber ausprobieren)

      Schritt für Schritt Anleitung:

      1. Die Controls die es benötigt auf Form einfügen (label, textboxen, usw.)
      2. in pathx der Dateipfad der *.msg Datei definieren
      3. Routine (siehe unten Code starten)
      4. Fertig!

      Im Anhang könnt ihr noch meine Software sehen, die ich gemacht habe.

      Falls ihr euch fragt, wieso ich das UI so gemacht habe (siehe Anhang). Hab vor kurzem das Game Prey gezockt, und hab da das Terminal gesehen. Das UI des Terminal hat mir so gut gefallen, dass ich es so gemacht habe wie im Game :D google.ch/search?q=prey+game&s…nal&imgrc=0HiUuGk0ZQtJ_M:

      Hier noch der Code der Routine:
      Spoiler anzeigen

      VB.NET-Quellcode

      1. ' VERWEIS Hinzufügen: Edanmo.OleStorage.dll
      2. ' Imports Edanmo.OleStorage
      3. ' Imports Edanmo
      4. ' habe pathx im drag&drop event definiert
      5. Dim msg As New Storage(pathx)
      6. ' Mailinhalt
      7. Dim stream As OleStorage.Stream = msg.OpenStream("__substg1.0_1000001F")
      8. Dim reader As New IO.StreamReader(stream, System.Text.Encoding.Default)
      9. For Each line As String In reader.ReadToEnd
      10. TransparentTextBox1.Text += line
      11. Next line
      12. TransparentTextBox1.Text = TransparentTextBox1.Text.Trim
      13. reader.Close()
      14. stream.Close()
      15. 'wer kriegt es
      16. Dim stream2 As OleStorage.Stream = msg.OpenStream("__substg1.0_0E04001F")
      17. Dim reader2 As New IO.StreamReader(stream2, System.Text.Encoding.Default)
      18. For Each linex As String In reader2.ReadLine
      19. TextBox1.Text += linex
      20. Next
      21. Label4.Text = "An: " & TextBox1.Text
      22. TextBox1.Clear()
      23. reader2.Close()
      24. stream2.Close()
      25. 'Betreffzeile
      26. Dim stream3 As OleStorage.Stream = msg.OpenStream("__substg1.0_0037001F")
      27. Dim reader3 As New IO.StreamReader(stream3, System.Text.Encoding.Default)
      28. For Each linex As String In reader3.ReadLine
      29. TextBox1.Text += linex
      30. Next
      31. header_label.Text = TextBox1.Text
      32. TextBox1.Clear()
      33. reader3.Close()
      34. stream3.Close()
      35. 'wer hat es gesendet
      36. Dim stream4 As OleStorage.Stream = msg.OpenStream("__substg1.0_5D02001F")
      37. Dim reader4 As New IO.StreamReader(stream4, System.Text.Encoding.Default)
      38. For Each linex As String In reader4.ReadLine
      39. TextBox1.Text += linex
      40. Next
      41. Label2.Text = "Von: " & TextBox1.Text
      42. TextBox1.Clear()
      43. reader4.Close()
      44. stream4.Close()
      45. 'CC Personen
      46. Dim stream5 As OleStorage.Stream = msg.OpenStream("__substg1.0_0E03001F")
      47. Dim reader5 As New IO.StreamReader(stream5, System.Text.Encoding.Default)
      48. Try
      49. For Each linex As String In reader5.ReadLine
      50. TextBox1.Text += linex
      51. Next
      52. Label5.Text = "Cc: " & TextBox1.Text
      53. Catch ex As Exception
      54. Label5.Text = "Cc: -"
      55. End Try
      56. TextBox1.Clear()
      57. reader5.Close()
      58. stream5.Close()
      59. msg.Close()


      Ich kann nicht garantieren, dass der Code zu 100% funktioniert. Aber trotzdem hoffe ich, dass euch das kleine Tutorial gefällt.
      Falls ihr noch Fragen habt, kein Ding, ich beantworte gerne all eure Fragen zu der Routine oder Software von mir.

      Enjoy! :thumbup:

      Passt besser in das Unterforum "Internet/LAN - Alles zu Chats, E-Mail, Internet, LAN etc." ~fufu
      Bilder
      • 7zip_msg_inhalt.PNG

        137,77 kB, 1.201×886, 709 mal angesehen
      • step_1.PNG

        352,1 kB, 1.222×766, 686 mal angesehen
      • step_2.PNG

        342,57 kB, 1.185×764, 659 mal angesehen
      • outlook_vergleich.PNG

        83,41 kB, 1.185×787, 647 mal angesehen
      "Die menschliche Vorstellungskraft ist unendlich"
      ->Versuch dir mal 'ne neue Farbe auszudenken!

      Mit Schleifen kann man alles lösen!

      Dim d as Double = 1
      Do until d = 0
      d = (d / 2)
      Loop

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fufu“ ()

      Folgende, entscheidende, Dinge fehlen:
      - Direkter Drag & Drop aus Outlook ins Programm
      - Was passiert mit den Anhängen und in die E-Mail eingebetteten Bildern?
      "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

      Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
      Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
      Grüss dich @mrMo

      Das direkte Drag&Drop aus Outlook erweist sich als schwierig, da im Drag&Drop Event im VB.NET nur der Speicherpfad der Datei hinterlegt ist. Heisst, wenn man die Datei in deine Form dropt, ist nur ein Pfad als String hinterlegt.
      Wenn man die Datei direkt aus Outlook herauszieht, weiss die Software ja nicht, wo die original .msg Datei ist. Hab ich schon versucht zu implementieren, jedoch ohne Erfolg. Wenn jemand wüsste wie, ich lasse mich gerne belehren. :)

      Die Anhänge sind als binär Dateien auch in diesen Stream abgelegt. Diese sollten sich ohne grosse Mühen herausfiltern und zu Dateien verwandeln lassen. Hab's aber noch nicht ausprobiert. Werde ich in den nächsten Tagen mal probieren.
      "Die menschliche Vorstellungskraft ist unendlich"
      ->Versuch dir mal 'ne neue Farbe auszudenken!

      Mit Schleifen kann man alles lösen!

      Dim d as Double = 1
      Do until d = 0
      d = (d / 2)
      Loop
      Ich hatte das Thema hier mal beschrieben. Evtl. Kannst du das für dich verwerten: Dateiliste aus Clipboard leer nach Kopieren von Mail-Attachements (Outlook) in Clipboard
      "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

      Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
      Wie man VisualStudio nutzt? => VisualStudio richtig nutzen