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

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

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

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

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

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

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

<img width="163" alt="outlook_folders.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/e9ef2f61-5220-c7c3-76aa-5b2b9ceca346.png">

大きく言うと、
1. 個人用フォルダ
2. Yahooメールのフォルダ  
があり、その中がさらにいくつかのフォルダに分かれています。

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

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

```python

import win32com.client
```

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

```python

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

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

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

結果

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

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

ここまでをまとめると

```python

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つずつ取り出します。

```python

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
本文:  ちゃんと受け取れてますか？
```

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

```python

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