アカウント作成時のメール認証リンクをMailSlurp + Pythonで踏んでみた

# はじめに
テストでアカウントを大量に作る必要があったので、操作の自動化しようと思ったのですがメール認証が！
むむむ... :disappointed_relieved: どうしよう...と思っていたところ、 `MailSlurp` なるものがあることを教えてもらいました。
よし！挑戦してみよう！

# 利用環境
* macOS Big Sur 11.1
* Python 3.8.6

# 手順
### 準備
1. [MailSlurp公式サイト](https://www.mailslurp.com/) でアカウントを作成します
2. アカウントを作成すると API Key が発行されるのでメモしておきます

[MailSlurp公式サイト](https://www.mailslurp.com/) に再ログインする場合は、 [ログイン画面](https://app.mailslurp.com/login/) で登録したメールアドレスを入力します。
するとメールにアクセス用のリンクボタンが送られてくるので、そこからアクセスします。

### curl
まず試しにcurlで叩いてみます。

* メール Inbox の作成

```bash
% curl -X POST https://api.mailslurp.com/inboxes?apiKey=xxxxxxxx
```

レスポンスで `InboxのID` と `メールアドレス` が取得できます。

* 受信メールの確認

```bash
% curl https://api.mailslurp.com/inboxes/ 『InboxのID』 /emails?apiKey=xxxxxxxx
```
メールがあると以下のようなレスポンスが返ってきます。

```bash
[{
　"id":" 『メールのID』 ",
　"subject":" 『メールの件名』 ",
　"to":[" 『MailSlurpで発行したメールアドレス』 "],
　"from":" 『メール差出人』 ",
　"bcc":[],
　"cc":[],
　"createdAt":"2021-01-29T07:20:43.295Z",
　"read":false,
　"attachments":[],
　"created":"2021-01-29T07:20:43.295Z"
}]
```
* 全メール削除

```bash
% curl -X DELETE https://api.mailslurp.com/inboxes/ 『InboxのID』 /emails?apiKey=xxxxxxxx
```

* InBox の削除

```bash
% curl -X DELETE https://api.mailslurp.com/inboxes/ 『InboxのID』 ?apiKey=xxxxxxxx
```

### Python
curlで基本的な動きを確認できたのでPythonで実装していきます。
まず pip でインストールします。

```bash
% pip install mailslurp-client
```

### 実装
MailSlurpで受信したメールのメール本文を取得してみます。

```python
import mailslurp_client
from mailslurp_client.rest import ApiException

configuration = mailslurp_client.Configuration()
configuration.api_key['x-api-key'] = ### API Key ###

with mailslurp_client.ApiClient(configuration) as api_client:
    api_instance = mailslurp_client.WaitForControllerApi(api_client)
    inbox_id = ### InboxのID ###
    timeout = 3000
    unread_only = False

    try:
        email = api_instance.wait_for_latest_email(inbox_id = inbox_id, timeout = timeout, unread_only = unread_only)
        print(email.body)   # 一旦ここでは出力まで
    except ApiException as e:
        print(e)
```

上記でメール本文を取得します。
上では取得した本文を出力するだけになっていますが、実際には正規表現等で本文から欲しい箇所を抽出して、selenium 等に渡します。

メールの本文から目的の要素を取得したらメールは不要になるので削除するようにします。

```python
with mailslurp_client.ApiClient(configuration) as api_client:
    api_instance = mailslurp_client.EmailControllerApi(api_client)
    try:
        api_instance.delete_all_emails()
    except ApiException as e:
        print(e)
```

### 合体
```python
import mailslurp_client
from mailslurp_client.rest import ApiException

configuration = mailslurp_client.Configuration()
configuration.api_key['x-api-key'] = ### API Key ###

def main():
    get_url()
    delete_all_email()

def get_url():
    with mailslurp_client.ApiClient(configuration) as api_client:
        api_instance = mailslurp_client.WaitForControllerApi(api_client)
        inbox_id = ### InboxのID ###
        timeout = 3000
        unread_only = False

        try:
            email = api_instance.wait_for_latest_email(inbox_id = inbox_id, timeout = timeout, unread_only = unread_only)
            print(email.body)   # 一旦ここでは出力まで
        except ApiException as e:
            print(e)

def delete_all_emails():
    with mailslurp_client.ApiClient(configuration) as api_client:
        api_instance = mailslurp_client.EmailControllerApi(api_client)
        try:
            api_instance.delete_all_emails()
        except ApiException as e:
            print(e)

if __name__ == "__main__":
    main()
```
今回はメール本文の取得までを目標としたので selenium 部分は省略します。

# まとめ
MailSlurp 自体は良い感じだったのですが、無料アカウントだとメール受信数の月の制限が厳しく（100通）テストで使うには難しいかも :persevere:

# 参考
[GitHub（mailslurp / mailslurp-client-python）](https://github.com/mailslurp/mailslurp-client-python)


# We are recruiting !
株式会社GENZではソフトウェアのテストサービス業務を行っています。
キャリア採用も行っておりますので、ご興味がある方は以下をご確認ください！
[株式会社GENZ - Webテスト自動化]
(https://www.genz.jp/test-service-menu/web-test-automation/?qi=20210201)
[株式会社GENZ - 採用情報]
(https://www.genz.jp/recruit/?qirecruit=20210201)