我正在使用java邮件,并遇到以下错误的问题:java.io.UnsupportedEncodingException:us. ascii big5 at sun.nio.cs.StreamDecoder.forInputStreamReader
以下是导致此问题的Mime标头。
Content-Type: text/plain; charset="us-ascii, big5"
(我在内容上看到非英文字符)
这有效吗?什么可以解决?
还有一个相关问题,我看到charset的不同变体(字符集值周围的spl字符)会导致此异常:例如。
charset="'UTF-8'"
charset=`UTF-8`
charset=UTF=8
charset=utf
charset=\"UTF-8\" etc.,
请注意,这不仅仅发生在utf-8上,也发生在其他字符集中,但是像outlook等电子邮件客户端会巧妙地打开和解码这些电子邮件。
有什么想法吗?
答案 0 :(得分:2)
你可以试试message.setHeader(“Content-Type”,“text / plain; charset = UTF-8”)?
不,消息进来(我无法控制),我必须运行javamail lib来解析才能获取内容。传入的消息不是由我创建的
Use the mail.mime.contenttypehandler
system property转换内容类型转换而不实际修改电子邮件。
package cool.part.team;
import java.util.Arrays;
import javax.mail.Session;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimePart;
public class EverythingIsAscii {
/**
* -Dmail.mime.contenttypehandler=cool.part.team.EverythingIsAscii
*/
public static void main(String[] args) throws Exception {
MimeMessage msg = new MimeMessage((Session) null);
msg.setText("test", "us-ascii, big5");
msg.saveChanges();
System.out.println("Transformed = "+ msg.getContentType());
System.out.println("Original = " + Arrays.toString(msg.getHeader("Content-Type")));
}
public static String cleanContentType(MimePart p, String mimeType) {
if (mimeType != null) {
String newContentType = mimeType;
try {
ContentType ct = new ContentType(mimeType);
String cs = ct.getParameter("charset");
if (cs == null || cs.contains("'")
|| cs.contains(",")) { //<--Insert logic here
ct.setParameter("charset", "us-ascii");
newContentType = ct.toString();
}
} catch (Exception ignore) {
//Insert logic to manually repair.
//newContentType = ....
}
return newContentType;
}
return mimeType;
}
}
将输出:
Transformed = text/plain; charset=us-ascii
Original = [text/plain; charset="us-ascii, big5"]
您必须更正此示例代码才能对charset进行正确转换,因为所有内容都不是ASCII。
答案 1 :(得分:1)
所有这些都是无效的字符集。只要有可能,就会向创建这些消息的程序的所有者报告此类问题。如果邮件是垃圾邮件(通常是垃圾邮件),请将邮件丢弃;这些错误是检测垃圾邮件的一种非常好的启发式方法。
JavaMail FAQ有处理这些错误的策略。