Gmail のメールを OAuth で読む (Perl)
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) 答えさえ知ってれば難しくはないけど、かなりハマった……
関連エントリー
- Perl でバイト数を制限しつつ、文字列を妥当なバイト列に変換したい use strict; use warnings; use utf8; use Encode; sub encode_with_limit ...
- Google Fit の REST API で体重を自動入力する (画像は過去に入力したデータを全て Google Fit へ入力しなおした様子) Fit API 全体の概念 単純にグローバルな「体重」に対...
- DOM の KeyBoardEvent の e.keyCode とか e.which とかを文字列としてとりたいやつ 昔 keyString.js という KeyBoardEvent からなんとなく押されたキーの文字列表記になおすやつを書いたことがある。 h...
- Google をパスワードマネージャに 最近は Google 以外のサイトのパスワードを一切覚えないという運用を試しています。つまり head /dev/random| shasu...