java中邮件的附件Id



我目前正在使用java邮件api。我需要列出附件的详细信息,也想从一些邮件中删除附件,并转发给其他人。所以我想找出附件ID。我该怎么做呢?任何建议都将不胜感激!!

这有帮助吗?

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);
        }
    }
}

没有任何附件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--

注意事项:

  1. 多部件中的每个部件都有一个Content-Type
  2. 可选,可以有一个Content-Disposition
  3. 单个部件本身可以是多部件

请注意,确实有一个Content-ID头,但我不认为这是你正在寻找的:例如,它在multipart/related消息中用于嵌入image/* s和text/html在同一电子邮件消息中的文本。你必须了解它是如何工作的,以及它是否在你的输入中使用。

我认为你最好的选择是检查Content-DispositionContent-Type头。其余的都是猜测,没有实际的需求是无法帮助代码的。

尝试使用具有MimeMessageParser类的Apache Commons Email包。使用解析器,您可以从电子邮件消息中获得内容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作为值。

在这里查看更多java中使用解析器的示例,或者在这里查看我为scala项目编写的一些代码。

相关内容

  • 没有找到相关文章

最新更新