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.json3.メーラー設定。
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