Webエンジニア susumuis の技術ブログ

このブログの内容は個人の見解であり、所属する組織の公式見解ではありません

JavaMailで文字化けを防ぐ方法まとめ

ハマったので自分のためにまとめます。
JavaMailで普通にメールを送信すると「〜」や丸数字が文字化けします。
その対策についての調べた記事をまとめます。

x-windows-iso2022jpを使う

http://www.igapyon.jp/igapyon/diary/2007/ig070427.html

Shift_JISに対するWindows31Jみたいなコードです。これを入れると文字化けが解消します。しかし、ユーザエージェント側がx-windows-iso2022jpを知らないという問題があり、下記Javaの起動オプションで回避するという手法が紹介されています。

-Dsun.nio.cs.map=x-windows-iso2022jp/ISO-2022-JP

文字コードを自分でエスケープしてしまおうという方法

http://www.sk-jp.com/cgi-bin/treebbs.cgi?kako=1&log=1430

JavaMailのエンコード機能を使用せず自前でエンコードする方法です。この方法を使えば起動オプションを使用しなくても、文字化けなく「〜」や丸数字を送ることができます。

ここで紹介されているコードでは半角カナを全角カナに変換しています。

半角カナはどうしても半角カナのままで送りたく、起動オプションを追加することもできない場合どうするか?

http://www.siisise.net/charset.html
例えば「ESC(I」というエスケープコードを送信すると、半角カナに対応することができます。
自分でエンコードする時、半角カナ文字が来たらこのエスケープ文字を送信するようにすれば文字化けなく半角カナメールを送ることができます。

ここを見ると、JIS X 2013なども含まれています。
実際のメーラが受信できるかはわかりませんが、拡張漢字も対応できるようです。

RFCには存在しないコードなので、自己責任で対応する必要があります。

問題点(2012/11/11 追記)

上記のように非標準な文字コードを使った実害として、Macを中心に全文が文字化けしてしまうという現象があるようです。下記は標準のMail.appの特定のバージョンで発生していましたが、今はパッチがリリースされているのかな?また、Sparrowを使っている人からも、同様の報告を受けました。
https://discussionsjapan.apple.com/thread/10116033?start=0&tstart=0

このように非標準の文字コードを使った罰は「たった一文字化け内容に気をつけたために、全部の文字が化けてしまう」という報いとして現れるようです。

システム開発者としては、上記の問題点を顧客に説明した上で、下記のいずれかを採用するのが良いのでしょう。

  1. 標準ISO-2022-jpを使用、半角カナは全角カナに変換、いわゆる機種依存文字は使用しない
    • 使えない文字が多いけど一番確実にメールを送れる
  2. 上記の野良ISO-2022-jpを使用
    • 携帯に送るなら最適か?絵文字も送れるかも
  3. UTF-8メールを使用する
    • ガラケーや古いPCメーラを諦めなければならないけど、送れる文字では一番多い

以上