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

Posted

技术标签:

【中文标题】如何获取电子邮件所有附件的文件名?【英文标题】: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:我只想获取文件名,不想下载附件。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何获取电子邮件所有附件的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 从电子邮件内容中获取附加的 eml 文件?

如何从电子邮件中获取 csv 附件并保存

打开电子邮件附件时如何获取文件名和扩展名

如何在outlook中查找邮件附件内容?

如何使用 IMAP 发送邮件?

即使缺少预期的附件,如何生成电子邮件?