LoginSignup
43
53

More than 3 years have passed since last update.

【自動化】PythonでOutlookのメールを読み込む

Last updated at Posted at 2020-05-30

アナログな作業を自動化したい

私の日常業務の中に、Outlookで受信したメール中の「問い合わせ番号」「問い合わせタイトル」「URL」「受信日」などを、サーバーに格納されている管理表(Excel)に書き写すという超アナログな作業があります。

この作業をなんとか自動化できないかと思い、まず手始めにOutlookで受信したメールをPythonで読み込むことを行います。

色々と調べてみましたが、あまり情報がなく試行錯誤しながらどうにかできましたので、備忘録も兼ねて情報を残しておきます。
(私の家のOfficeはとても古くてOutlook2007です…。おそらく最新のOfficeでも同じだとは思いますが、うまくいかない場合はご容赦ください。)

最終的なコードはとてもシンプルです。

PythonでOutlookのメールを読み込む

前提

前提として私のOutlookのメールフォルダはこのようになっています。

outlook_folders.png

大きく言うと、
1. 個人用フォルダ
2. Yahooメールのフォルダ

があり、その中がさらにいくつかのフォルダに分かれています。

今回は「2. Yahooメールのアカウントフォルダ 」の「受信トレイ」のメールを読み込みたいとします。

フォルダの読み込み

outlookを操作するためにwin32com.clientをimportする必要があります。
私はAnacondaを使っていますが、特に追加でインストールしなくてもimportできました。


import win32com.client

次にOutlookのオブジェクトを作成します。


outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

このoutlookというオブジェクトはFoldersという属性を持っていて、これが「1. 個人用フォルダ」「2. Yahooメールのアカウントフォルダ」に対応しています。

accounts = outlook.Folders
for account in accounts:
    print(account)

結果

個人用フォルダ
**********@yahoo.co.jp

このaccountというのはさらにFoldersという属性を持っていて、これがさらに下の階層のフォルダに対応しています。

ここまでをまとめると


print("root (アカウント数=%d)" % accounts.Count)
for account in accounts:
    print("└ ",account)
    folders = account.Folders
    for folder in folders:
        print("  └ ",folder)

実行結果

root (アカウント数=2)
└  個人用フォルダ
  └  削除済みアイテム
  └  受信トレイ
  └  送信トレイ
  └  送信済みアイテム
  └  予定表
  └  連絡先
  └  履歴
  └  メモ
  └  仕事
  └  下書き
  └  RSS フィード
  └  迷惑メール
└  **********@yahoo.co.jp
  └  受信トレイ
  └  Bulk Mail
  └  Draft
  └  Sent
  └  Trash

以外にシンプルですね。

メールの読み込み

最終的に得られたfolderの中に実際のメールが入っているわけですが、このfolderはItemsという属性を持っていて、これが「メール」に対応しています。

Itemsで得られるメールはイテラブルオブジェクトになっているのでfor文で1つずつ取り出します。


mails = folder.Items
for mail in mails:
    print("件名: " ,mail.subject)
    print("差出人: %s [%s]" % (mail.sendername, mail.senderEmailAddress))
    print("受信日時: ", mail.receivedtime)
    print("未読: ", mail.Unread)
    print("本文: ", mail.body)
属性 意味
mail.subject 件名
mail.sendername 差出人名
mail.senderEmailAddress 差出人のメールアドレス
mail.receivedtime 受信日時
mail.body 本文
mail.Unread 未読フラグ

するとこんな感じでメールの内容が取得できていることがわかります。

件名:  これはテストです
差出人: *** [*******@gmail.com]
受信日時:  2020-05-30 07:17:33+00:00
未読:  False
本文:  ちゃんと受け取れてますか?

まとめ

最後にコードをまとめておきます。


import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

accounts = outlook.Folders

print("root (アカウント数=%d)" % accounts.Count)
for account in accounts:
    print("└ ",account)
    folders = account.Folders
    for folder in folders:
        print("  └ ",folder)
        mails = folder.Items
        for mail in mails:
            print("-----------------")
            print("件名: " ,mail.subject)
            print("差出人: %s [%s]" % (mail.sendername, mail.senderEmailAddress))
            print("受信日時: ", mail.receivedtime)
            print("未読: ", mail.Unread)
            print("本文: ", mail.body)

実行結果

root (アカウント数=2)
└  個人用フォルダ
  └  削除済みアイテム
  └  受信トレイ
  └  送信トレイ
  └  送信済みアイテム
  └  予定表
  └  連絡先
  └  履歴
  └  メモ
  └  仕事
  └  下書き
  └  RSS フィード
  └  迷惑メール
└  **********@yahoo.co.jp
  └  受信トレイ

-----------------
件名:  これはテストです
差出人: *** [*******@gmail.com]
受信日時:  2020-05-30 07:17:33+00:00
未読:  False
本文:  ちゃんと受け取れてますか?

プログラムをexeファイルにするには

Pythonのプログラムをexeファイルにしたい場合にはこちらをご覧ください。

【自動化】Pythonコードをexeファイル化する
https://qiita.com/konitech913/items/6259f13e057bc25ebc23

43
53
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
53