fetchmail7 で Oauth2 認証を利用したい
fetchmail のビルド
参考URL
Debian11
SNAPSHOT_7-0-0-alpha7 を利用する。
自分は Arm64 の Debian11 でビルド成功した。
(Debian11 は oldstable だが、LTSの期限は2026年6月まで続く)
SNAPSHOT_7-0-0-alpha7 は Debian12では(自分の技術では)ビルドできなかった。
ビルド
以下の感じのDockerfileでビルドする。
FROM debian:bullseye-slim
RUN apt update \
&& apt install -y \
curl \
autopoint autoconf pkg-config build-essential libssl-dev bison flex \
bzip2 \
python \
&& apt clean \
&& rm -rf /var/lib/apt/lists/* \
&& useradd -m docker
RUN cd /tmp \
&& curl -s https://gitlab.com/fetchmail/fetchmail/-/archive/SNAPSHOT_7-0-0-alpha7/fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz -o /tmp/fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz \
&& tar xzf /tmp/fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz \
&& cd fetchmail-SNAPSHOT_7-0-0-alpha7 \
&& ./autogen.sh \
&& ./configure \
&& make \
&& make install \
&& rm -rf /tmp/fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz /tmp/fetchmail-SNAPSHOT_7-0-0-alpha7
USER "docker"
(イメージが435MBと大きいので、Debパッケージにしたり、あるいはバイナリだけ取得して利用したほうが好ましいのかもしれないが)ここでは、このイメージ(fetchmail:test)からコンテナを立てて利用していく。
$ fetchmail --version
This is fetchmail release 7.0.0-alpha7+TLS+NLS.
Copyright (C) 2002, 2003 Eric S. Raymond
Copyright (C) 2004 Matthias Andree, Eric S. Raymond,
Robert M. Funk, Graham Wilson
Copyright (C) 2005 - 2012 Sunil Shetye
Copyright (C) 2005 - 2021 Matthias Andree
Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. For details,
please see the file COPYING in the source or documentation directory.
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
Linux b3d5607d2b46 6.6.31+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux
Taking options from command line
No mailservers set up -- perhaps /home/docker/.fetchmailrc is missing?
fetchmail-oauth2.py
Oauth2 認証でリフレッシュトークンの取得・更新を行うツール。
参考URLでは別途ダウンロードするように記載されているが、fetchmail-SNAPSHOT_7-0-0-alpha7.tar.gz に以下のパスで同一のファイルが同梱されている。<作業ディレクトリ>/oauth2 にコピーしておく。
fetchmail-SNAPSHOT_7-0-0-alpha7/contrib/fetchmail-oauth2.py
Debian12
Debian12では下記を利用することでビルド成功した。
-
https://gitlab.com/fetchmail/fetchmail/-/archive/next/fetchmail-next.tar.gz
(自分が試したときは adf569ba6b94e00b74a38cbe5a600acdd325af87 だった)
$ cat ~/work/tools/fetchmail/Dockerfile.bookworm
FROM debian:bookworm-slim
RUN apt update \
&& apt install -y \
curl \
autopoint autoconf pkg-config build-essential libssl-dev bison flex \
bzip2 \
python3 \
&& apt clean \
&& rm -rf /var/lib/apt/lists/* \
&& useradd -m docker
RUN cd /tmp \
&& curl -k https://gitlab.com/fetchmail/fetchmail/-/archive/next/fetchmail-next.tar.gz -o /tmp/fetchmail-next.tar.gz \
&& tar xzf /tmp/fetchmail-next.tar.gz \
&& cd fetchmail-next \
&& ./autogen.sh \
&& ./configure \
&& make \
&& make install \
&& rm -rf /tmp/fetchmail-next.tar.gz /tmp/fetchmail-next
USER "docker"
$ fetchmail --version
This is fetchmail release 7.0.0-alpha11+TLS+NLS.
Compiled with SSL library 0x300000e0 "OpenSSL 3.0.14 4 Jun 2024"
Run-time uses SSL library 0x300000e0 "OpenSSL 3.0.14 4 Jun 2024"
OpenSSL: OPENSSLDIR: "/usr/lib/ssl"
Engines: ENGINESDIR: "/usr/lib/aarch64-linux-gnu/engines-3"
Copyright (C) 2002, 2003 Eric S. Raymond
Copyright (C) 2004 Matthias Andree, Eric S. Raymond,
Robert M. Funk, Graham Wilson
Copyright (C) 2005 - 2012 Sunil Shetye
Copyright (C) 2005 - 2024 Matthias Andree
Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you
are welcome to redistribute it under certain conditions. For details,
please see the file COPYING in the source or documentation directory.
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit. (http://www.openssl.org/)
Linux 5f3c1772e095 6.6.31+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.6.31-1+rpt1 (2024-05-29) aarch64 GNU/Linux
Taking options from command line
No mailservers set up -- perhaps /home/docker/.fetchmailrc is missing?
Gmail編
Web上の情報がしっかりまとめられていたので、すんなりいった。
参考URL
Google クライアントID とクライアントシークレットを取得
https://console.developers.google.com/ にアクセスし、Google アカウントでログインして作業する。
およそ下記の見出しのようなことを実施した(はず)。
- プロジェクトを作成 (適当なプロジェクト名で作成)
- 使用するAPIを有効化 (Gmailを利用)
- OAuth 同意画面の設定 (User Type: 外部)
- 認証情報作成 (OauthクライアントID)
- OAuth 同意画面 で、公開ステータスを本番環境へ変更
自分がやったことはたぶんこちらの情報が近いと思う↓
fetchmail-oauth2 の設定
fetchmail-oauth2.py
REDIRECT_URI
の値を編集する。127.0.0.1:8123
は Listen していない適当なポート。
$ diff -u fetchmail-oauth2.py.orig fetchmail-oauth2.py
@@ -263,7 +263,7 @@
# Hardcoded dummy redirect URI for non-web apps.
-REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
+REDIRECT_URI = 'http://127.0.0.1:8123/fetchmail'
def UrlEscape(text):
fetchmail-oauth2.conf
以下の内容で設定ファイルを作成して、<作業ディレクトリ>/fetchmail-oauth2.conf として保存する。
client_id=<取得したクライアントID>
client_secret=<取得したクライアントシークレット>
refresh_token_file=<作業ディレクトリ>/google_refresh_file
access_token_file=<作業ディレクトリ>/google_access_token_file
max_age_sec=1900
リフレッシュトークンの取得
以下のコマンドを実行する。
sudo docker run --rm -it -v <作業ディレクトリ>:/home/docker/fetchmail fetchmail:test <作業ディレクトリ>/oauth2/fetchmail-oauth2.py -c <作業ディレクトリ>/fetchmail-oauth2.conf --obtain_refresh_token_file
以下の出力があるので、表示されたURLをブラウザで開き、Googleの認証を行う。
「正常に接続できませんでした」と表示されるので、URLの「?code=XXXXXXXXXXXXXXXXXXXXX」の値の部分をコピーして、Enter verification code
のところに入力して、Enter を押す。
To authorize token, visit this url and follow the directions:
https://accounts.google.com/o/oauth2/auth?client_id=xxxx&redirect_uri=xxxx&response_type=code&scopexxxx
Enter verification code:
成功すると以下の内容が表示される。
Refresh token saved to '<作業ディレクトリ>/google_refresh_file'
Initial access token saved to '<作業ディレクトリ>/google_access_token_file'
Access Token Expiration Seconds: 3599
fetchmailrc の設定
認証設定は以下の内容で記載する。その他の内容はお好みで。
ここでは、ファイルは<作業ディレクトリ>/fetchmailrc で保存する。
chmod 600 fetchmailrc
しておく。
poll imap.gmail.com protocol imap
auth oauthbearer username "<yourname>@gmail.com"
passwordfile "/home/docker/fetchmail/.google_access_token_file"
passwordfile
は、fetchmail-oauth2.cfg の access_token_file
の値を記載する。
リフレッシュトークンの更新と、メール取得テスト
リフレッシュトークンはしばらく経つと有効期限が切れるらしいので、定期的に下記を実行して期限更新しておく。
sudo docker run --rm -it -v <作業ディレクトリ>:/home/docker/fetchmail fetchmail:test <作業ディレクトリ>/oauth2/fetchmail-oauth2.py -c <作業ディレクトリ>/fetchmail-oauth2.conf --auto_refresh
下記で GMail の認証が通り、IMAP通信がうまくいくことを確認する。
sudo docker run --rm -it -v <作業ディレクトリ>:/home/docker/fetchmail fetchmail:test fetchmail -c -v -f <作業ディレクトリ>/fetchmailrc
実際のメール取得、メール転送エージェントへの配信はお好みで。
Outlook(個人用)編
以下の参考URLを見ながら、不明点は Copilot に聞きながら設定してみたら成功した。
Copilot のおかげで超はかどる。すごく便利。
参考URL
- https://docs.emailengine.app/setting-up-oauth2-with-outlook/
- https://movementarian.org/blog/posts/fetchmail-and-office-365/
- https://www.emailarchitect.net/easendmail/sdk/html/object_oauth_live.htm
Azure Entra ID の設定
たぶん クラウドサービスであるAzure が利用できることが前提になると思う。
ここで説明している範囲は無料で利用できると思うが自己責任で。
Azureの利用開始方法はここでは記載範囲外とする。
アプリの新規登録
- EntraID > 管理 > アプリの登録 > 新規登録 を開く。
- 以下パラメータを入力したら、登録をクリック。
パラメータ | 値 |
---|---|
名前 | お好きに (例:fetchmail) |
サポートされているアカウントの種類 | 個人用 Microsoft アカウントのみ (適切なのは 任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人用の Microsoft アカウント (Skype、Xbox など) かもしれない) |
リダイレクト URI | Web ポートが開いていない適当なURL (例:http://127.0.0.1:8123/fetchmail) |
このリダイレクトURIの値は後の手順でも利用する
クライアントIDの取得
-
登録したアプリの画面が開いてなければ以下で開く:
EntraID > 管理 > アプリの登録 > すべてのアプリケーション > 登録したアプリ名 -
概要画面に表示されるアプリケーション (クライアント) ID の値を、クライアントIDとして控える
APIのアクセス許可の追加
- 登録したアプリの画面 > 管理 > API のアクセス許可 > アクセス許可の追加 を開く
- Microsoft API > Microsoft Graph > 委任されたアクセス許可 を開く
- 以下をチェックする。チェックしたらアクセス許可の追加をクリック。
OpenId アクセス許可 > offline_access
IMAP > IMAP.AccessAsUser.All
SMTP > SMTP.Send (←これ要らないかも。これ指定しないとなると、Scopeのとこも変更が必要)
User > User.Read (←これ要らないかも)
クライアントシークレットの作成
ことによると、ここも不要
- 登録したアプリの画面 > 管理 > 証明書とシークレット > 新しいクライアント シークレット を開く
- 説明に適宜入力し(例:fetchmail)追加をクリック(有効期限は適宜設定)
- 値の内容をクライアントシークレットとして控える
作成直後の画面以外ではクライアントシークレットを表示することはできなさそう。
ロストしたら再度作成する必要がある。
アプリケーションのマニフェストを編集
ことによると不要
- 登録したアプリの画面 > 管理 > マニフェスト を開く
-
signInAudience
の値をAzureADandPersonalMicrosoftAccount
に変更する - 変更したら保存をクリック
fetchmail-oauth2 の設定
fetchmail-oauth2.py
前述のGmail編で変更したファイルを利用する。
fetchmail-oauth2.conf
以下の内容で設定ファイルを作成して、<作業ディレクトリ>/fetchmail-oauth2-outlook.conf として保存する。
user=<yourname>@outlook.com
client_id=<クライアントID>
client_secret=(空欄)
refresh_token_file=<作業ディレクトリ>/outlook-refresh
access_token_file=<作業ディレクトリ>/outlook-token
imap_server=outlook.office365.com
smtp_server=outlook.office365.com
scope=https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send offline_access
auth_url=https://login.microsoftonline.com/common/oauth2/v2.0/authorize
token_url=https://login.microsoftonline.com/common/oauth2/v2.0/token
redirect_url=<fetchmail-oauth2.py の REDIRECT_URI の値>
client_secret に クライアントシークレットは記載しない。(記載するとエラーとなった)
scope について、fetchmail では SMTP.Send は不要だと思う。offline_access がないとリフレッシュトークンが発行されない。
リフレッシュトークンの取得
以下のコマンドを実行する。
sudo docker run --rm -it -v <作業ディレクトリ>:/home/docker/fetchmail fetchmail:test <作業ディレクトリ>/oauth2/fetchmail-oauth2.py -c <作業ディレクトリ>/fetchmail-oauth2-outlook.conf --obtain_refresh_token_file
以下の出力があるので、表示されたURLをブラウザで開き(※)、MSの認証を行う。
(※)ブラウザでURLを開く前に、F12キーを押して開発者ツールを起動して、「ネットワーク」タブを開いておく。
画面上で「正常に接続できませんでした」が表示されたとき、開発者ツールでは<REDIRECT_URI>?code=XXXXへGET通信をしたことを示す行が表示される。
この行をクリックして右側のタブに表示される code の値をコピーして、Enter verification code
のところに入力し、Enter を押す。
To authorize token, visit this url and follow the directions:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=xxxx&redirect_uri=xxxx&response_type=code&scope=xxxx
Enter verification code:
成功すると以下の内容が表示される。
Refresh token saved to '<作業ディレクトリ>/outlook-refresh'
Initial access token saved to '<作業ディレクトリ>/outlook-token'
Access Token Expiration Seconds: 3600
fetchmailrc の設定
認証設定は以下の内容で記載する。その他の内容はお好みで。
ここでは、ファイルは<作業ディレクトリ>/fetchmailrc で保存する。
chmod 600 fetchmailrc しておく。
poll outlook.office365.com with proto IMAP
auth oauthbearer username "<yourname>@outlook.com"
passwordfile "<作業ディレクトリ>/outlook-token"
passwordfile
は、fetchmail-oauth2-outlook.conf の access_token_file
の値を記載する。
リフレッシュトークンの更新と、メール取得
リフレッシュトークンはしばらく経つと有効期限が切れるらしいので、定期的に下記を実行して期限更新しておく。
sudo docker run --rm -it -v <作業ディレクトリ>:/home/docker/fetchmail fetchmail:test /home/docker/fetchmail/oauth2/fetchmail-oauth2.py -c /home/docker/fetchmail/outlookrc --auto_refresh
下記で MS の認証が通り、IMAP通信がうまくいくことを確認する。
sudo docker run --rm -it -v <作業ディレクトリ>:/home/docker/fetchmail fetchmail:test fetchmail -c -v -f /home/docker/fetchmail/fetchmailrc
実際のメール取得、メール転送エージェントへの配信はお好みで。
その他
- 記事のパス表記は疑ったほうがいい。(スクラップ記事なのでおおめにみて♡)
- ファイルの権限に気を付ければ、fetchmail-oauth2.py の実行はコンテナでなくてもいい。
上記の点、今後記事修正するかも
WARNING: ssl is obsolescent. Please use sslmode wrapped instead. at ssl
fetchmail6 までで利用できていた ssl オプション を fetchmailrc に書くと、fetchmail7 では obsolescent と言われる。
代わりに sslmode wrapped
を使うみたい。
Obsolete sslproto used. Use tlsprotocolversion instead, see manual. at tls1.2
see manual
とあるが、以下には記載されていなかった
- https://gitlab.com/fetchmail/fetchmail/-/blob/next/fetchmail.man (adf569ba6b94e00b74a38cbe5a600acdd325af87)
-
https://www.fetchmail.info/fetchmail-man.html
(2024-09-24版)
fetchmail --help すると以下が出力される。
--tlsprotocolversion force ssl version (often unneeded, see manual page!)
指定しなくても良さそう。