我想解析使用javax.mail的電子郵件。我想要獲取文本內容和所有附件(最好是INLINE圖片/附件)。如何用javax.mail解析郵件內容?
我有下面的代碼,但它似乎打破了更復雜的郵件與幾個嵌套multiparts。
我已閱讀常見問題解答,並在整個一天內搜索不到解決方案。
請幫忙。
public static String fetchEmailcontent(Part message, String messageid) throws IOException, MessagingException {
StringWriter sw = new StringWriter(1024);
if (message != null && message.getContent() != null) {
if (message.getContent() instanceof Multipart) {
Multipart parts = (Multipart) message.getContent();
BodyPart p;
boolean alternative = parts.getContentType().trim().toLowerCase().startsWith("multipart/alternative") ? true : false;
InputStreamReader isr;
int retrieved;
char[] buffer = new char[512];
for (int i = 0; i < parts.getCount(); i++) {
p = parts.getBodyPart(i);
if (p.getContentType().toLowerCase().startsWith("multipart")) {
sw.write(fetchEmailcontent(p, messageid));
break;
} else if ((Part.INLINE.equalsIgnoreCase(p.getDisposition()) || p.getDisposition() == null) && p.getContentType().toLowerCase().startsWith("text") && p.getFileName() == null) {
if (InputStream.class.isInstance(p.getContent())) {
InputStream ip = p.getInputStream();
StringWriter subwriter = new StringWriter(ip.available());
isr = new InputStreamReader(ip);
while (isr.ready()) {
retrieved = isr.read(buffer, 0, 512);
subwriter.write(buffer, 0, retrieved);
}
sw.write(subwriter.toString());
} else {
Object content = p.getContent();
if (java.io.ByteArrayInputStream.class.isInstance(content)) {
int bcount = ((java.io.ByteArrayInputStream) content).available();
byte[] c = new byte[bcount];
((java.io.ByteArrayInputStream) content).read(c, 0, bcount);
sw.write(new String(c));
} else {
sw.write(content.toString());
}
}
if (alternative && !"".equals(sw.toString().trim())) {
break;
}
sw.write("\r\n");
} else if (p.getDisposition() != null && (p.getDisposition().equalsIgnoreCase(Part.ATTACHMENT) || p.getDisposition().equalsIgnoreCase(Part.INLINE))) {
saveFile(MimeUtility.decodeText(p.getFileName()), p.getInputStream(), messageid);
}
}
} else if (message.getContentType().toLowerCase().startsWith("text")) {
sw.write(message.getContent().toString());
}
}
return sw.toString();
}
這裏有一個郵件的例子未能從獲取附件: (我已刪除頁眉和使用Base64編碼的附件,以節省空間..他們是完全正常的,否則)
Content-Type: multipart/mixed; boundary=f46d04016b4779522904c58fb5b4
--f46d04016b4779522904c58fb5b4
Content-Type: multipart/alternative; boundary=f46d04016b4779522104c58fb5b2
--f46d04016b4779522104c58fb5b2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
test
sdljpjdpjsd
=E5=E4=F6
--f46d04016b4779522104c58fb5b2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<div>test </div><div>=A0</div><div>=A0</div><div>sdljpjdpjsd</div><div>=A0<=
/div><div>=A0</div><div>=E5=E4=F6</div>
--f46d04016b4779522104c58fb5b2--
--f46d04016b4779522904c58fb5b4
Content-Type: image/jpeg; name="blah.jpg"
Content-Disposition: attachment; filename="blah.jpg"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h50rhk180
BUNCH OF BASE64
--f46d04016b4779522904c58fb5b4
Content-Type: application/pdf; name="blah2.pdf"
Content-Disposition: attachment; filename="blah2.pdf"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_h50ria042
BUNCH OF BASE64
--f46d04016b4779522904c58fb5b4--
預期輸出是郵件正文中的文本,並將所有附件保存到磁盤。 saveFile()函數可以做到這一點,但是它的基本功能我決定不包含它。我當然知道這不是罪魁禍首。
在此先感謝。
您能否向我們提供應該顯示信息的電子郵件?另外,解釋它發現的附件有什麼問題 – 2012-07-24 14:54:34
我在原始文章中附加了電子郵件源。問題是它沒有找到附件。 – 2012-07-24 14:57:24