Java Mail Sender剥离第二个内容ID

时间:2014-02-24 15:28:32

标签: java spring javamail

我正在处理邮件问题。问题与在Java邮件中发送图像inLine有关。  我有两个图像,并将它们转换为字节数组,并按顺序将它们添加到内容标题中。并在消息中添加它们。并记录输出,我可以看到两个Contecnt -ID与图像数据一起设置。

但是当我实际发送数据时,最后的内容ID将被取消。

helper.setText(msg.getText(), true);

if((InputStreamSource) model.get(ManageSystem.CAP_IMAGE_RESOURCE) != null){
    helper.addInline(ManageSystem.CAP_IMAGE_RESOURCE, (InputStreamSource) model.get(ManageSystem.CAP_IMAGE_RESOURCE), FileContentType.JPG);
}

if(model.get(ManageSystem.HITACHI_CAPITAL_LOGO_RESOURCE) != null){
        helper.addInline(ManageSystem.HITACHI_CAPITAL_LOGO_RESOURCE, (InputStreamSource) model.get(ManageSystem.HITACHI_CAPITAL_LOGO_RESOURCE), FileContentType.JPG);
}

任何人都可以帮我解决这个问题。

请不要使用:DEVSMTP服务器

1 个答案:

答案 0 :(得分:0)

Spring Documentation MimeMessageHelper推荐的as the way to go for mime messages类,顾名思义,是一个简单的帮助类,用于抽象JavaMail标准MimeMessage的一些复杂性。 }类。 MimeMessage是一个功能强大但确实冗长而复杂的课程。

mime消息的主要问题是,虽然有几个RFC,但电子邮件客户端之间的不兼容仍然是个问题。通常,解决这些问题需要深入了解mime消息的内部以及来自流行电子邮件客户端的非标准行为(这包括从标题的简单变化到改变内容的处理方式)消息的主体)。

虽然远非完美MimeMessageHelper能够使用相当多的标题和内容处理策略。通过将支持的常量传递给公开multipartMode参数的几个构造函数和方法,可以实现这些功能。

实施例

MimeMessageHelper helper = new MimeMessageHelper(message, true, 
        MimeMessageHelper.MULTIPART_MODE_MIXED);  

为了更好地了解这些常数,我建议您阅读RFC 2046RFC 2387

来自MimeMessageHelper API

  • MULTIPART_MODE_MIXED:常量,指示具有“mixed”类型的单个根多部分元素的多部分消息。文本,内联元素和附件都将添加到该根元素中。

    这是Spring 1.0的默认行为。众所周知,它可以在Outlook上正常工作。但是,其他邮件客户端往往会将内联元素误解为附件和/或内联显示附件。

  • MULTIPART_MODE_RELATED:常量,指示具有“related”类型的单个根多部分元素的多部分消息。文本,内联元素和附件都将添加到该根元素中。

    这是从Spring 1.1到最终版本的默认行为。这是Outlook本机发送的“Microsoft多部分模式”。众所周知,它可以在Outlook,Outlook Express,Yahoo Mail上正常工作,并且在很大程度上也适用于Mac Mail(尽管内联元素也以内联方式显示,但内联元素列出了附加附件)。在Lotus Notes上无法正常工作(附件不会在那里显示)。

  • MULTIPART_MODE_MIXED_RELATED:常量,指示具有根多部分元素“mixed”的多部分消息以及类型为“related”的嵌套多部分元素。文本和内联元素将添加到嵌套的“相关”元素中,而附件将添加到“混合”根元素中。

    这是Spring 1.2.1以来的默认设置。根据MIME规范,这可以说是最正确的MIME结构:众所周知,它可以在Outlook,Outlook Express,Yahoo Mail和Lotus Notes上正常工作。在Mac Mail上无法正常工作。如果您定位Mac Mail或在Outlook上遇到特定邮件的问题,请考虑使用MULTIPART_MODE_RELATED。

正如你所看到的,这是一个有争议的话题,Spring在早期阶段改变了默认模式3次。

除了在弹簧策略之间切换,有时你还需要进一步的控制(至少我是为了解决流行的网络邮件客户端的一些糟糕的行为)。这就是方便的MimeMessagePreparator回调接口的用武之地。它可以让你很好地混合使用JavaMail和Springs API:

mailSender.send(new MimeMessagePreparator() {
   public void prepare(MimeMessage mimeMessage) throws MessagingException {
     MimeMessageHelper message = new MimeMessageHelper(mimeMessage, 
             true, "UTF-8");
     // now you have both JavaMail MimeMessage and Spring MimeMessageHelper
   }
 });

最后,如果Spring / JavaMail方法开始变得具有挑战性,那么有一些非常好的库可以使事情变得更容易。我个人可以推荐Simple Java MailApache Commons Email;它们比JavaMail更高级,更易于使用。