使用JavaMail创建带附件的EML文件

时间:2009-01-07 20:31:25

标签: java email outlook javamail eml

我将使用JavaMail创建带附件的EML文件。

我成功创建了一个简单的EML文件,但添加附件无法正常工作。我要添加一个PDF文件。我的EML文件将成功创建。如果我用Outlook打开生成的EML文件,我会发现我的PDF文件不是附件,但我会发现EML文件本身就是附件。有没有人有想法?

我尝试了两个变体(结果相同),我使用FileDataSource类和MimeBodyPart#attachFile(File)的简单方法。

我要发一个例子:

File pdfFile = new File("somePdfFile");

Properties p = System.getProperties();
Session session = Session.getInstance(p);
MimeMessage message = new MimeMessage(session);
// MimeBodyPart txt = new MimeBodyPart();
// txt.setText("");
MimeBodyPart mbp = new MimeBodyPart();
mbp.attachFile(attachment);
// FileDataSource fds = new FileDataSource(attachment);
// fds.setFileTypeMap(new FileTypeMap() {
//    
//   @Override
//   public String getContentType(String arg0) {
//     return "application/pdf";
//   }
//    
//    @Override
//    public String getContentType(File file) {
//      return "application/pdf";
//    }
//      
//  });
//  mbp.setDataHandler(new DataHandler(fds));
//  mbp.setFileName("\"" + attachment.getName() + "\"");
//  mbp.setDisposition(MimePart.ATTACHMENT);
//  mbp.setHeader("Content-ID", "Attachment");
Multipart mp = new MimeMultipart();
//  mp.addBodyPart(txt);
mp.addBodyPart(mbp);
message.setContent(mp);
File emlFile = new File("message.eml");
emlFile.createNewFile();
message.writeTo(new FileOutputStream(emlFile));

// do something with the EML file
// Desktop.getDesktop().open(emlFile);

Create a .eml (email) file in Java


感谢您的回复。我上传了一个PDF文件(我用于测试,它是一个用Crystal Reports生成的简单的HelloWorld)和生成的EML文件,应该包含PDF文件。

我刚注意到,如果我用Apple Mail或Outlook Express打开链接的EML文件,它可以工作(但没有编辑可能性)。也许这是Microsoft Outlook的一个问题?

删除链接

2 个答案:

答案 0 :(得分:1)

Zubi,看起来问题是附件上的内容类型设置为“application / octet-stream”。因此,看起来邮件阅读器将PDF文件作为不存在的消息“文本”主体的替代显示(它只是空白)。

你必须原谅我,自从我处理Mime已经一年多了,但我认为你会想要A)在信息中加入一些正文,B)确保类型在附件上设置为application / pdf。希望这会阻止邮件阅读尝试将PDF显示为邮件的主要部分。

除此之外,它看起来很正常......现在,Outlook MIGHT婊子,因为主体中没有RFC 822标头。您可能希望至少添加From:To:Subject:

消息传递了我的MIME解析代码......

答案 1 :(得分:1)

您应该尝试将我提到的标题行添加到邮件的最顶部,然后查看Outlook如何处理它。添加To:From:Subject:,甚至是Date:,其中包含真实数据,而Outlook更有可能将其视为一条消息,而不仅仅是文件。