NetBSD上で、isyncのmbsyncコマンドとmsmtpコマンドでOAuth2を使いGoogle G SuiteのGmailの電子メールを送受信する

はじめに

どうやら延期になっているようだが、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-toolsoauth2.pyを利用する。ただし、これはPython 2.7用のスクリプトのようなので、Python 3.8では実行できなかった。

  • oauth2.pyにclient IDとclient secretを与え実行する。
  • 表示されたURLにFirefoxでアクセスし、確認用のコードを入手する。
  • 確認用コードをoauth2.pyに入力する。
  • refresh tokenとaccess tokenを入手する。
  • ここで、入手できたaccess tokenの有効期限は3600秒のようである。 refresh tokenは、access tokenの再生成に必要なトークンで、有効期間はないようだ。

    実際に利用したコマンドは以下のようである。

    $ 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
    

    No comments:

    Post a Comment

    DBeaverとPOstgreSQLのテーブル表示でのデータ編集

    Oracle SQL Developer を 利用することがあるのだが、Oracle Databaseのテーブルと違い、 PostgreSQLのテーブルについては、データをスプレッドシート的に編集することができなかった。 Apache License 2.0でリリースされて...