【问题标题】:javamail also extract attachments of encapsulated message Content-Type: message/rfc822javamail 还提取封装消息的附件 Content-Type: message/rfc822
【发布时间】:2021-04-01 05:19:01
【问题描述】:

我想提取封装在消息 InputStream 中的 .eml 消息的所有附件(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() 为 null,因此保存的文件没有扩展名,我不知道如何获取。

【问题讨论】:

    标签: jakarta-mail


    【解决方案1】:

    MIME 并不要求每个正文部分都有一个文件名。如果零件没有文件名而您需要一个,则必须自己编一个。

    还请注意,在使用电子邮件中的文件名时要非常小心。它可能是意外或恶意的,例如,包含“../../../../../whatever”。

    【讨论】:

    • 你好 Bill 好的,我有一个清理功能,我要添加它,谢谢
    【解决方案2】:

    我通过将新文件名作为 .eml 文件添加到包含的消息中并使用包含的消息进行递归来做到这一点

    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
        }
    

    【讨论】:

      【解决方案3】:
      • 更好地使用 org.apache.commons.mail.util.MimeMessageParser。

      • MimeMessageParser 具有称为hasAttachments() 的方法 如果邮件有附件,则返回 true

      • 然后遍历所有附件并检查内容类型 message/rfc822 来自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();
          }
      

      【讨论】:

        猜你喜欢
        • 2019-10-27
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 2020-03-20
        • 1970-01-01
        • 2014-09-17
        相关资源
        最近更新 更多