我目前正在使用 java mail api 。我需要列出附件详细信息,还想从某些电子邮件中删除附件并将其转发给其他人。所以我试图找出附件ID。我该怎么做?任何建议将不胜感激!!!
问问题
599 次
3 回答
0
没有任何作为附件 ID的东西。您的邮件客户端显示为带有附加内容的消息,实际上是 MIME Multipart,如下所示(示例源):
From: John Doe <example@example.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="XXXXboundary text"
This is a multipart message in MIME format.
--XXXXboundary text
Content-Type: text/plain
this is the body text
--XXXXboundary text
Content-Type: text/plain;
Content-Disposition: attachment; filename="test.txt"
this is the attachment text
--XXXXboundary text--
需要注意的重要事项:
- 多部分中的每个部分都有一个
Content-Type
- 可选地,可以有一个
Content-Disposition
标题 - 单部分本身可以是多部分
请注意,确实有一个Content-ID
标头,但我认为这不是您要查找的内容:例如,它在multipart/related
消息中用于将image/*
s 和来自 a 的文本嵌入text/html
同一电子邮件消息中。您必须了解它是如何工作的,以及它是否在您的输入中使用。
我认为你最好的选择是检查Content-Disposition
和Content-Type
标题。其余的都是猜测,如果没有实际要求,就无法帮助编写代码。
于 2013-06-19T06:00:33.627 回答
0
这有帮助吗?
private void getAttachments(Part p, File inputFolder, List<String> fileNames) throws Exception{
String disp = p.getDisposition();
if (!p.isMimeType("multipart/*") ) {
if (disp == null || (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE)))) {
String fileName = p.getFileName();
File opFile = new File(inputFolder, fileName);
((MimeBodyPart) p).saveFile(opFile);
fileNames.add(fileName);
}
}
}else{
Multipart mp = (Multipart) p.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++){
getAttachments(mp.getBodyPart(i),inputFolder, fileNames);
}
}
}
于 2013-06-19T05:45:37.533 回答
0
尝试使用具有类的Apache Commons Email 包MimeMessageParser
。使用解析器,您可以从电子邮件消息中获取内容 ID(可用于识别附件)和附件,如下所示:
Session session = Session.getInstance(new Properties());
ByteArrayInputStream is = new ByteArrayInputStream(rawEmail.getBytes());
MimeMessage message = new MimeMessage(session, is);
MimeMessageParser parser = new MimeMessageParser(message);
// Once you have the parser, get the content ids and attachments:
List<DataSource> attachments = parser.getContentIds.stream
.map(id -> parser.findAttachmentByCid(id))
.filter(att -> att != null)
.collect(Collectors.toList());
为简洁起见,我在这里创建了一个列表,但是,您可以创建一个以contentId
为键和DataSource
为值的映射。
于 2019-01-25T09:15:35.507 回答