- PR -

JavaMail1.2での特殊文字を含むメールの受信

1
投稿者投稿内容
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 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
投稿数: 2
投稿日時: 2002-11-22 14:15
自分でエンコーダを作るしか方法ないのでは?
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 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に文字列が入った段階で、既に化けてしまっています。

自分でデコードするにはどのようにすればよいのでしょうか。

以上、よろしくお願い致します。
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)