- 2006-07-26 (水)
- Perl
一般的なメーラーで受け取った際に、Fromの部分が
From: iandeth@example.com
みたいな素メールアドレスじゃ無く、
From: 石橋利真
のように任意の日本語文字列が表示されるようなメールを、CGIから送信したくて色々とお勉強。
基礎知識
基本はsendmail等のMTAに対して
From: "石橋利真" <iandeth@example.com>
※文字コードはutf8
てな感じに整形した文字列をメールヘッダーに吐けばよいものの、このままだと文字化けしてしまいます。で、とほほさんの記事「CGIから送信するメールのヘッダに日本語を用いるには」によると、メールヘッダで日本語を使う場合は、
文字コード iso-2022-jp に変換
さらに Base64 エンコードをかけた上で
先頭に =?iso-2022-jp?B? を付与、末尾に ?= を付与
する必要がある模様。上記例だと最終的にはこんな文字列になっていればオッケーみたいです。
From: =?iso-2022-jp?B?IhskQkBQNjZNeD8/GyhCIg==?= <iandeth@example.com>
Perlで書いてみる
ぷぉ、面倒くさー、なんて思いつつこんなコード書いて実装してみました。
use MIME::Base64 qw(encode_base64);
use Encode qw(from_to);
my $str = q("石橋利真" <iandeth@example.com>);
my($name,$email) = ($str =~ /(.+?)\s*?<(.+?)>/);
from_to($name,'utf8','7bit-jis');
$name = encode_base64($name);
chomp $name;
$name = '=?iso-2022-jp?B?'. $name .'?=';
$str = qq($name <$email>);
print $str;
これで一応目的は達成できたものの、もっとスマートなやり方があるのでは?やっぱり僕が気づいていない落とし穴があるんじゃないか?と不安になり、先駆者の実装例を探しにCPANへ。HoriuchiさんのMIME::Lite::TT::JapaneseやTypesterさんのMIME::Lite::TT::HTML::Japaneseにて、目的のコードを発見:
use Jcode;
my $str = q("石橋利真" <iandeth@example.com>);
print Jcode->new($str,'utf8')->mime_encode;
# 実行結果 =?ISO-2022-JP?B?IhskQkBQNjZNeD8/GyhCIg==?= <iandeth@example.com>
実質1行で同じ事が実現できてしまいました。中を見ると、僕のコード以上の事をなにやらモリモリ実施してくれています。まあ素敵 /w
というわけで今日の学び:
メールヘッダに日本語を使いたい時は Jcode モジュールの mime_encode メソッドで夜も安心
今更ながら、こんな基本的な部分をお勉強中。先駆者の人達の創造物や文書がすげー頼りになります。感謝。
- Newer: モモ - 心に残ったメッセージ
- Older: ActionScript - ループ中でクロージャ作る際の注意点
Comments:2
- yoshinori 2008-06-11 (水) 11:04
-
エンコードする場合は "名前" と名前をクオートする必要ないです。
- change UTF-8 2012-02-03 (金) 10:25
-
UTF-8にも関わらずISO-2022・・・と出てしまった理由がよくわかりました。今更ながらとの事ですが、現在その4年後ですがまだまだ助かる人は一杯いますよ?!ありがとうございました。