我想在消息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,因此保存的文件没有扩展名,我不知道如何获取此文件。
答案 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()
DataSource InputStream
final MimeMessage message = new MimeMessage(null,attachment.getInputStream());
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>RELEASE</version>
</dependency>