2008-08-19 7 views
16

Je dois lire à partir du fichier .MSG Outlook dans .NET sans en utilisant COM API pour Outlook (car il ne sera pas installé sur les machines que mon application va exécuter). Existe-t-il des bibliothèques tierces gratuites pour le faire? Je veux extraire les champs De, To, CC et BCC. Les champs de date d'envoi/réception seraient bons s'ils sont également stockés dans des fichiers MSG.Lire à partir de fichiers .msg

Répondre

9

Mise à jour: J'ai trouvé une bibliothèque 3ème partie COM appelé Outlook Redemption qui fonctionne très bien pour moi en ce moment. Si vous l'utilisez via COM-Interop dans .NET, n'oubliez pas de libérer chaque objet COM une fois que vous avez terminé, sinon votre application se bloque aléatoirement.

+0

wow, je viens de faire un essai et c'est super facile à utiliser. Je vais ajouter une réponse avec un peu de code de harnais de test. – Knox

0

Si vous ouvrez le fichier .MSG dans un éditeur de texte, je crois que vous trouverez que les informations que vous recherchez sont stockées sous forme de texte dans le fichier. (Il est sur tous les messages que j'ai vérifié au moins)

Il serait assez facile d'écrire du code pour analyser le fichier à la recherche de lignes commençant par "De:" ou "À:", etc., puis extraire le informations dont vous avez besoin.

Si vous avez également besoin du corps de l'e-mail, cela peut être un peu plus compliqué.

+1

Je crois que les fichiers binaires sont des thats .msg –

+0

Ils sont, mais il a raison. Essayez et voyez par vous-même – rotard

3

C'est un document "Structured Storage". J'ai utilisé avec succès Andrew Peace's code pour les lire dans le passé, même sous .NET (en utilisant C++/CLI) - c'est propre et assez facile à comprendre. Fondamentalement, vous devez déterminer quels disques vous avez besoin, et rechercher pour ceux - il devient un peu poilu, puisque différentes versions d'Outlook et différents types de messages se traduiront par différents enregistrements ...

10

Il y a code disponible sur CodeProject pour lire les fichiers .msg sans COM. Voir here.

+1

c'est pas mal (c'est gratuit et open source!) Mais ne supporte pas les champs de date sur un msg (encore) –

+0

Avec une légère modification cela peut également enregistrer des pièces jointes (pour le moment il affiche simplement s'il y en a, et Taille). –

+0

@Steve un commentateur partagé les instructions pour obtenir la date d'envoi/reçu ici: http://www.codeproject.com/Articles/32899/Reading-an-Outlook-MSG-File-in-C?msg=2932319#xx2932319xx (faites défiler jusqu'à la fin) – Ciaran

8

Voici un exemple de code VBA utilisant Outlook Redemption que Huseyint a trouvé.

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

Vous pouvez essayer notre bibliothèque (commerciale) Rebex Secure Mail. Il peut lire le format Outlook MSG. code suivant montre comment:

// 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); 

Plus d'informations sur les dates reçus et envoyés et comment sont-ils représentés dans le message peut être trouvé à http://forum.rebex.net/questions/816/extract-senttime-receivetime-and-time-zones

Questions connexes