- - PR -
JavaMail1.2での特殊文字を含むメールの受信
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2002-11-22 13:03
こんにちは。
現在、JavaMailを利用して、送信されてきたメールを受信し、 各データ(ヘッダの内容、タイトル、本文、添付ファイル) を取り込むプログラムを作成しているのですが、 エンコードがISO-2022-JPで送信されてくるメールの本文に 丸一(1を丸で囲ったもの)などが含まれている場合、その部分が ? に化けてしまいます。 色々調べて、JavaのISO-2022-JPコンバータはこのような文字に対応していない というのを知り、悩んでいます。 以下、本文取得部分のコードです。 ------------------------------------------------------------------ public boolean processPart(Part part, ContentType context) throws MessagingException, IOException { /** MIMEタイプがtext/plain以外は対象外 */ if (!part.isMimeType("text/plain")) { return true; } String text = ""; if (text.length() <= 0) { text = (String)part.getContent(); System.out.println("Body=" + text); } return false; ------------------------------------------------------------------- textの内容を確認すると、特殊文字が?に化けてしまっています。 どなたか、解決した方等いらっしゃいましたら、教えていただけますでしょうか。 開発 JDK 1.3.1_02 JavaMail 1.2 Windows NT4, 2000 以上、宜しくお願い致します。 |
|
投稿日時: 2002-11-22 14:15
自分でエンコーダを作るしか方法ないのでは?
|
|
投稿日時: 2002-11-22 14:44
お返事ありがとうございます。
やはり、自分で変換するしかないのですね。 実は添付ファイル名に特殊文字が含まれていた場合も同様の 問題が起きていました。 プログラムでは、添付ファイルは、ファイル名等をDBに記録すると共に、 ファイルを特定のフォルダ内に作成する処理があります。 ファイル名が化けて?が含まれてしまうと、windows環境だと ファイル名に?は使用できないため、java.io.FileNotFoundExceptionが起きていました。 添付ファイル名はヘッダ「Content-Disposition」をたよりに探って取得する作りに なっています。 このときデコード処理でjavax.mail.internet.MimeUtility#decodeWord(String) を呼んでいる部分で化けていました。 このメソッドのソースを見ると、メソッドの一番最後のString生成部分が問題でした。 javax.mail.internet.MimeUtility.java ----------------------------------------------------------------------------------------------------------- public static String decodeWord(String eword) throws ParseException, UnsupportedEncodingException { . . . . . . return new String(bytes, 0, count, charset); //charsetに ISO-2022-JPがくると化ける ------------------------------------------------------------------------------------------------------------ なので、このメソッドを呼ぶのを止めて、エンコードされた文字列を、 自分でデコードするようにしたことで文字化けが回避できたのですが、、、、 メールの本文の取得部分 ------------------------------------------------ String text = ""; if (text.length() <= 0) { text = (String)part.getContent(); System.out.println("Body=" + text); } ------------------------------------------------ で、textに文字列が入った段階で、既に化けてしまっています。 自分でデコードするにはどのようにすればよいのでしょうか。 以上、よろしくお願い致します。 |
|
投稿日時: 2002-11-25 09:28
なんとか解決しました。
最善かはわからないのですが。 javax.mail.Partからは、java.io.InputStreamが取れるので、 それを利用することにしました。 -------------------------------------------------------------------- String text = ""; if (text.length() <= 0) { /** JISでなければいままでどおり */ if (!JISConverter.isJIS(CharsetUtility.getCharset(part))) { text = (String)part.getContent(); } else { java.io.ByteArrayInputStream bais = null; try { if (part instanceof javax.mail.internet.MimeBodyPart) { bais = (java.io.ByteArrayInputStream)((javax.mail.internet.MimeBodyPart)part).getDataHandler().getInputStream(); } else { bais = (java.io.ByteArrayInputStream)((com.sun.mail.pop3.POP3Message)part).getDataHandler().getInputStream(); } String s = com.sun.mail.util.ASCIIUtility.toString(bais); byte[] b = new byte[s.length()]; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); b[i] = (byte)c; } /** JISのバイトをSJISに変換 */ text = JISConverter.getString(b); } catch (Exception e) { e.printStackTrace(); } } } ----------------------------------------------------------------- これで文字化けが回避できました。 ありがとうございました。 |
1
