web-dev-qa-db-ja.com

pythonを使用したOutlook .msgファイルの解析

周りを見て、満足のいく答えを見つけることができませんでした。誰もがPythonでOutlookから.msgファイルを解析する方法を知っていますか?

Mimetoolsとemail.parserを試してみましたが、うまくいきませんでした。ヘルプは大歓迎です!

26
Michael

これは私のために働く:

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

To、CC、およびBCCプロパティの名前(例: "John Doe")だけでなく、電子メールアドレスにアクセスする方法については、次の投稿を参照してください。 リンクの説明をここに入力

33
Brent Edwards

Matt Walkerによる msg-extractor utilityを使用して、MS Outlookファイル(.msg)から関連フィールドを抽出することに成功しました。

前提条件

pip install extract-msg

追加のモジュールをインストールする必要がある場合があることに注意してください。私の場合、imapclientをインストールする必要があります。

pip install imapclient

使用法

import extract_msg

f = r'MS_Outlook_file.msg'  # Replace with yours
msg = extract_msg.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: {}'.format(msg_date))
print('Subject: {}'.format(msg_subj))
print('Body: {}'.format(msg_message))

MsgExtractorユーティリティには他にも多くの便利な機能がありますが、これは最初から始めるのがよいでしょう。

注意

ファイルC:\ Anaconda3\Scripts\ExtractMsg.py内の3〜8行目をコメントアウトする必要がありました。

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

エラーメッセージ:

line 3
    ExtractMsg:
              ^
SyntaxError: invalid syntax

これらの行をブロックすると、エラーメッセージは消え、コードは正常に機能しました。

9
Vladimir Lukin

これは古いスレッドですが、スレッドの件名exactlyの解決策を探している人にこの情報が役立つことを願っています。 githubのmattgwwalker のソリューションを使用することを強くお勧めします。これは OleFileIO_PLモジュール を外部にインストールする必要があります。

3
fatih_dur

次のリンクを参照してください。
[MS-OXMSG]:Outlookアイテム(.msg)ファイル形式
。msgファイルから読み取る
保存されたOutlookメッセージファイル* .msgの編集

Redemption およびその RDOSessionGetMessageFromMsgFileメソッドも使用できます。

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

pythonメールモジュールを試しましたが、msgファイルを正常に解析できない場合があります。

したがって、この場合、テキストまたはhtmlの後だけであれば、次のコードがうまくいきました。

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

上記のウラジミールと同様の方法で解析できました。ただし、forループを追加して小さな変更を加える必要がありました。 glob.glob(r'c:\ test_email * .msg ')はリストを返しますが、Message(f)はファイルまたはstrを予期します。

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