2008-08-19 18 views
16

Ich muss aus Outlook MSG-Datei in .NET ohne mit COM-API für Outlook lesen (weil es nicht auf den Computern installiert wird, die meine App ausgeführt wird). Gibt es dafür kostenlose Bibliotheken von Drittanbietern? Ich möchte From, To, CC und BCC Felder extrahieren. Gesendet/Empfängt Datum Felder wäre gut, wenn sie auch in MSG-Dateien gespeichert sind.Lesen von MSG-Dateien

Antwort

9

Update: Ich habe eine 3rd-Party-COM-Bibliothek gefunden Outlook Redemption genannt, die für mich arbeitet gut im Moment. Wenn Sie es über COM-Interop in .NET verwenden, vergessen Sie nicht, jedes COM-Objekt freizugeben, nachdem Sie damit fertig sind, andernfalls stürzt Ihre Anwendung zufällig ab.

+0

wow, ich habe es einfach versucht und es ist super einfach zu bedienen. Ich füge eine Antwort mit einem Test-Kabelbaum-Code hinzu. – Knox

0

Wenn Sie die .MSG-Datei in einem Texteditor öffnen, werden Sie feststellen, dass die Informationen, die Sie suchen, als einfacher Text in der Datei gespeichert werden. (Es ist auf allen Nachrichten, die ich mindestens überprüft habe)

Es wäre ziemlich einfach, etwas Code zu schreiben, um die Datei auf der Suche nach Zeilen beginnend mit "From:" oder "To:" etc. und dann extrahieren die Informationen, die Sie brauchen.

Wenn Sie auch den Text der E-Mail benötigen, kann das etwas komplizierter sein.

+1

finden ich, das ist EML-Dateien glauben .MSG binär sind –

+0

Sie sind, aber Er hat Recht. Probieren Sie es aus und sehen Sie selbst – rotard

3

Es ist ein "strukturiertes Speicher" Dokument. Ich habe erfolgreich Andrew Peace's code verwendet, um diese in der Vergangenheit zu lesen, sogar unter .NET (mit C++/CLI) - es ist sauber und ziemlich einfach zu verstehen. Im Grunde müssen Sie herausfinden, welche Datensätze Sie benötigen, und für diese abfragen - es wird ein bisschen haarig, da verschiedene Versionen von Outlook und verschiedene Arten von Nachrichten zu unterschiedlichen Datensätzen führen ...

10

Es gibt Code vorhanden in CodeProject zum Lesen von MSG-Dateien ohne COM. Siehe here.

+1

es ist nicht schlecht (seine freie & Open Source!), Aber unterstützt keine der Datumsfelder auf einer msg (noch) –

+0

Mit einer leichten Änderung kann dies auch Anhänge speichern (im Moment zeigt es nur, ob es welche gibt, und die Größe). –

+0

@Steve ein Kommentator teilte die Anweisungen zum Abrufen des Sende-/Empfangsdatums hier: http://www.codeproject.com/Articles/32899/Reading-an-Outlook-MSG-File-in-C?msg=2932319#xx2932319xx (bis zum Ende scrollen) – Ciaran

8

Hier ist ein Beispiel VBA-Code mit Outlook Redemption, dass Huseyint gefunden.

Public Sub ProcessMail() 

    Dim Sess As RDOSession 
    Dim myMsg As RDOMail 
    Dim myString As String 

    Set Sess = CreateObject("Redemption.RDOSession") 
    Set myMsg = Sess.GetMessageFromMsgFile("C:\TestHarness\kmail.msg") 

    myString = myMsg.Body 
    myMsg.Body = Replace(myString, "8750", "XXXX") 

    myMsg.Save 

End Sub 
1

Sie können unsere (kommerzielle) Rebex Secure Mail Bibliothek versuchen. Es kann Outlook MSG-Format lesen. Folgende Code zeigt, wie:

// Load message 
MailMessage message = new MailMessage(); 
message.Load(@"c:\Temp\t\message.msg"); 

// show From, To and Sent date 
Console.WriteLine("From: {0}", message.From); 
Console.WriteLine("To: {0}", message.To); 
Console.WriteLine("Sent: {0}", message.Date.LocalTime); 

// find and try to parse the first 'Received' header 
MailDateTime receivedDate = null; 
string received = message.Headers.GetRaw("Received"); 
if (received != null) 
{ 
    int lastSemicolon = received.LastIndexOf(';'); 
    if (lastSemicolon >= 0) 
    { 
     string rawDate = received.Substring(lastSemicolon + 1); 
     MimeHeader header = new MimeHeader("Date", rawDate); 
     receivedDate = header.Value as MailDateTime; 
    } 
} 

// display the received date if available 
if (receivedDate != null) 
    Console.WriteLine("Received: {0}", receivedDate.LocalTime); 

Mehr Informationen zu gesendeten und empfangenen Termine und wie werden sie in der Nachricht dargestellt wird, kann bei http://forum.rebex.net/questions/816/extract-senttime-receivetime-and-time-zones