Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
34
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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

私の日常業務の中に、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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
34
Help us understand the problem. What are the problem?