2022-10-04以降は以下の方法は利用できない。How to use Google Workspace OAuth2 with mbsync (from isync) and msmtp on NetBSDに英語ではあるが 対応策を記載した。
はじめに
どうやら延期になっているようだが、Google G SuiteのGmailでLess Secure App Access (LSA)を継続使用できないと言うお知らせが来ていた。 私は、NetBSD上でpkgsrc/mail/isyncのmbsyncコマンドを使って電子メールを受信しており、pkgsrc/mail/msmtpを使って電子メールを送信している。 これらができなくなると困ったことになってしまう。
Oauth2アクセストークンの取得方法について把握し、 mbsyncコマンドに必要なパッチを用意し、mbsyncとmsmtpでアクセストークンの更新を自動的に実施するように設定したので書いておく。
クライアントIDとクライアントシークレットの生成
Google CLoud Platformコンソールについては、完全に理解しているとは言えないので、概要だけ書いておく。 https://console.cloud.google.com/より、 API&Service内のCredentialsを選択し、 OAuth 2.0 Client IDsに新規登録して、client IDとclient secretを生成しておく必要がある。
アクセストークンとリフレッシュトークンの取得
アクセストークンとリフレッシュトークンを取得するためには、以下のような手順に従う必要がある。
ここでは、github.com/google/gmail-oauth2-tools
のoauth2.py
を利用する。ただし、これはPython 2.7用のスクリプトのようなので、Python 3.8では実行できなかった。
oauth2.py
にclient IDとclient secretを与え実行する。auth2.py
に入力する。
実際に利用したコマンドは以下のようである。
$ python2.7 /opt/share/oauth2.py \ --user=MY_GSUITE_EMAIL_ADDRESS \ --client_id=MY_CLIENT_ID.apps.googleusercontent.com \ --client_secret=MY_CLIENT_SECRET \ --generate_oauth2_token
リフレッシュトークンを使ってアクセストークンを再生成するスクリプトを作成する
アクセストークンは3600秒で有効期限を迎えてしまうので、リフレッシュトークンを使って再生成をする必要がある。 どうやら、毎回リフレッシュトークンを使って再生成要求をしても問題なさそうなので、 実行すると有効なアクセストークンを標準出力に出力するコマンドを用意することにした。 mbsyncにはPassCmd、msmtpにはpasswordevalという設定があり、動的にアクセストークンを与えることができるので、 それに対応するために使う。
oauth2.py
は、アクセストークンのみを表示させるモードはないようなので、以下のような内容のコマンドを
/opt/bin/get_teteraorg_token.sh
として用意した。
#! /bin/sh /usr/pkg/bin/python2.7 /opt/share/oauth2.py \ --user=MY_GSUITE_EMAIL_ADDRESS \ --client_id=MY_CLIENT_ID.apps.googleusercontent.com \ --client_secret=MY_CLIENT_SECRET \ --generate_oauth2_token \ --refresh_token=MY_REFRESH_TOKEN | \ awk -F" " '{if(NR==1)print $3}'
XOAUTH2 SASLプラグインの導入
https://github.com/moriyoshi/cyrus-sasl-xoauth2/の プラグインを利用することした。 Issue 3より後のリビジョンであれば利用できることが分かった。
pkgsrc/security/cyrus-sasl-xoauth2として用意しているので、以下のように導入しておく。
# cd /usr/pkgsrc/security/cyrus-sasl-xoauth2 # make install
isyncのmbsyncコマンドの設定
まず、pkgsrc/mail/isyncを導入しておく。 必要なパッチが当てられているisync-1.3.1nb2以降である必要がある。
必要なパッチというのは、PassCmdを実行した結果を保持するバッファーのサイズが80バイトなのを拡張するというものである。 G Suiteのアクセストークンは170バイト強になるようなので、80バイトでは不足し途中で切られてしまうため、正常にログインできない。
~/.mbsyncrc
での設定内容は以下のようになる。
IMAPAccount gmail Host imap.gmail.com User MY_GSUITE_EMAIL_ADDRESS #AuthMechs LOGIN AuthMechs XOAUTH2 PassCmd "/opt/bin/get_teteraorg_token.sh" SSLType IMAPS CertificateFile /etc/openssl/certs/ca-certificates.crt IMAPStore gmail-remote Account gmail MaildirStore gmail-local Path ~/.maildir/teteraorg-gmail/ Inbox ~/.maildir/teteraorg-gmail/inbox Channel gmail-inbox Master :gmail-remote: Slave :gmail-local: Channel gmail-trash Master :gmail-remote:"[Gmail]/Trash" Slave :gmail-local:trash Channel gmail-sent Master :gmail-remote:"[Gmail]/Sent Mail" Slave :gmail-local:sent Channel gmail-archive Master :gmail-remote: Slave :gmail-local: Patterns "Arch*" Group teteraorg Channel gmail-inbox Channel gmail-sent Channel gmail-trash Channel gmail-archive
msmtpコマンドの設定
pkgsrc/mail/msmtpからmsmtp-1.8.11を導入した。 msmtpは、XOAuth2には現状では対応していないようであり、 oauthbearerを使うように設定する必要があった。 msmstpはSASLプラグインを利用している訳ではないようだ。
# cd /usr/pkgsrc/mail/msmtp # make install
~/.msmtprc
での設定内容は以下のようである。
defaults account teteraorg tls on tls_certcheck off tls_starttls off host smtp.gmail.com port 465 protocol smtp auth oauthbearer from MY_GSUITE_EMAIL_ADDRESS user MY_GSUITE_EMAIL_ADDRESS passwordeval "/opt/bin/get_teteraorg_token.sh" account default: teteraorg
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。