Bestehende *.msg Datei öffnen bzw. auslesen

Moderator: ModerationP

Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon Snarfensia » 04. Jan 2019, 11:28

Hallo in die Runde.

Diesmal poste ich meine Frage einmal in das "richtige" Forum :shock:

Hintergrund:

In einem Projekt von mir versuche ich, den .body von bereits gespeicherten *.msg Dateien in Textdateien umzuwandeln.
Ich nutze das Office 2016 Produkt mit den entsprechenden "Applikationen" und für andere Dateitypen (Word, Excel) ist mir das auch gelungen.

Das versuche ich nun für *.msg Dateien aus Excel heraus mit VBA zu realisieren.
Im Excel Forum hatte ich diese Frage schon einmal gestellt und hatte auch Hilfe (Danke an mmarkus und DerHoepp), nur sehe ich den Wald vor lauter Bäumen wohl nicht...
http://office-loesung.de/p/viewtopic.php?f=166&t=789281

Deshalb stelle ich die Frage nun noch einmal hier :oops:

Wie im anderen Thread schon geschrieben, klappt das Einlesen der *.msg Datei eigentlich, nur habe ich keinen Lesezugriff auf den .body oder den Versender. Hier meckert VBA mit einem Objektfehler...

Das ist in soweit interessant, als dass ich die Anhänge einer .msg Datei auslesen kann, einige andere Infos auch, nur halt nicht den .body, den ich aber komischerweise selbst verändern bzw. setzen kann.
ein "objekt".display funktioniert aber, auch mit den .body Informationen....

Vom Verständnis her weiß ich, da ich den Container der .msg Datei öffnen muss, dass ich ein Outlook-Objekt brauche mit dem ich dann die .msg Datei verarbeiten kann.
Warum ich beim Öffnen einer *.msg Datei den Namespace deklarieren muss, entzieht sich schon meinem Verständniss.
Klar, wenn ich auf die Inbox von Outlook zugreifen würde dann müsste ich den Namespace nehmen, aber bei *.msg Dateien?
-> Nebenbei.. hier sehe ich auch alle Mails in den Ordnern, auch alle Infos außer .. Ihr wisst es schon :twisted:

In diesen sind auch die .body (oder Absenderinfos) informationen enthalten, wenn ich sie als reinen Text als Ansi öffne (aber halt *fast* unverarbeitbar).

Aber nun mal mal mein Code.

Im Gegensatz zu meinem alten Post habe ich ihn etwas abgeändert, nachdem ich folgenden Beitrag in einem Office-Supportforum gefunden habe...
https://support.microsoft.com/en-us/help/2633737/the-openshareditem-method-for-outlook-holds-a-file-handle-on-signed-ms

Meinem Verständnis nach waren da auch ein paar Sachen nicht ordentlich deklariert, aber was soll es..
Ich habe den mal als Basis genommen, etwas gesäubert und noch zum Test ein .logon dazugenommen und auf eine bestehende Outlook-Instanz aufgesetzt.

Hinweis: Bei der Variablen "Dat" handelt es sich um ein FileSystem-Objekt und beinhaltet mit .Path den Pfad zur *.msg Datei.

Code: Alles auswählen
Private Sub MsgFileToAscII(ByVal Dat As Variant)

Dim objOutlook      As Outlook.Application
Dim oNamespace      As Outlook.Namespace
Dim oSharedItem     As Outlook.MailItem

On Error GoTo ErrRoutine
  Set objOutlook = GetObject(, "Outlook.Application")
  Set oNamespace = objOutlook.GetNamespace("MAPI")
  oNamespace.Logon "LatestProfile", , True, True
  Set oSharedItem = oNamespace.OpenSharedItem(Dat.Path)

' MsgBox oSharedItem.body    => Hier bekomme ich den Objektdefinierten Fehler, um den sich auch meine Frage dreht..
  oSharedItem.display       '=> Funktioniert, der .body wird angezeigt
 
 
  oSharedItem.body = "Test Body Nachricht"
  oSharedItem.display       '=> Funktioniert, der geänderte .body wird ebenfalls angezeigt...
' MsgBox oSharedItem.body   '=> Hier wieder ??? ein objektdefinierter Fehler
 
  oSharedItem.Close (olDiscard)
     
