我有String
一封包含附件的电子邮件。
(全文String
约2000行,这里只列出主要部分。)
开始String
:_
--_002_0BB5B2121E0AF543BC9F9664030EF5991ADD1C89SWBNTSRV26sorec_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" ......
邮件内容的结尾和附件的开头:
</div>
</body>
</html>
--_002_0BB5B2121E0AF543BC9F9664030EF5991ADD1C89SWBNTSRV26sorec_
Content-Type: image/jpeg; name="IMAG0205.jpg"
Content-Description: IMAG0205.jpg
...
/9j/4TokRXhpZgAATU0AKgAAAAgACAEPAAIAAABcAAAAbgEQAAIAAABcAAAAy... (base64 file)
所以现在我需要将这个很长的内容解析String
为 ajavax.mail.MultiPart
或将其保留为 a String
,如果邮件没有任何附件。
注意:我没有机会直接收到邮件MultiPart
,我只有这个String
。
这是我到目前为止所拥有的:
/**
* Return the primary text content of the message.
*/
private boolean textIsHtml = false;
private String getText(Part p) throws MessagingException, IOException {
if (p.getContent() instanceof ByteArrayInputStream) {
ByteArrayInputStream stream = (ByteArrayInputStream) p.getContent(); // This ByteArrayInputStream contains the long String mentioned in this question.
MimeMessage message = new MimeMessage(session, stream); // here I try to create a MimeMessage from that String, but this doesn't work.
p = message;
}
if (p.isMimeType("text/*")) {
String s = (String) p.getContent();
textIsHtml = p.isMimeType("text/html");
return s;
}
if (p.isMimeType("multipart/alternative")) {
// prefer html text over plain text
Multipart mp = (Multipart) p.getContent();
String text = null;
for (int i = 0; i < mp.getCount(); i++) {
Part bp = mp.getBodyPart(i);
if (bp.isMimeType("text/plain")) {
if (text == null) {
text = getText(bp);
}
continue;
} else if (bp.isMimeType("text/html")) {
String s = getText(bp);
if (s != null) {
return s;
}
} else {
return getText(bp);
}
}
return text;
} else if (p.isMimeType("multipart/*")) {
Multipart mp = (Multipart) p.getContent();
for (int i = 0; i < mp.getCount(); i++) {
String s = getText(mp.getBodyPart(i));
if (s != null) {
return s;
}
}
}
return null;
}
代码示例是来自官方 Oracle FAQ 页面的代码,但稍作修改以将所Object
提供的转换getContent()
为新的MimeMessage
。该代码不起作用,因为创建的MimeMessage
具有 mime-typetext/html
而不是multipart/*
.
因此,在第一个 if 块之后执行这些行时会引发 ClassCastException:
if (p.isMimeType("text/*")) {
String s = (String) p.getContent();
textIsHtml = p.isMimeType("text/html");
return s;
}
有没有人对如何在String
不编写巨大的解析器的情况下解析有一个聪明的想法?
先感谢您!