javamail还提取封装消息的附件Content-Type:message / rfc822

时间:2016-08-10 13:08:33

标签: javamail

我想在消息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,因此保存的文件没有扩展名,我不知道如何获取此文件。

3 个答案:

答案 0 :(得分:1)

MIME不要求每个正文部分都有文件名。如果该部件没有文件名而您需要一个文件名,那么您必须自己制作文件名。

另请注意,使用电子邮件中的文件名时要非常小心。它可能是意想不到的或恶意的,例如包含&#34; ../../../../../等等#34;。

答案 1 :(得分:1)

我是通过在包含的邮件中添加一个新的文件名作为.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
    }

答案 2 :(得分:0)

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

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

  • 然后遍历所有附件并检查内容类型 来自message/rfc822的{​​{1}}。

  • 使用getContentType()
  • 创建新的MimeMessage

DataSource InputStream

  • 最后你有MimeMessage。

Maven依赖:

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

代码示例:

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