EndRoutine:
    On Error GoTo 0
    Set oSharedItem = Nothing
    Set oNamespace = Nothing
    Set objOutlook = Nothing
Exit Sub
ErrRoutine:
    Select Case Err.Number
        Case -2147024894  ' &H80070002 -> .msg Datei nicht gefunden
            MsgBox Err.Description, vbOKOnly, Err.Number & " - " & Err.Source
        Case Else
            ' Alle anderen Fehler
            MsgBox Err.Description, vbOKOnly, Err.Number & " - " & Err.Source
    End Select
    GoTo EndRoutine
End Sub


Ich bedanke mich schon einmal für die Muße, den Text bis hierher durchgelesen zu haben ...

Grüße,
Snarf
Snarfensia
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14
Registriert: 10. Dez 2018, 12:06

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon mmarkus » 05. Jan 2019, 11:59

Snarfensia hat geschrieben:
Code: Alles auswählen
  oNamespace.Logon "LatestProfile", , True, True



Was soll dieser Code tun?
Hast du wirklich mehrere Profile und vor allem ein Profil das "LatestProfile" heißt, oder hast du da nur was zusammenkopiert ohne es zu verstehen?
Mit deinem Code greifst du ja auf ein geöffnetes Outlook zu.
Ich würde dir raten die Hilfe zu diesem Befehl zu konsultieren.

Grundsätzlich ist es kein Problem, den Mail Body in einer Msgbox anzuzeigen.
Allerdings weiß ich nicht, ob die obere Sequenz da Störungen verursacht.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1188
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon knobbi38 » 05. Jan 2019, 14:22

Hallo Snarf,

ich benutzte der Einfachheit halber für den Zugriff auf eine OL Instanz dieses Modul von https://www.rondebruin.nl/win/s1/outlook/openclose.htm.

Mit diesem Beispiel
Code: Alles auswählen
Option Explicit

Public Function GetMsgBody(ByVal Filename As String) As String
  Dim olApp As Outlook.Application
  Dim olItem As Outlook.MailItem

  Set olApp = OutlookApp()
  Set olItem = olApp.Session.OpenSharedItem(Filename)
  GetMsgBody = olItem.Body
  olItem.Close olDiscard
  Set olItem = Nothing

  ' Release Outlook
  Call OutlookApp(, True)
End Function

Sub Test()
  Const FILE_NAME = "X:\Microsoft Outlook-Testnachricht.msg" ' <-- anpassen!
  Debug.Print GetMsgBody(FILE_NAME)
End Sub
habe ich kein Problem, den Bodytext auszulesen (getestet mit OL2010).

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 02. Jul 2015, 14:23

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon Snarfensia » 06. Jan 2019, 09:54

Hallo und vielen Dank schon einmal für die Antworten ...

@Mmarkus
Lach, Ja und Nein ...

Wie ich oben schon schrieb, versuche ich prinzipiell erst einmal auf eine bereits vorliegende und gespeicherte *.msg Datei zuzugreifen.
Das ich dazu das Outlook Objekt brauche um den Container zu öffnen ist mir schon klar.

Jetzt fange aber meine Probleme an.

Wenn ich das "einfach so" deklariere und dann die msg Datei lade funktioniert das zwar, ich kann neben dem Betreff auch die Anhänge in der msg Datei auslesen, aber eben nicht
Sender und Body...

Warum das?
Denn in der msg Datei steht nach ANSI Editor alles (zumindest das, was so lesbar ist) und einige Sachen kann ich auslesen, warum Body und Sender nicht?

Auch wenn der Sender im Ansi lesbar ist könnte ich es ja noch verstehen, dass ich (wie bein Senden) erst einmal den Namespace zuweisen muss, um damit zu arbeiten, aber der Body?

Und jetzt kommt das klare NEIN (mit dem Verstehen was ich da mache).

Denn Aussagen bestehen, dass ich mich erst einmal bei meinem Bestehenden Mailaccount anmelden soll (das habe ich abgeprüft und auch Outlook bereits vorher gestartet).
Sollte Excel-VBA keinen direkten Durchgriff auf Outlook haben (obwohl andere Funktionen da funktionieren z.B. die Oulook Objekte in der Outlook Objekt Library ) natürlich auch da.

Beim Googeln habe ich oben genannte Office-Supportforum gefunden inkl. irgendwo (Verzeiflung macht´s möglich) den Tipp die LatestProfie Anweisung zu nutzen.
Alleine, um die gespeicherte Msg Datei zu öffnen?

