我有一个现有代码,可以正确下载和处理一些电子邮件。
要处理的电子邮件必须具有一个或多个xml作为附件,现在我要将该过程从当前标准邮件帐户迁移到经过认证的系统,该系统将该邮件包装为新的电子邮件。
因此,我必须解析带有XML(经过认证的邮件)和EML(我应处理的邮件)的电子邮件,而不是带有一个xml附件的普通电子邮件。
简而言之,我的代码如下:
private void processMessage(final Message message) {
try {
final String contentType = message.getContentType();
if (contentType.contains("multipart")) {
final Multipart multiPart = (Multipart) message.getContent();
for (int i = 0; i < multiPart.getCount(); i++) {
final MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
/**************************************************************
* HERE I CAN'T GET THE EML (and its attachments) FROM 'part' *
**************************************************************/
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
processAttachment(part);
}
}
}
} [...cutted...]
}
private void processAttachment(final MimeBodyPart part) throws IOException, MessagingException {
final InputStream input = getReusableInputStream(part);
if (part.getFileName() != null && isXmlType(part.getContentType())) {
processXml(input);
}
}
我应该对其进行修改,以便解析EML并以递归方式获取附件,但是我没有看到大图景。
更新:我已经修改了processAttachment
方法(但仍然无法使用):
private void processAttachment(final Multipart multipart) {
try {
for (int i = 0; i < multipart.getCount(); i++) {
final BodyPart bodyPart = multipart.getBodyPart(i);
if (bodyPart.getContent() instanceof Multipart) {
// part-within-a-part, do some recursion...
extractAttachment((Multipart) bodyPart.getContent());
}
System.out.println("Filename: " + bodyPart.getFileName());
System.out.println("ct: " + bodyPart.getContentType());
final boolean isXml = bodyPart.getFileName() != null && isXmlType(bodyPart.getContentType());
if (isXml) {
final InputStream inputStream = getReusableInputStream(bodyPart);
processXMLAttachment(inputStream);
}
}
} [cutted]
}
输出为:
Filename: null
ct: TEXT/PLAIN; charset=iso-8859-1
Filename: null
ct: TEXT/HTML; charset=iso-8859-1
Filename: daticert.xml
ct: APPLICATION/XML; name=daticert.xml
Filename: postacert.eml
ct: MESSAGE/RFC822; name=postacert.eml
Filename: smime.p7s
ct: APPLICATION/X-PKCS7-SIGNATURE; name=smime.p7s
从输出中,我可以看到系统仅扫描了第一级附件daticert.xml
和postacert.eml
,但没有找到嵌套的附件。
更具体地说,我必须阅读以下内容:
Filename: postacert.eml
ct: MESSAGE/RFC822; name=postacert.eml
有什么帮助吗?
谢谢
答案 0 :(得分:0)
好吧,我通过检查任何MimePart
的类来解决,发现嵌套消息的类型为IMAPNestedMessage
,因此在这种对象上我递归调用了主方法{{1} }:
processMessage
现在工作正常。