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

Java邮件抛出Java.io.UnsupportedEncodingException:us ascii big5,exception,jakarta-mail,Exception,Jakarta Mail,我正在使用java mail,并面临以下错误:java.io.UnsupportedEncodingException:us ascii big5 at sun.nio.cs.StreamDecoder.forInputStreamReader 以下是导致此问题的Mime头 Content-Type: text/plain; charset="us-ascii, big5" (我在内容中看到非英语字符) 这有效吗?解决办法是什么 还有一个相关问题,我看到了导致此异常的字符集的不同变体(字符集值

我正在使用java mail,并面临以下错误:java.io.UnsupportedEncodingException:us ascii big5 at sun.nio.cs.StreamDecoder.forInputStreamReader

以下是导致此问题的Mime头

Content-Type: text/plain; charset="us-ascii, big5"
(我在内容中看到非英语字符)

这有效吗?解决办法是什么

还有一个相关问题,我看到了导致此异常的字符集的不同变体(字符集值周围的spl字符):例如

charset="'UTF-8'"
charset=`UTF-8` 
charset=UTF=8
charset=utf
charset=\"UTF-8\" etc.,
请注意,这种情况不仅发生在utf-8上,也发生在其他字符集上,但outlook等电子邮件客户端可以灵活地打开和解码这些电子邮件


有什么想法吗?

所有这些都是无效的字符集。尽可能向创建这些消息的程序的所有者报告此类问题。如果这些信息是垃圾邮件(通常是),就把它们扔掉;这些错误对于检测垃圾邮件是一个很好的启发

有处理这些错误的策略

你能试试message.setHeader(“内容类型”,“文本/普通;字符集=UTF-8”)吗

不,消息进来了(我没有控制权),我必须运行javamail库来解析内容。传入的消息不是我创建的

在不实际修改电子邮件的情况下转换内容类型

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;
    }
}

您必须更正此示例代码以正确转换字符集,因为所有内容都不是ASCII。

您可以尝试message.setHeader(“Content Type”,“text/plain;charset=UTF-8”);不,消息进来了(我没有控制权),我必须运行javamail库来解析内容。传入的消息不是我创建的。Big5本身的可能重复不是问题,可以在代码中处理。更大的问题是组合了两个字符集。例如:charset=“us ascii,big5”不确定如何在代码中处理,因为这应该基于内容,我们需要进行复杂的解析。@SathishKumar在回答中忽略big5。dupe解释说,您可以创建一个方法,在JavaMail处理内容类型头之前将其转换为任何字符串。
Transformed = text/plain; charset=us-ascii
Original = [text/plain; charset="us-ascii, big5"]