【Python入門】imaplibを使ってメールを取得

##目的
・IMAPサーバからPythonを使ってメールオブジェクトを取り出す
・JupyterNotebookを使ってPythonコードを記述してみる

##当プログラムの機能
（1）メールサーバにログイン
（2）IMAPサーバからメールオブジェクトを取り出す

##環境
▼基礎環境

| 項目      |   内容       |
|:----------|:-----------:|
| Host OS | Windows10 |
| 仮想ツール | Virtual Box Ver.5.2.16 |
| 仮想 OS | Ubuntu 16.04 |
| Python | Python 3.6.6 |
| Other ツール | Jupyter Notebook |

▼Python module

| module 名 |   module 概要  |
|:--------------|:-----------|
| email | 電子メールメッセージを読む・書く・送信するためのモジュール |
| ssl | 暗号化とクライアント、サーバサイド両方のネットワークソケットのための認証モジュール |
| imaplib | サーバからメールを取得するためのモジュール |
| email.header | 文字コードを適切に変換するためのモジュール |


##作業環境前提
（1）Windows10上にVirtualBoxがインストール済み
（2）VirtualBox上にUbuntu16.04が設置済み
（3）Ubuntu上にPythonとJupyter Notebookインストール済み
（4）必要Python moduleインストール済み

##完成コード全体
・先に完成予定のコードを下記に…

```python:mail_test.py
# -*- coding: utf-8 -*-
# source code name: mail_test.py

import email
import ssl
import imaplib
from email.header import decode_header, make_header
imaplib._MAXLINE = 10000000

# mail server へのログインに必要な情報
HOST = "imap.mail.****.****.co.jp"
USER = "ichitaro@****.****.co.jp"
PASS = "******************"

# クライアントインスタンス作成
settings = ("ssl", 993)
context = ssl.create_default_context()
imapclient = imaplib.IMAP4_SSL(HOST, settings[1], ssl_context=context)

# ログイン実行
imapclient.login(USER, PASS)

# INBOXからオブジェクト取り出し
imapclient.select('INBOX', readonly=True)
typ, data = imapclient.search(None, '(SINCE "11-Nov-2018")')

print(typ)
print(data)

```

・今回の内容では、このコード記述をJupter Notebookを使いながら説明しています

##以降の流れ
1．Jupyter Notebookの基本設定
　① 作業フォルダ作成
　② 起動
　③ 新規プロジェクト作成
　④ プロジェクト名変更

2．プログラミング
　① メールサーバにログイン
　② IMAPサーバからメールオブジェクト取り出し

##内容
###Jupyter Notebookの基本設定
####① 作業フォルダ作成
・homeディレクトリ上にsrcフォルダを作り、その下にmail_labフォルダを作る。
・今後は、ここにデータを保存していく。

```console:ubuntu16.04
$ cd
$ mkdir src
$ mkdir src/mail_lab
$ cd src/mail_lab
```

####② 起動
・移動先の作業フォルダ内にてJupyter Notebookを起動

```console:ubuntu16.04
$ jupyter notebook
```

▼実行結果
![o0869047514300717426.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/88bc1aef-ed7c-4c05-dab6-2be058a87b49.jpeg)

####③ 新規プロジェクト作成
・NewをクリックしてPython3を選択する

▼作業画面
![o0746027014300719759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/ea0d9023-564f-fb02-ae3f-df09dbe05275.png)

####④ プロジェクト名変更
・画面左上の「Untitled」をクリック

▼画面
![o0765031814300720384.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/82243774-ce98-ed6c-bdee-c21a5f91a65c.png)

・ポップアップ表示

▼クリック後のポップアップ画面
![o0763031214300722776.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/9d45eef5-4f34-053f-0664-7afc2e0e0f49.png)

・フォーム欄にタイトル名として「mail_test」と記述し「Rename」をクリック

▼フォーム画面
![o0744022214300723713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/233b87b0-0e0f-c239-1522-4c7b36e7978c.png)

▼実行結果（変更完了）
![o0768015914300724632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/40530bff-7c70-20eb-aaa4-63bdaef01d1b.png)


###プログラミング
####① メールサーバにログイン
・Jupyter Notebookのインターフェースを使った必要moduleをインポート
・In[] の右欄にインポートするモジュールを記述し、画面上メニュー欄の「Run」をクリック

▼実行結果
![o0768036914300727033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/3d51d968-2188-a8e9-94c5-514c8046781f.png)
・エラーが表示されなければ問題なし

・せっかくなので、メモも追加してみる
・上部メニュー欄から「Cell」をクリック
・メニューが表示されるので、「Cell Type」の中から「Markdown」を選択

▼画面
![o0767035914300728328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/f4a97ed6-e475-694e-5306-c488f5d632ac.png)

・In[]の右欄にコメントを追加

▼コメントを入れたところの画面
![o0769032514300731872.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/1c2cedb4-e149-4a93-fd67-177a16690013.png)
・「Run」をクリックすると、次のセルが出力される

・ログインに必要な情報を変数に入れる

▼追加して「Run」な感じの画面
![o0769037214300734796.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/97d5562d-4766-5e22-85e8-dab02fb8ff21.png)
※ちなみに「*」は、単純に伏字にしているだけですので、変数に入れる情報は、各自のメールサーバに合わせて記述してください

・インスタンス作成

▼コードイメージ
![o0770020514300741063.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/59581975-2d33-a36e-4d69-bcaa240719d3.png)

・いよいよログイン！
・下記の記述を行い、「Run」します

▼成功の瞬間
![o0769018314300742764.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/afa58f50-9145-a9cb-a4ab-93f8f4ed7638.png)


####② IMAPサーバからメールオブジェクト取り出し
・ここまで来たので、オブジェクトを取り出してみます
・テストとして、2018年11月10日に届いたメールオブジェクトを取り出してみます

▼オブジェクトを取り出した瞬間！
![o0767029814300745971.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487902/054f9b5c-847d-72f2-96f9-ece936599484.png)

・はい！...地味...ですね。
・今回は、ここまでです。
・あとは、取り出したオブジェクトを目的に沿って煮るなり焼くなりです！

##まとめ
・地味にオブジェクトを取り出すときに、なかなかうまくいかず苦労しました。
・古いサイトや書籍を参考にしてしまったために失敗失敗でした。
・余談として、Jupyter Notebookで実行を確認していた際に、一定の時間が経過すると、ログインセッションが切れてしまうらしく、記述は合っているのにエラーが発生するということがありました。そんな時は、作成したコード全体を改めて「Run」してあげると解決します。

##References
書籍：
　『退屈なことはPythonにやらせよう』
　『Pythonによるクローラー＆スクレイピング入門』
　『Pythonによるスクレイピング＆機械学習[開発テクニック]』