Gmail のメールを OAuth 経由で読むことができることを今更ながら知った。なぜかずっと「Gmail はユーザ名・パスワード認証しかできなくて不便だな〜 パスワード書きたくないな〜 OAuth できたらな〜」と OAuth ができないものだと思いこんでいた。
で、簡単に読めるモジュールがあるかなあと思ったけど、ちょっと見た感じではないので自力で書いてみた。
Gmail + OAuth の基礎知識
概要としては
- OAuth のアクセストークンを得る
- メールアドレス (アカウント名) + アクセストークンを使って SASL XOAUTH2 フォーマットの文字列を作る
- IMAP を使い、AUTHENTICATE コマンドで上記文字列を送って認証する
という感じで、OAuth は使うけれど、WebAPI で Gmail が読めるわけではなく、最終的には普通に IMAP を喋る必要がある。
ログインまでは比較的簡単で、ドキュメントを読めばあまり問題なくできた。
日本語で検索をする
SEARCH X-GM-RAW という、Gmail のウェブ版のシンタックスでメールを検索する、という機能があるのだけれど、これを使うのにかなり難儀した。というのも、マルチバイト文字列を使う場合どうすればいいかドキュメントがなく、なんとなく適当に書いても動かない。
結論からいうと、マルチバイト文字列で検索したい場合
- IMAP の仕様上の「literal」で送る必要がある
- literal は {bytes} をコマンド引数で指定したあと、任意のバイト列を送れる仕様 (IMAP は 7bit プロトコルだが、ここだけは 8bit が通る)
- literal の文字コードは UTF-8 でいい
- CHARSET UTF-8 をつける必要がある
でもって、最終的に該当部分の IMAP のリクエスト/レスポンスは以下のようになる
> NIC4 UID SEARCH CHARSET UTF-8 X-GM-RAW {47} < + go ahead > subject:アクティビティ newer:2013/06/01 > < * SEARCH 241354 241543 241544 242493 < NIC4 OK SEARCH completed (Success)
答えさえ知ってれば難しくはないけど、かなりハマった……