So, und nun Entschuldigung dass ich die Netiquette verletze...
Seit mehreren Tagen und etlichen Stunden versuche ich diese blöden schei...gespeicherten msg Dateien wegen dem Body auszulesen und es klappt nicht. (Sorry :D)

Wir hatten ja schon einmal das mit dem Zugriff auf eine laufende Outlook Instanz und dem Zugriff auf den Body :badgrin:
Das hatte ich einmal hinten aufgeschoben und wollte wenigstens mich mal an einer gespeicherten msg. Datei versuchen, aber da dieselben Probleme?

@ knobbi38 (Ulrich)

Danke für den Link.

Den kann ich leider erst Montag wieder testen wie das andere auch, da ich dann wieder in der Firma bin.

Und da sind leider andere dll´s (die ich auch schon gefunden habe) nicht zugelassen.
Ein Modul geht aber immer :D

Grüße und Danke,
Snarf aka Matthias
Snarfensia
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14
Registriert: 10. Dez 2018, 12:06

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon mmarkus » 06. Jan 2019, 12:25

Snarfensia hat geschrieben:Warum das?


Das kann ich dir nicht sagen. Der Code passt jedenfalls nicht (die Sequenz auf dich ich dich schon aufmerksam gemacht habe).
GetNamespace liefert ja die Session auf die Ulrich direkt zugreift.
Insofern sind die Codes ja gleich.

Jeder der die Hilfe oder den Objektkatalog konsultiert, sieht das nach wenigen Augenblicken.

Mach es so wie im Beispiel von Ulrich. So mache ich es auch und es gibt kein Problem.

LG Markus
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1188
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon DerHoepp » 06. Jan 2019, 14:56

Hallo Markus und Ulrich,

Hier mal das Ergebnis meiner Recherchen (googlesuche nach "error 287 cannot read body of template"), die ich mangels eigener Outlook Installation nicht selbst nachvollziehen kann: das Problem ist, das bestimmte Konstellationen von Authentifizierung in Active Directories ein Login des Users benötigen. Startet dieser User jetzt über VBA aus einem anderen Programm eine neue Outlook-instanz, so steht zwar das Objektmodell grundsätzlich zur Verfügung, allerdings kann es Fehler beim Zugriff auf konkrete Member geben.
Das Problem äußert sich unter anderem dadurch, dass aus Vorlagen erstellte MailItems einen lesenden Zugriff auf die .Body Eigenschaft verwehren. Die einzigen Lösungen, die ich gefunden haben sind entweder das Nutzen einer vorhandenen Instanz, oder das einmalige Ansprechen der Session über GetNamespace(), und/oder ein manuell gesendetes LogOn.

Das eigentliche Problem ist, dass sich der Fehler nur mit gleicher Authentifizierung nachstellen lässt.

Viele Grüße
derHöpp
DerHoepp
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7381
Registriert: 14. Mai 2013, 11:08

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon knobbi38 » 07. Jan 2019, 00:46

Hallo derHöpp,
ist zumindest ein Ansatz für das eigenartige Verhalten. Der Code von Ron de Bruin versucht zunächst mal, eine bestehende Instanz zu nutzen und wenn das nicht geht, eine neue zu erzeugen. Allerdings wird keine Authentifizierung gemacht oder ein Profil ausgewählt. Insofern kann der OP das relativ einfach eruieren, indem er einmal mit und einmal ohne gestartetem Outlook das Beispiel ausprobiert. Von AD bzw. Exchange war bisher nichts erwähnt worden.

Bis jetzt gibt es noch keine Rückmeldung und damit auch keine neuen Erkenntnisse.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 594
Registriert: 02. Jul 2015, 14:23

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon Snarfensia » 07. Jan 2019, 09:54

Hallo und Entschuldigung, dass ich gestern noch nicht geantwortet habe.

Bei mir kam beim gestern beim Posten ein Datenbankfehler...

Ich versuche es jetzt einfach noch einmal :D


Um andere Fehler auszuschließen, denn mein alter Quelltext hat schon ein paar tausend Zeilen Code (und nein, vieles in Funktionen gelöst :roll: ), habe ich es als neues Projekt angelegt.

