Home > Perl > メールのFromやToに日本語を使いたい - ヘッダ部分のMIMEエンコードについて

メールのFromやToに日本語を使いたい - ヘッダ部分のMIMEエンコードについて

  • 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 メソッドで夜も安心

今更ながら、こんな基本的な部分をお勉強中。先駆者の人達の創造物や文書がすげー頼りになります。感謝。

Comments:2

yoshinori 2008-06-11 (水) 11:04

エンコードする場合は "名前" と名前をクオートする必要ないです。

change UTF-8 2012-02-03 (金) 10:25

UTF-8にも関わらずISO-2022・・・と出てしまった理由がよくわかりました。今更ながらとの事ですが、現在その4年後ですがまだまだ助かる人は一杯いますよ?!ありがとうございました。

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Home > Perl > メールのFromやToに日本語を使いたい - ヘッダ部分のMIMEエンコードについて

Search
Feeds

Page Top