jakarta mail - javamail还提取封装消息的附件内容类型:message/rfc822



我想提取一个. email消息的所有附件,该消息封装在消息InputStream

中(Content-Type: message/rfc822)
InputStream is = new FileInputStream(Path);
MimeMessage mime = new MimeMessage(null, is);

 private  String getAttachments(p) throws
                MessagingException, IOException {

if ( p.isMimeType("multipart/*")) {
                    Multipart multiPart = (Multipart) p.getContent();
                    int numberOfParts = multiPart.getCount();
                    for (int partCount = 0; partCount < numberOfParts; partCount++) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
String disp = part.getDisposition();
 if (disp != null && disp.equalsIgnoreCase(Part.ATTACHMENT)  {
    file_name =   part.getFileName();
    part.saveFile(Attachments_Folder + "\" + MailFileName + "_" + file_name);
     }
     }
  }
}
is.close()

另外,当Content-Type是message/rfc822时,part.getFileName()为空,因此保存的文件没有扩展名,我不知道如何得到这个

我是这样做的:为包含的消息添加一个新的文件名作为. email文件,并对包含的消息进行递归处理

import java.util.*;
import javax.activation.DataHandler;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.search.*;
import java.io.FileInputStream.*;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.Part;
import javax.mail.Multipart;
getAttachments(Path) ;
  //function
private  String getAttachments(path) throws
    MessagingException, IOException {
    InputStream is = new FileInputStream(path);
    MimeMessage p = new MimeMessage(null, is);
    if ( p.isMimeType("multipart/*")) {
// if (contentType.contains("multipart")) {
                    Multipart multiPart = (Multipart) p.getContent();
                    int numberOfParts = multiPart.getCount();
                    for (int partCount = 0; partCount < numberOfParts; partCount++) {
            MimeBodyPart part = (MimeBodyPart)multiPart.getBodyPart(partCount);
            String disp = part.getDisposition();
            if (disp != null && disp.equalsIgnoreCase(Part.ATTACHMENT)) {
            file_name =  part.contentType == "message/rfc822" ? "message_inclus" + partCount + ".eml" :             MimeUtility.decodeText(part.getFileName());
            exportedpath = Attachments_Folder + "/" + MailFileName + "_" + file_name; 
            part.saveFile(exportedpath);
            if ( part.contentType == "message/rfc822" ) {
            getAttachments(exportedpath) 
            }
            }
        }
    }
    is.close() 
    return 1
    }

MIME不要求每个主体部分都有文件名。如果零件没有文件名,而你需要一个,你就必须自己创建一个。

还要注意,在使用电子邮件消息中的文件名时要非常小心。它可能是一些意想不到的或恶意的东西,例如,包含"../../../../../等等"。

  • 最好使用org.apache.commons.mail.util.MimeMessageParser

  • MimeMessageParser有一个叫做hasAttachments()的方法如果消息有附件,则返回true

  • 然后遍历所有附件并检查content-typemessage/rfc822 from getContentType() .

  • DataSource InputStream创建新的MimeMessage

final MimeMessage message = new MimeMessage(null,attachment.getInputStream());

  • 最后是MimeMessage。

Maven依赖:

<dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-email</artifactId>
        <version>RELEASE</version>
    </dependency>

代码示例:

public void readEmails() throws Exception{
        // mail server connection parameters
        String host = "host";
        String user = "username";
        String pwd = "pwd";
        // connect to my pop3 inbox
        Properties properties = System.getProperties();
        Session session = Session.getDefaultInstance(properties);
        Store store = session.getStore("pop3");
        store.connect(host, user, pwd);
        Folder inbox = store.getFolder("INBOX");
        inbox.open(Folder.READ_ONLY);
        // get the list of inbox messages
        Message[] messages = inbox.getMessages();
        if (messages.length == 0) System.out.println("No messages found.");
        for (int i = 0; i < messages.length; i++) {
            // stop after listing ten messages
            if (i > 10) {
                System.exit(0);
                inbox.close(true);
                store.close();
            }
            final MimeMessageParser mimeMessageParser = new MimeMessageParser((MimeMessage) messages[i]);
            mimeMessageParser.parse();
            if (mimeMessageParser.hasAttachments()) {
                List<DataSource> attachmentList = mimeMessageParser.getAttachmentList();
                System.out.println("Number of attachments: " +attachmentList.size());
                for (DataSource attachment:attachmentList
                     ) {
                    System.out.println("Name: "+attachment.getName()+"  Content Type: "+attachment.getContentType());
                    if (attachment.getContentType().equals("message/rfc822")) {
                        final MimeMessage message = new MimeMessage(null,attachment.getInputStream());
                        System.out.println("Subject of the attached failure Mail:" + message.getSubject());
                    }
                }
            }
            System.out.println("Message " + (i + 1));
            System.out.println("From : " + messages[i].getFrom()[0]);
            System.out.println("Subject : " + messages[i].getSubject());
            System.out.println("Sent Date : " + messages[i].getSentDate());
            System.out.println();
        }
        inbox.close(true);
        store.close();
    }