web-dev-qa-db-fra.com

Analyser les fichiers .msg d'Outlook avec Python

J'ai regardé autour de moi et je n'ai pas trouvé de réponse satisfaisante. Est-ce que quelqu'un sait comment analyser les fichiers .msg à partir d'Outlook avec Python?

J'ai essayé d'utiliser mimetools et email.parser sans succès. De l'aide serait grandement appréciée!

22
Michael

Cela fonctionne pour moi:

import win32com.client
Outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
msg = Outlook.OpenSharedItem(r"C:\test_msg.msg")

print msg.SenderName
print msg.SenderEmailAddress
print msg.SentOn
print msg.To
print msg.CC
print msg.BCC
print msg.Subject
print msg.Body

count_attachments = msg.Attachments.Count
if count_attachments > 0:
    for item in range(count_attachments):
        print msg.Attachments.Item(item + 1).Filename

del Outlook, msg
30
Brent Edwards

J'ai réussi à extraire des champs pertinents de fichiers MS Outlook (.msg) à l'aide de msg-extractor utilitity de Matt Walker.

Pré-requis

pip install msg-extractor

Notez qu'il peut être nécessaire d'installer des modules supplémentaires, dans mon cas, il a fallu installer imapclient:

pip install imapclient

Usage

import ExtractMsg
import glob

f = r'MS_Outlook_file.msg'  # Replace with yours
msg = ExtractMsg.Message(f)
msg_sender = msg.sender
msg_date = msg.date
msg_subj = msg.subject
msg_message = msg.body

print('Sender: {}'.format(msg_sender))
print('Sent On: {}, Sender: {}'.format(msg_date))
print('Subject: {}'.format(msg_subj))
print('Body: {}'.format(msg_message))

L'utilitaire MsgExtractor contient de nombreux autres avantages, mais il est bon de commencer.

Remarque

J'ai dû commenter les lignes 3 à 8 du fichier C:\Anaconda3\Scripts\ExtractMsg.py:

#"""
#ExtractMsg:
#    Extracts emails and attachments saved in Microsoft Outlook's .msg files
#
#https://github.com/mattgwwalker/msg-extractor
#"""

Le message d'erreur était:

line 3
    ExtractMsg:
              ^
SyntaxError: invalid syntax

Après avoir bloqué ces lignes, le message d'erreur a disparu et le code a fonctionné correctement. 

4
Vladimir Lukin

Même s’il s’agit d’un vieux fil de discussion, j’espère que cette information pourra aider quelqu'un qui cherche une solution à ce que dit le sujet du fil exactement. Je conseille vivement d'utiliser la solution mattgwwalker dans github , qui nécessite le module OleFileIO_PL pour être installé à l'extérieur.

3
fatih_dur

Voir les liens suivants:
[MS-OXMSG]: Format de fichier d'élément Outlook (.msg)
Lire des fichiers .msg ,
Modifier un fichier de message Outlook enregistré * .msg

Vous pouvez également utiliser Redemption et sa méthode RDOSession .GetMessageFromMsgFile:

  set Session = CreateObject("Redemption.RDOSession")
  set Msg = Session.GetMessageFromMsgFile("c:\temp\test.msg")
  MsgBox Msg.Subject
1

J'ai essayé le module de messagerie python et parfois, cela ne permet pas d'analyser correctement le fichier msg.

Donc, dans ce cas, si vous êtes seulement après text ou html, le code suivant a fonctionné pour moi.

start_text = "<html>"
end_text = "</html>"
def parse_msg(msg_file,start_text,end_text):
  with  open(msg_file) as f:
    b=f.read()
  return b[b.find(start_text):b.find(end_text)+len(end_text)]

print parse_msg(path_to_msg_file,start_text,end_text)
0
paolov

J'ai été capable de l'analyser de la même manière que Vladimir mentionné ci-dessus. Cependant, je devais apporter de petites modifications en ajoutant une boucle for. Glob.glob (r'c:\test_email * .msg ') renvoie une liste alors que le message (f) attend un fichier ou une chaîne.

f = glob.glob(r'c:\test_email\*.msg')

for filename in f:
    msg = ExtractMsg.Message(filename)
    msg_sender = msg.sender
    msg_date = msg.date
    msg_subj = msg.subject
    msg_message = msg.body
0
Sazzad