たぷつきません

おなかがでてきた。もうたぷついてるやん。

JavaMail末尾日本語に注意

 JavaMailのJISエンコードには結構致命的な問題があります。本文末尾に漢字があると、JISの漢字OUTコードが入らないという問題です。末尾が半角英数字記号なら漢字OUTが付きますが、改行文字などの制御コードはアウトです。例えば改行文字は、w) という文字に変換されてしまいます*1
 プロバイダが自社のブランドのフッタ情報を入れるフリーメールを使っていたあるお客さんに送られたメールでは、英文のフッタなのに、おかしな漢字に化けるという報告がありました。原因は正にこれでした。
 mimeMessage.setTextでもmimeMessage.setContentを使ってもアウトでした。最終的には自前でエンコードして解決しました。

byte[] bytes = null;
try {
	bytes = text.getBytes(ENCODING);
} catch (UnsupportedEncodingException e) {
	log.error("文字列のエンコーディングが失敗", e);
}
text = new String(bytes);
mimeMessage.setText(text, ENCODING);

 これ以外にもUNICODEマッピング問題に含まれる幾つかの文字の置換などもありますし、いろいろ大変なんですよね。あと、機種依存文字は、ISO-2022-JPに含まれないけど、NECパターンとかIBMパターンとかMacパターンとか選択形式でいいからエンコードできるとよいんですけどねー。今はそれができないから、置換後の文字列に、"!)" や "?" が含まれていたらUIで、「機種依存文字が含まれています。修正してください。」というバリデーションを生かしたりしています。なかなか大変です。

*1:w)はJettyの場合。変換できない部分をどう扱うかはメールクライアントに寄る