見出し画像

Outlook.comやHotmailをgetmailでOAuth2認証する。

Outlook.comをフリーメールとして長年使っている。なんだかよく分からない通知が届いた。『2024 年 9 月 16 日以降、安全性の低いサインイン テクノロジーが使用されているアプリでメールにアクセスすることができなくなります。

今使っているメーラーはgetmail (Pythonスクリプトで出来ていて、コンソールで実行するメール受信コマンド) で、「先進認証方式」なんか設定した記憶が無い。本文中で紹介されているMSの解説ページを日本語表示してもさっぱり理解できない。とりあえず認証方式で「OAuth2」を使うよう変更したら良いと理解した。

getmail6 (getmailのバリエーション)
https://getmail6.org/

オリジナルのgetmail
https://pyropus.ca./software/getmail/


大まかな手順

1.Office365クラウド側の設定。
1-1.AzureのMicrosoft Entra IDにアプリケーションを登録。
1-2.登録したアプリケーションにアクセス許可を追加。
1-3.クライアントシークレットを作成。
2.クライアント側の二要素認証。
2-1.承認要求とトークン保存。
3.メーラー設定。
3-1.メーラーにOAuth2の使用とアクセストークンを設定。

使用環境

Windows11上のWLS2で動くDebian11 (11.10)。
getmail6の6.14 (Debian11のパッケージ)
Python3の3.9.2 (Debian11のパッケージ

具体的な手順

1-1.AzureのMicrosoft Entra IDにアプリケーションを登録。

(前準備)
Azure管理ポータル https://portal.azure.com/
→「無料ではじめる」を使って試用開始にする。※
→ Microsoft Entra ID
→ 既定のディレクトリ 概要 の テナントの管理
→ 既定のディレクトリ usernamedomain.onmicrosoft.com を既定にする。

※数個のEntra IDで認証をするだけならたぶん無料の範囲。

必要な設定

アプリケーションの登録 でアプリケーションを登録する。

名前:
getmail (任意)

サポートされているアカウントの種類:
任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人用の Microsoft アカウント (Skype、Xbox など)

リダイレクト URI:
パブリック クライアント/ネイティブ (モバイルとデスクトップ)
http://locahost/
※設定するアドレスはダミー。

1-2.登録したアプリケーションにアクセス許可を追加。
アプリの登録
→ すべてのアプリケーション
→ 作成したアプリケーション getmail に入る。

API のアクセス許可 で アクセス許可の追加
MIcrosoft Graphの下に委任する。(次の項目にチェックを入れて登録)

offline_access (オフラインアクセス)
IMAP.AccessAsUser.All
POP.AccessAsUser.All
SMTP.Send
User.Read (初期状態のまま)

1-3.クライアントシークレットの作成

証明書とシークレット
→ 新しいクライアントシークレット
説明: getmial (任意)
有効期限: 180日

※作成したらすぐにクライアントシークレットをコピーしておく。(後からは見えない)

2.クライアント側の二要素認証。
getmailに付属しているgetmail-gmail-oxauth2-tokensを使う。

2-1.承認要求とトークン保存。

テキストエディタで次のJSONファイルを作成。場所やファイル名はセキュリティ(パーミッション)を考慮すれば何でも良い。ここでは /home/hoge/.getmail/oauth2.json とした。太字の部分は実際の値を入れる。他は固定。(expires_atは本来必要ないが、無いとうまくいかなかった)

{
"expires_at": 9999999999, 
"user": "hogehoge@outlook.com", 
"scope": "offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send", 
"client_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
"client_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
"tenant": "common", 
"auth_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize", 
"token_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/token", 
"redirect_uri": "http://localhost:10101"
}


getmail-gmail-oxauth2-tokens に -i オプション(初期要求・更新要求)付きで作ったJSONを食わせる。

getmail-gmail-oxauth2-tokens -i /home/hoge/.getmail/oauth2.json

注意

getmail-gmail-oxauth2-tokens で@gmail と @msn.com はうまく要求処理できたが、@outlook.com はHTTP Error 400で処理できなかった。client_secretを送るとエラーになるらしくてgetmail-gmail-oxauth2-tokensの改造が必要。

$ diff /usr/bin/getmail-gmail-xoauth-tokens ./getmail-gmail-xoauth-tokens
82c82
<         params = self.copy('user', 'client_id', 'client_secret',
---
>         params = self.copy('user', 'client_id',
91c92
<         params = self.copy('client_id', 'client_secret', 'refresh_token')
---
>         params = self.copy('client_id', 'refresh_token')

表示されたアドレスをブラウザに貼り付けて移動すると、Microsoftの二要素認証(2FA)が開始される。二要素認証がパスするとhttp://localhost/にリダイレクトされてエラー表示になる。ブラウザのアドレスにあるcode=以降をコピーし、getmail-gmail-oxauth2-tokensの実行画面で入力待ちになっているcode:に貼り付けて入力。エラー表示が出なければ成功。JSONファイルが更新されてアクセストークン、リフレッシュトークンが記録されける。

上手くいっているか確認したければ、更新されたJSONファイルをgetmail-gmail-oxauth2-tokensにオプション無しで食わせて実行。長いアクセストークンが表示されたら成功。

getmail-gmail-oxauth2-tokens /home/hoge/.getmail/oauth2.json

3.メーラー設定。
getmailのメールサーバー設定ファイルを編集する。

3-1.メーラー(getmail)の設定ファイルにOAuth2の使用とアクセストークンを追加。
次の内容は[retriever]の部分の抜粋。太字のところは環境に合わせて変更する。

[retriever]
type=SimpleIMAPSSLRetriever
use_xoauth2=True
server=outlook.office365.com
username=hogehoge@outlook.com
password_command=("getmail-gmail-xoauth-tokens", "/home/hoge/.getmail/oauth2.json")

※現バージョンのgetmailはPOP3でOAuth2をサポートしていない。

4.アクセストークンの更新
二要素認証(2FA)して取得したアクセストークンが無効になったら更新を行う。

getmail-gmail-oxauth2-tokens -i /home/hoge/.getmail/oauth2.json

この設定を流用したメール送信用のMSMTPの設定もやってみた。



後記

GmailのOAuth2認証でgetmailを設定する例は結構出てくるのに、MS365系で設定する情報が少ない。今回はMSがOAuth2を必須にすると言ってきたわけだが、Gmailもそう遠くないうちに必須になる気がする。

gmailもgetmail-gmail-xoauth2-tokensで設定してOAuth2認証対応完了。あとよく使うフリーメールのYahooメール、Yahoo IDでアクセストークンの取得までできるのに、メール側がまだOAuth2に対応していなかった。XYMYCONNECTとかいう謎のプロトコルには対応しているらしい。

220 smtp.mail.yahoo.co.jp ESMTP ready
EHLO yahoo.co.jp
250-smtpxxxxxx.mail.ssk.ynwp.yahoo.co.jp Hello yahoo.co.jp [122.xxx.xx.xx])
250-PIPELINING
250-ENHANCEDSTATUSCODES
250-SIZE xxxxxxxxxx
250 AUTH PLAIN LOGIN XYMYCONNECT

いいなと思ったら応援しよう!