コマンドラインでMIMEヘッダーをエンコード&デコードする方法

背景

MIME(マイム)とはインターネットの電子メールで様々なフォーマットを扱えるようにする規格のことです。MIMEによって電子メールにPDF、画像、動画など様々なドキュメントを添付することができます。

しかし、本来電子メールはUS-ASCIIしか使用できないため、メールのヘッダー部分にマルチバイト文字をそのまま入れることはできません。そのため、現在の電子メールでは以下のような形式でエンコードして、ヘッダーに格納しています。

=?charset?encoding?encoded-text=?=

そこで、このようなフォーマットの文字列をコマンドラインでエンコード、デコードする方法について書いていきます。

こういうときに、nkf コマンドが大活躍します。

なお、MIME の説明については端折るのであしからず。

インストール

mac の場合

文字エンコーディングの変換

MIMEの前に文字エンコーディングの変換について

  • nkf -w: UTF-8 に変換
  • nkf -e: EUC-JP に変換
  • nkf -s: Shift-JIS に変換
  • nkf -j: JIS(ISO-2022-JP) に変換

MIMEエンコード


MIME エンコードは「普通の文字列」を「=?charset?encoding?encoded-text=?=」のような形式の文字列に変換する操作のことです。

UTF8文字列 → MIME エンコード

「ほげほげ」は UTF8 文字列として、UTF8のままMIMEエンコードするとします。

解説

  • nkf -M: Base64 で MIMEエンコードする
  • nkf -MB: Base64 で MIMEエンコードする
    • encoded text だけ取り出す
  • nkf -MQ: quoted-printable で MIMEエンコードする
    • encoded text だけ取り出す

UTF8文字列 → MIME エンコード(JIS)

次に、出力のエンコーディングをJISでMIMEエンコードします。 JIS(ISO-2022-JP) は 7bit で表現される文字セットを使用しており、メールのエンコーディング形式として今でもよく使われています。

JIS への変換は、上で説明した通り、nkf -j オプションを加えるだけで簡単に実現出来ます。

MIMEデコード

MIME デコードは「=?charset?encoding?encoded-text=?=」のような形式の文字列を「普通の文字列」に変換する操作のことです。

解説

nkf -m: MIME デコードする

入力が「=?charset?encoding?encoded-text=?=」の形式の場合、-m オプションなしでも自動でMIMEデコードしてくれます。便利ですね!

入力が encoded-text だけの場合、明示的に -m オプションと content-transfer-encoding の形式を指定します。

まとめ

nkf コマンドを使って、MIMEエンコード&デコードしました。 簡単ですね!

参考図書

Open Hack Day でnode.jsのPassportを使ってYahoo!JAPANと楽天のOAuth認証モジュールを作った

概要

今週の土日に開催された Open Hack Day Japan という Hackathon イベントに参加して来ました。主催は Yahoo! JAPAN です。会社の同期と二人で参加しました。

紹介(Passport)

私たちがつくったものは node.js で OAuth 認証を超簡単に実装できるモジュールです。このモジュールは Passport という OAuth 認証モジュールのラッパーのような形で提供しています。

現在、Facebook, Twitter 等の数多くのウェブサービスのラッパーが提供されており、今回新たに Yahoo!JAPAN と楽天のラッパーを作成したという位置付けです。

成果物

使い方

yconnect を例に使い方を説明したいと思います。 リポジトリの examples/login/app.js で簡単に試せます。

1.アプリケーション登録

Yahoo!デベロッパーネットワーク からアプリケーション登録します。

  • アプリケーションID
  • シークレット

を取得します。ちゃんとコールバックURIも登録します。

2. インストール

リポジトリを git clone して、config.js というファイルを編集します。 先ほど取得したアプリケーションID、シークレット、コールバックURIを書いてください。 そして、npm install で依存モジュールをインストールします。

3. 起動

あとは express を起動するだけです。

これで http://localhost:3000 にアクセスすれば試すことができます。

今後

ただひとつ問題があります。yconnect でアクセストークンを取得するときに、client ID と client secret を Authorization ヘッダに付与して Basic 認証を行なうという仕様になっています。しかしながら、この認証方法は他の OAuth2.0 の実装と比較して特殊で、node の oauth モジュールがこの認証方式に対応していません。

そのため、passport-yj では npm の postinstall の時に oauth モジュールの oauth2.js にパッチを当てるという処置を暫定的に行なっています。

もちろん、このような処置はあまりイケていないので、oauth モジュールの作者に Pull Request を送って、エレガントにこの問題を解決したいと思います(続く…かも)。

2013/02/21 1:17
Pull Request 送りました!
Client Authentication via Basic Authorization, not body by gologo13 · Pull Request #126 · ciaranj/node-oauth


まとめ

  • Yahoo!JAPANと楽天向けの Passport を使った OAuth 認証モジュールの開発
  • GitHub で OSS として公開!
  • npm モジュールとして公開!