Open5

fetchmail7 で Oauth2 認証を利用したい

mnodmnod

fetchmail のビルド

参考URL

Debian11

SNAPSHOT_7-0-0-alpha7 を利用する。
自分は Arm64 の Debian11 でビルド成功した。
(Debian11 は oldstable だが、LTSの期限は2026年6月まで続く)

SNAPSHOT_7-0-0-alpha7 は Debian12では(自分の技術では)ビルドできなかった。

ビルド

以下の感じのDockerfileでビルドする。

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では下記を利用することでビルド成功した。

Dockerfile
$ 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?
mnodmnod

Gmail編

Web上の情報がしっかりまとめられていたので、すんなりいった。

参考URL

Google クライアントID とクライアントシークレットを取得

https://console.developers.google.com/ にアクセスし、Google アカウントでログインして作業する。
およそ下記の見出しのようなことを実施した(はず)。

  • プロジェクトを作成 (適当なプロジェクト名で作成)
  • 使用するAPIを有効化 (Gmailを利用)
  • OAuth 同意画面の設定 (User Type: 外部)
  • 認証情報作成 (OauthクライアントID)
  • OAuth 同意画面 で、公開ステータスを本番環境へ変更

自分がやったことはたぶんこちらの情報が近いと思う↓
https://www.y-hakopro.com/entry/google_oauth_api

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

実際のメール取得、メール転送エージェントへの配信はお好みで。

mnodmnod

Outlook(個人用)編

以下の参考URLを見ながら、不明点は Copilot に聞きながら設定してみたら成功した。
Copilot のおかげで超はかどる。すごく便利。

参考URL

Azure Entra ID の設定

たぶん クラウドサービスであるAzure が利用できることが前提になると思う。
ここで説明している範囲は無料で利用できると思うが自己責任で。
Azureの利用開始方法はここでは記載範囲外とする。

アプリの新規登録

  1. EntraID > 管理 > アプリの登録 > 新規登録 を開く。
  2. 以下パラメータを入力したら、登録をクリック。
パラメータ
名前 お好きに (例:fetchmail)
サポートされているアカウントの種類 個人用 Microsoft アカウントのみ
(適切なのは 任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人用の Microsoft アカウント (Skype、Xbox など) かもしれない)
リダイレクト URI Web
ポートが開いていない適当なURL (例:http://127.0.0.1:8123/fetchmail)

このリダイレクトURIの値は後の手順でも利用する

クライアントIDの取得

  1. 登録したアプリの画面が開いてなければ以下で開く:
    EntraID > 管理 > アプリの登録 > すべてのアプリケーション > 登録したアプリ名

  2. 概要画面に表示されるアプリケーション (クライアント) ID の値を、クライアントIDとして控える

APIのアクセス許可の追加

  1. 登録したアプリの画面 > 管理 > API のアクセス許可 > アクセス許可の追加 を開く
  2. Microsoft API > Microsoft Graph > 委任されたアクセス許可 を開く
  3. 以下をチェックする。チェックしたらアクセス許可の追加をクリック。

OpenId アクセス許可 > offline_access
IMAP > IMAP.AccessAsUser.All
SMTP > SMTP.Send (←これ要らないかも。これ指定しないとなると、Scopeのとこも変更が必要)
User > User.Read (←これ要らないかも)

クライアントシークレットの作成

ことによると、ここも不要

  1. 登録したアプリの画面 > 管理 > 証明書とシークレット > 新しいクライアント シークレット を開く
  2. 説明に適宜入力し(例:fetchmail)追加をクリック(有効期限は適宜設定)
  3. 値の内容をクライアントシークレットとして控える

作成直後の画面以外ではクライアントシークレットを表示することはできなさそう。
ロストしたら再度作成する必要がある。

アプリケーションのマニフェストを編集

ことによると不要

  1. 登録したアプリの画面 > 管理 > マニフェスト を開く
  2. signInAudience の値を AzureADandPersonalMicrosoftAccount に変更する
  3. 変更したら保存をクリック

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 の実行はコンテナでなくてもいい。

上記の点、今後記事修正するかも

mnodmnod

WARNING: ssl is obsolescent. Please use sslmode wrapped instead. at ssl

fetchmail6 までで利用できていた ssl オプション を fetchmailrc に書くと、fetchmail7 では obsolescent と言われる。
代わりに sslmode wrapped を使うみたい。

mnodmnod

Obsolete sslproto used. Use tlsprotocolversion instead, see manual. at tls1.2

see manual とあるが、以下には記載されていなかった

fetchmail --help すると以下が出力される。

--tlsprotocolversion  force ssl version (often unneeded, see manual page!)

指定しなくても良さそう。