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の場合。変換できない部分をどう扱うかはメールクライアントに寄る