Über den Code von Ron deBruin bin ich schon einmal gestolpert, hatte den aber schon einmal mit dem Zugriff auf die Postfächer probiert.

Aber jetzt noch einmal...

Alles reinkopiert und den Code gestartet ... aber (Spannung)...

Egal, ob ich bei gestartetem OutlookBei der Fuction oder geschlossenem Outlook beginne, der Code bricht immer mit Fehler 287 ab.

Bei der Funktion GetMsgBody(ByVal Filename As String) As String kommt die Funktion nicht über die
GetMsgBody = olItem.Body Zuweisung hinaus.

Bei Step by Step Verfolgung wird der Code von Ron deBruin auch ganz "normal" abgearbeitet...

"Fehler" im Objekt "olItem" wie beschrieben...

Grüße,

Snarf
Snarfensia
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14
Registriert: 10. Dez 2018, 12:06

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon mmarkus » 07. Jan 2019, 10:15

Test mal mit einem anderen File.
Wenn du im Debug Modus das Objekt im Lokalbereich ansiehst, ist dann der Body lesbar?
Theoretisch könnte das File ja einen Fehler haben. Vielleicht hat ja da wer direkt im File rumgepfuscht. :D
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1188
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon Snarfensia » 07. Jan 2019, 13:10

Hi Markus.

Natürlich habe ich das auch mir anderen msg Dateien probiert und das Objekt im Lokalbereich kontrolliert.

Deswegen schrieb ich ja, dass im Objektbereich das Body-Item mit "<>" belegt ist.
Hatte auch schon gedacht, dass dieses in einem anderen Format vorliegt und auch damit "herumgespielt"...

Und "herumpfuschen" tue ich an den Files im Moment nur selber, deswegen kann ich ja sagen, dass in der Datei die Informationen vorhanden sind :roll: :D :o

Ich war so frei, und habe Dir eine PN geschickt, die hängt aber seit heute Morgen im Postausgang (hatte vorher noch eine verschickt)...


Grüße,
Snarf
Snarfensia
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14
Registriert: 10. Dez 2018, 12:06

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon Snarfensia » 08. Jan 2019, 11:05

Sooo....

Quälte Google weiter und habe folgendes herausgefunden, was ich mir schon gedacht hatte...
Es ist wirklich "fast" unlösbar, zumindest auf dem normalen Weg (lach, deswegen hatte ich im Originalpost dazu ja schon Workaround geschrieben)...

Handeln tut es sich nämlich um ein Securityproblem.
Das hängt mit den Sicherheitseinstellungen Serverseitig zusammen, denn an sich habe ich in den Sicherheitseinstellungen Clientmäßig vollen Zugriff auch mit Makros auf Outlook.
Serverseitig wird der Zugriff auf bestimmte Sachen (wie den .Body) unterbunden.
Jetzt weiß ich auch, warum das auch mit dem Absender der Nachricht ist, denn auch dieser Zugriff wird unterbunden (im Falle von SPAM/SCAM uswusw.)

Hier gibt es auch einen "Workaround", werde mich in der kommenden Zeit damit beschäftigen und ggf. dann nachberichten.

Hier der Link für Interessierte mit demselben Problem.
http://www.outlookcode.com/article.aspx?ID=52

Gruß,
Snarf
Snarfensia
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14
Registriert: 10. Dez 2018, 12:06

Re: Bestehende *.msg Datei öffnen bzw. auslesen

Beitragvon Snarfensia » 08. Jan 2019, 15:36

Workaround gefunden (leider nur bis Office 2003)...


Wer also ebenso das Problem hat, dass das TrustCenter „Programmgesteuerter Zugriffe“ nicht erlaubt (was auch gut ist) findet hier einen Workaround.

http://www.vboffice.net/de/developers/sicherheitsmodell-teil-2

Ist an sich ganz pfiffig, denn ich erstelle in Outlook ein Vetrauenswürdiges Objekt, auf das ich dann aus Excel zugreife.

Leider funktioniert das unter Office 2016 nicht mehr :(

Aber immerhin...

Wenn jemanden noch etwas einfällt...
EDIT:
Redemption ist auch noch eine Möglichkeit, aber externe dll´s in die Firma importieren...
http://www.dimastr.com/
Geht leider nicht...

Ich bleibe weiter dran...

Seers
Snarf
Snarfensia
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14
Registriert: 10. Dez 2018, 12:06


Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste