Java邮件抛出java.io.UnsupportedEncodingException:us-ascii big5

时间:2017-12-21 07:52:37

标签: exception javamail

我正在使用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等电子邮件客户端会巧妙地打开和解码这些电子邮件。

有什么想法吗?

2 个答案:

答案 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有处理这些错误的策略。