Javaで書いた、いろんなメールを受信して業務の一部を自動化するツールを何年も運用しているのですが、見慣れないエラーが出ていたので確認すると、
java.io.IOException: Unknown encoding: 8-bit
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:116) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:83) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795) ~[?:1.8.0_275]
at javax.activation.DataHandler.getContent(DataHandler.java:542) ~[?:1.8.0_275]
at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:683) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
略
Caused by: javax.mail.MessagingException: Unknown encoding: 8-bit
at javax.mail.internet.MimeUtility.decode(MimeUtility.java:405) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:109) ~[jar:rsrc:javax.mail-1.6.2.jar!/:?]
... 13 more
とログに吐き出されています。
String body = (String) mailpart.getContent();
と、コンテンツタイプがtextのメールパートを本文として文字列にキャストしたタイミングで例外に飛んでます。
該当のメールをEMLファイルでメールの中身を確認すると
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: 8-bit
となっています。
通常は
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
だったり、
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
のようです。
Javamailでは、8bitでなく8-bitだと例外になるのか。。。
仕方ないので、キャストに失敗した後に強制的に8bitに置き換えて本文を読み取るようにしました。
part.setHeader( "Content-Transfer-Encoding", "8bit");
String body = (String) p.getContent();
メールの受信処理は、送信側次第でイレギュラーなメールが発生するので面倒です。。