如何获取电子邮件的所有附件的文件名?

时间:2014-05-27 06:48:50

标签: java imap attachment

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

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

但是即使电子邮件中包含附件,它也会一直打印出来。我在SO上看到了不同的代码,但没有一个工作......如果附件不止一个,我也不知道该怎么办。
PS:我只想获取文件名而不想下载附件。

3 个答案:

答案 0 :(得分:5)

首先,使用以下代码确定消息是否包含附件:

// suppose 'message' is an object of type Message
String contentType = message.getContentType();

if (contentType.contains("multipart")) {
    // this message may contain attachment
}

然后我们必须遍历多部分中的每个部分以识别哪个部分包含附件,如下所示:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

当电子邮件包含另一封电子邮件作为附件时,我遇到了同样的问题。这种附件的内容配置不包含fileName。

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