NeomuttでGmailにOAuth2.0する

# NeomuttでGmailにOAuth2.0する

更新しました　
https://qiita.com/ksuzuki_TVDn1/items/e90a93862c382d7cd67f

## TL;DR

* **http://www.mutt.org/doc/manual/#oauth**

1. GmailでIMAP/POPの基本認証が使えなくなる
2. neomuttはOAuth対応済み
3. 設定すれば使える

## まえがき

皆さんご承知おきのとおり、Office365とGSuiteでPOP/IMAPの基本認証が使えなくなります。(知りませんでしたが)

* https://support.microsoft.com/ja-jp/help/4521831/exchange-online-deprecating-basic-auth
* https://gsuiteupdates-ja.googleblog.com/2019/12/g-suite_24.html

GSuiteでメールが受信できなくなると、仕事のメールが受信できなくなってしまうため、とても困ります。
OAuth対応のメールクライアントなら何でも良いらしいので、こっそりOAuth対応していたmuttでの対応方法を書きます。


## 手順

### GsuiteでOAuthクライアントIDを作成する

##### 1. 以下のURLを開き、Google Cloud PlatformのAPIサービス設定を開きます。
    
https://console.developers.google.com/apis/credentials

##### 2. [新しいプロジェクト]を作成から、mutt用のプロジェクトを作成します。

Google Cloud Platformのロゴの右側あたりの「▷hogehoge▽」の部分を押すと作れました。

* いい感じの画像が取れなかったのでテキストでなんとか…
      
##### 3. [認証情報を作成]から、「OAuth 2.0 クライアント ID」を作成します

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/d319053b-56e0-f823-5266-4812db3c091c.png)

##### 4. 適当な識別名を入力します。(管理上の問題だけなので何でも良いです)

今回は[その他]-[linux]で作成しました。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/31a5635f-16e1-15a8-8141-b42509142d6a.png)


##### 5. 作成が完了すると、以下のような画面が表示されます。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/a58699d9-4e39-a5f1-eb16-b560f8783cd4.png)

以上でGSuite側の手順は終わりです。

-----

### 実際にOAuthでの認可を行う

##### 1. 以下のURLからスクリプトをダウンロード

 ~~https://github.com/google/gmail-oauth2-tools/blob/master/python/oauth2.py~~
* python2で書かれていて不便なので誰か3になおしてください。 


APIバージョンも古く動かなくなったので、[なおしました (https://github.com/ksuzukiTVDn1/gmail-oauth2-tools/blob/master/python/oauth2.py)](https://github.com/ksuzukiTVDn1/gmail-oauth2-tools/blob/master/python/oauth2.py)

##### 2. スクリプトを実行し、OAuthを実行

```shell
/usr/bin/python2 oauth2.py \
--user=<Gmailのアドレス> \
--client_id=<「OAuthクライアントを作成しました」の画面のクライアントID> \
--client_secret=<「OAuthクライアントを作成しました」の画面のクライアントシークレット> \
--generate_oauth2_token
```

##### 3. 以下のような遷移先のURLが表示されるので、ブラウザに入力する

```
To authorize token, visit this url and follow the directions:
  https://accounts.google.com/o/oauth2/auth?client_id=～～～
```

##### 4. 認可を求められるので許可

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96182/a01b8005-af44-f734-723f-86d1ef4b6e19.png)

##### 5. 許可をすると、文字列が表示されるので、出てきた内容をコンソールに入力

```
Enter verification code:<出力された文字列を入力>
```

##### 6. OAuthのリフレッシュトークン、アクセストークンが表示される

```
Refresh Token: 
Access Token: 
Access Token Expiration Seconds: 3599
```

-------

### muttrcでの設定

##### 1. 以下のようにファイルを配置します。

```
┬ .mutt
├ muttrc
└ oauth2.py
```

##### 2. muttrcで接続設定を以下のように変更します。

```
set imap_authenticators="oauthbearer"
set imap_oauth_refresh_command="/usr/bin/python2 ~/.mutt/oauth2.py \
  --quiet \
  --user=<Gmailのアドレス> \
  --client_id=<「OAuthクライアントを作成しました」の画面のクライアントID> \
  --client_secret=<「OAuthクライアントを作成しました」の画面のクライアントシークレット> \
  --refresh_token=<コンソールでの操作で表示された、6.のリフレッシュトークン>"

set smtp_authenticators="oauthbearer"
set smtp_oauth_refresh_command="/usr/bin/python2 ~/.mutt/oauth2.py \
  --quiet \
  --user=<Gmailのアドレス> \
  --client_id=<「OAuthクライアントを作成しました」の画面のクライアントID> \
  --client_secret=<「OAuthクライアントを作成しました」の画面のクライアントシークレット> \
  --refresh_token=<コンソールでの操作で表示された、6.のリフレッシュトークン>"
```

##### 3. おまけ
ClientID, ClientSecret, RefreshTokenについては、GnuPGで暗号化するとなお安心です。

暗号化のやりかたは以下の通り。（GnuPGが設定済みの前提）

```
cat oauth_token
set imap_oauth_refresh_command="/usr/bin/python2 ~/.mutt/oauth2.py \
  --quiet \
  --user=<Gmailのアドレス> \
  --client_id=<「OAuthクライアントを作成しました」の画面のクライアントID> \
  --client_secret=<「OAuthクライアントを作成しました」の画面のクライアントシークレット> \
  --refresh_token=<コンソールでの操作で表示された、6.のリフレッシュトークン>"

set smtp_oauth_refresh_command="/usr/bin/python2 ~/.mutt/oauth2.py \
  --quiet \
  --user=<Gmailのアドレス> \
  --client_id=<「OAuthクライアントを作成しました」の画面のクライアントID> \
  --client_secret=<「OAuthクライアントを作成しました」の画面のクライアントシークレット> \
  --refresh_token=<コンソールでの操作で表示された、6.のリフレッシュトークン>"

gpg -r <uid> -e oauth_token
shred oauth_token
rm oauth_token
```

```
source "gpg -d ~/.mutt/oauth_token.gpg |"
```