【问题标题】:How to get filename of all attachements of email?如何获取电子邮件所有附件的文件名?
【发布时间】:2014-07-15 23:24:33
【问题描述】:

我正在尝试使用 java 和 imap 获取所有电子邮件附件的文件名。我的代码是:

MimeMessage msg = (MimeMessage) messages[i];
String fileName = msg.getFileName();
System.out.println("The file name of this attachment is " + fileName);

但即使电子邮件包含附件,它也会始终打印 null。我在 SO 上看到了不同的代码,但没有一个有效……如果附件不止一个,我不知道该怎么办。
PS:我只想获取文件名,不想下载附件。

【问题讨论】:

    标签: java imap attachment


    【解决方案1】:

    首先,使用以下代码确定邮件是否可能包含附件:

    // suppose 'message' is an object of type Message
    String contentType = message.getContentType();
    
    if (contentType.contains("multipart")) {
        // this message may contain attachment
    }
    

    然后我们必须遍历multipart中的每个部分,以确定哪个部分包含附件,如下:

    Multipart multiPart = (Multipart) message.getContent();
    
    for (int i = 0; i < multiPart.getCount(); i++) {
        MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
        if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
            // this part is attachment
            // code to save attachment...
        }
    }
    

    要保存文件,您可以这样做:

    part.saveFile("D:/Attachment/" + part.getFileName());
    

    Source

    【讨论】:

      【解决方案2】:

      使用 apache commons mail 有一种更简单的方法:

      final MimeMessageParser mimeParser = new MimeMessageParser(mimeMessage).parse();
      final List<DataSource> attachmentList = mimeParser.getAttachmentList();
      for (DataSource dataSource: attachmentList) {
                  final String fileName = dataSource.getName();
                  System.out.println("filename: " + fileName);
      }
      

      【讨论】:

        【解决方案3】:

        当电子邮件包含另一封电子邮件作为附件时,我遇到了同样的问题。此类附件的内容处置不包含文件名。

        String contentType = message.getContentType(); 
        List<String> attachmentFiles = new ArrayList<String>();
        if(contentType.contains("multipart"))
            {
                Multipart multiPart = (Multipart)message.getContent(); 
                int numberOfParts = multiPart.getCount(); 
                for(int partCount = 0; partCount < numberOfParts; partCount++)
                {
                    MimeBodyPart part = (MimeBodyPart)multiPart.getBodyPart(partCount); 
                    if(Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
                        String fileName = part.getFileName();
                        String extension = FilenameUtils.getExtension(fileName);
                        //If the attachment is an email, fileName will be null.
                        if ("message/rfc822".equalsIgnoreCase(part.getContentType())) {
                            MimeMessage tempMessage = new MimeMessage(null, part.getInputStream());
                            fileName = tempMessage.getSubject()+".eml"; //all the email attachments will be converted to .eml format.
                            extension = "eml";
                        }
                        File tempEmailFile = File.createTempFile(messageId + "_" + partCount , "." + extension);
                        part.saveFile(tempEmailFile); 
                        attachmentFiles.add(fileName);
                        attachmentFiles.add(tempEmailFile.getAbsolutePath()); 
                    }
                }
                
            }
        

        参考:https://html.developreference.com/article/15782816/javamail+also+extract+attachments+of+encapsulated+message+Content-Type%3A+message+rfc822

        【讨论】:

          猜你喜欢
          • 2011-08-20
          • 2022-12-13
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 2016-04-16
          • 2012-03-11
          • 2012-08-23
          • 1970-01-01
          相关资源
          最近更新 更多