
telnetでMIMEヘッダをきちんとつけて日本語メールを送信する
telnetでメールを送信する方法としてこれまで2つのエントリで方法を紹介してきました。
前回の方法でとりあえず日本語メールが遅れているのですが、もうちょっときちんとしたヘッダを付けてメールを送信する方法を紹介したいと思います。
まず、SMTPで日本語を(も)取り扱うための規格としてMultipurpose Internet Mail Extensions(MIME)があります。
これによってUS-ASCII以外の文字や添付ファイルなどが扱えるようになっています。今回はきちんとMIMEを使って日本語メールを送ってみようと思います。
ヘッダとボディ
これからMIMEの説明をするにあたっては、まずヘッダとボディをきちんと認識する必要があります。前回送信したメールで説明すると以下のようになります。
dataコマンドでデータを送信することを指定した後でメールのヘッダとボディを連続して書き込んでおり、ヘッダとボディの区切り目は空行によって表現されているわけです。MIMEヘッダの記述はヘッダ部分に行っていきます。
MIME-Version
MIMEのバージョンを区別するためのヘッダです。現在1.0しかありませんので必ず以下のような記述になります。
Mime-Version: 1.0
Content-Type
メッセージ(ボディ部分)の形式を指定するヘッダです。様々なものがありますが、日本語メールを送りたい場合にはここはtext/plainになります。さらにtext/plainの場合にはその文字コードを表すcharsetが追加されます。具体的には以下のような記述になります。
Content-Type: text/plain; charset="iso-2022-jp";
ここではcharsetに「iso-2022-jp」が指定されていますが、実際にはここに「utf-8」等他のcharsetが指定されることもよくあります。しかし、前回の説明通り、一番一般的に使用され、文字化け等の問題が発生しずらいのは「iso-2022-jp」です。
※「charset」の意味合いは実際にはなかなか難しいです。符号化文字集合と文字符号化方式の違いで解説していますので、よろしければご覧ください。
Content-Transfer-Encoding
メッセージ(ボディ部分)の符号化方法を指定するヘッダです。text/plainの場合にはcharsetで表現される文字符号化方式を指しているのではなくその文字がどのようにメッセージ部分に記載されているかを表します。一般的に記述されるのは「7bit」、「quoted-printable」、「base64」です。今回はcharsetが「iso-2022-jp」の例で説明しており、「iso-2022-jp」はすべての文字が7bitで表現されるcharsetですので7bitと指定し、そのままiso-2022-jpのコードを記載すればいいことになります。(※「quoted-printable」、「base64」と記載し、実際にそのように符号化することも可能です。)
Content-Transfer-Encoding: 7bit
ここまでヘッダを記載すればかなり日本語メールとしての体裁が整ってきています。残るは件名です。
件名の日本語化
メールの件名に日本語を使う場合にはヘッダ部分のSubjectに日本語を記載することになります。
Subject: 日本語の件名
このように直接iso-2022-jpなりで件名を記載する…ということもやろうと思えばできてしまいますし、実際のところそれでもきちんと表示してくれるメールクライアントも多数あると思います。ですが、「ヘッダに記載可能なのはUS-ASCIIのみ、改行含めて1行あたり1000バイトのみ」という制約がありこれはRFCに違反しています。ここまで紹介したMIMEヘッダを使って非US-ASCII文字が扱えるようになったのはボディ部分のみなのです。
ではどうすればいいのかというと、日本語をUS-ASCIIにしてしまえばいいわけです。そのための形式があり、MIMEエンコード、Bエンコード、Qエンコードなどと呼ばれます。
=?charset?encoding?encoded-text?=
という形式で記載すればよく、よく使われるのは
- charset: ISO-2022-JP
- encoding: B
という組み合わせです。BはBase64でのエンコード方式を表します。「日本語の件名」という文字列をこの形式にすると以下のようになります。
=?ISO-2022-JP?B?GyRCRnxLXDhsJE43b0w+GyhC?=
iso-2022-jpの「日本語の件名」をBase64でエンコードすると「GyRCRnxLXDhsJE43b0w+GyhC」という文字列になるわけです。このあたりの変換ロジックについてはまた別エントリで説明したいと思いますが、普段簡単にエンコード、デコードするには以下のサイトがお勧めです。私もいつもお世話になっています。
まとめ
ここまで説明したことをまとめてtelnetから手動で正しい日本語メールを送ると以下のようになります。
件名含めて日本語表示ができていますし、MIMEヘッダがきちんと指定されています。この形式であればほぼすべての環境で正しく文字化けせずにメールが送れるはずです。
1件のコメント