我可以强制在 MimeMessage 中发生 UnsupportedEncodingException 吗?
Can I force an UnsupportedEncodingException to happen in MimeMessage?
我有一个 java 应用程序,它使用带有附件的电子邮件。偶尔我会看到这样的错误:
java.io.UnsupportedEncodingException: X-iso88591
at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:71) ~[na:1.7.0_65]
at java.io.InputStreamReader.<init>(InputStreamReader.java:100) ~[na:1.7.0_65]
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:107) ~[mail-1.4.5.jar:na]
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795) ~[na:1.7.0_65]
at javax.activation.DataHandler.getContent(DataHandler.java:542) ~[na:1.7.0_65]
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1420) ~[mail-1.4.5.jar:na]
我正在尝试编写单元测试来重现此行为。但是我遇到了一个问题,我无法对某些内容进行编码 "badly" 以便我稍后可以尝试(但失败)对其进行解码。
我什至写了一个 "fake" 字符集(称为 BorkBorkBork
)- 但它似乎只用于编码而不用于解码
MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
Multipart container = new MimeMultipart();
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDescription("日本語 Nihongo", "BorkBorkBork");
bodyPart.setText("日本語 Nihongo", "BorkBorkBork");
container.addBodyPart(bodyPart);
message.setContent(container);
message.getContent(); // I want this to fail
这是我写的Charset
public class BorkBorkBorkCharset extends Charset {
public BorkBorkBorkCharset() {
super("BorkBorkBork", new String[]{});
}
@Override
public boolean contains(Charset cs) {
throw new UnsupportedOperationException();
}
public CharsetDecoder newDecoder() {
throw new UnsupportedOperationException();
}
public CharsetEncoder newEncoder() {
return new CharsetEncoder(Charset.forName("UTF8"), 10, 10) {
@Override
protected CoderResult encodeLoop(CharBuffer charBuffer, ByteBuffer byteBuffer) {
return CoderResult.UNDERFLOW;
}
};
}
}
我也写了一个CharsetProvider
public class BorkBorkBorkCharsetProvider extends CharsetProvider {
@Override
public Iterator<Charset> charsets() {
throw new UnsupportedOperationException();
}
@Override
public Charset charsetForName(String charsetName) {
if (StringUtils.equals("BorkBorkBork", charsetName)) {
return new BorkBorkBorkCharset();
}
return null;
}
}
我不确定我是否为此走上了正确的道路。可能吗?我可以采用其他方法吗?
我通过模拟解决了这个问题。我没有完全重现该场景,但我能够模拟我的代码处理异常的糟糕方式
when(mimeMessage.getContent()).thenThrow(new UnsupportedEncodingException("X-iso88591"));
您不需要进行任何特殊编码或创建自己的字符集。只需创建一个 MimeMessage,使用 setText 方法设置消息正文,并为 setText 方法指定一个伪造的字符集名称。然后调用 MimeMessage.saveChanges 并使用 getContent 方法读回消息正文。您应该得到一个 UnsupportedEncodingException。
我有一个 java 应用程序,它使用带有附件的电子邮件。偶尔我会看到这样的错误:
java.io.UnsupportedEncodingException: X-iso88591
at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:71) ~[na:1.7.0_65]
at java.io.InputStreamReader.<init>(InputStreamReader.java:100) ~[na:1.7.0_65]
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:107) ~[mail-1.4.5.jar:na]
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795) ~[na:1.7.0_65]
at javax.activation.DataHandler.getContent(DataHandler.java:542) ~[na:1.7.0_65]
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1420) ~[mail-1.4.5.jar:na]
我正在尝试编写单元测试来重现此行为。但是我遇到了一个问题,我无法对某些内容进行编码 "badly" 以便我稍后可以尝试(但失败)对其进行解码。
我什至写了一个 "fake" 字符集(称为 BorkBorkBork
)- 但它似乎只用于编码而不用于解码
MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
Multipart container = new MimeMultipart();
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDescription("日本語 Nihongo", "BorkBorkBork");
bodyPart.setText("日本語 Nihongo", "BorkBorkBork");
container.addBodyPart(bodyPart);
message.setContent(container);
message.getContent(); // I want this to fail
这是我写的Charset
public class BorkBorkBorkCharset extends Charset {
public BorkBorkBorkCharset() {
super("BorkBorkBork", new String[]{});
}
@Override
public boolean contains(Charset cs) {
throw new UnsupportedOperationException();
}
public CharsetDecoder newDecoder() {
throw new UnsupportedOperationException();
}
public CharsetEncoder newEncoder() {
return new CharsetEncoder(Charset.forName("UTF8"), 10, 10) {
@Override
protected CoderResult encodeLoop(CharBuffer charBuffer, ByteBuffer byteBuffer) {
return CoderResult.UNDERFLOW;
}
};
}
}
我也写了一个CharsetProvider
public class BorkBorkBorkCharsetProvider extends CharsetProvider {
@Override
public Iterator<Charset> charsets() {
throw new UnsupportedOperationException();
}
@Override
public Charset charsetForName(String charsetName) {
if (StringUtils.equals("BorkBorkBork", charsetName)) {
return new BorkBorkBorkCharset();
}
return null;
}
}
我不确定我是否为此走上了正确的道路。可能吗?我可以采用其他方法吗?
我通过模拟解决了这个问题。我没有完全重现该场景,但我能够模拟我的代码处理异常的糟糕方式
when(mimeMessage.getContent()).thenThrow(new UnsupportedEncodingException("X-iso88591"));
您不需要进行任何特殊编码或创建自己的字符集。只需创建一个 MimeMessage,使用 setText 方法设置消息正文,并为 setText 方法指定一个伪造的字符集名称。然后调用 MimeMessage.saveChanges 并使用 getContent 方法读回消息正文。您应该得到一个 UnsupportedEncodingException。