ちょっとしたツールでメールを送る、って処理で何回も何回も車輪を作り直してる気がするんだけど。Unicode のメールを送るってことにあまり真面目に取り組んだことがなかったのでちょっとやってみた。
そこで知ったこと。
Unicode の 8bit のデータをそのまま Content-Transer-Encoding: 8bit で送る(とりあえず UTF-8 と仮定)と、勝手に body をquoted-printable にしてしまう SMTP とそうでない SMTP がある
ということは UTF-8 のデータそのものが直接届くとは限らないわけだ。
quoted-printable body の扱い
- Thunderbird では問題なく読める(確か Outlook Express でも大丈夫1)
- テキストデータとしては扱いにくいので body を nkf で UTF-8 に戻せるかと思ったら、使っている nkf のバージョンの問題なのか、全部を正しく復元することはできなかった
Thunderbird でソースを表示すると quoted-printable なデータを拝むことができる。見慣れないエンコーディングなのでデータが壊れてるんじゃないかと思うが、そうではない。
ただ問題は nkf で復元できなかったこと。すべてのデータが必ず復元できないのかどうかは分からないけど、なんかこう、一抹の不安は残る。
UTF-7 は便利だけど微妙
UTF-7 に encode してしまえば 7bit データなので勝手に quoted-printable になることはない。
UTF-7 とは超乱暴に言うと base64 を使って Unicode のデータを ascii にしてしまう encoding. したがってそのまま読み書きすることはできないと言っていい。
つまり
- body だけ取り出してメタデータがなくなってしまうとそれが UTF-7 なのかどうなのか、少なくとも人間には当たりをつけるのは難しい
- でも base64 を使っている UTF-7 にはダメ文字が多く、body だけをちゃんと取り出さないとまず変換できない
- nkf は対応していないので iconv で取り出してね
Unicode の中で UTF-7 はそんなに扱いのいい方ではないと思う。多くの場合で UTF-8/16/32 くらいしか見ない。iconv は……。イマドキ普通に使えると言っていいのかなぁ? Windows のことなんか知らね、でよい? というか Ruby が入ってれば iconv は入ってる、と言ってよいのかしら。それならまぁいいのかな?
まとめ
Unicode 時代のメールって、まだちょっとやっかいだなーと思った。iso-2022-jp だけで済んでた時代は簡単だったなぁ。
EdMax は Unicode 版を新たに作り直してるらしい。 ↩
Exception の class 名って表現で合ってるのかな。
上の Rakefile を実行すると
rake aborted!
bar
のように怒られる。FooExcept はどこいった? rake 0.8.7 で確認。それとも Rake はこういう仕様なのかな。