Java 邮件发送器删除第二个内容 ID

标签 java spring jakarta-mail

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

但是当我实际发送数据时,最后一个 content-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服务器

最佳答案

MimeMessageHelper类,Spring文档推荐as the way to go for mime messages顾名思义,它是一个简单的辅助类,用于抽象 JavaMail 的一些复杂性。标准MimeMessage类(class)。 MimeMessage 是一个功能强大但无可否认的冗长且复杂的类。

mime 消息的主要问题是,尽管有多个 RFC,但电子邮件客户端之间的不兼容性仍然是一个问题。大多数情况下,解决这些问题需要深入了解 mime 消息的内部结构以及流行电子邮件客户端的非标准行为(范围从标题的简单变化一直到改变内容的处理方式)消息正文)。

虽然远非完美,但 MimeMessageHelper 能够使用相当范围的 header 和内容处置策略。可以通过将支持的常量传递给公开 multipartMode 参数的多个构造函数和方法来利用这些。

示例

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

为了更好地理解这些常量,我强烈建议阅读 RFC 2046RFC 2387

来自 MimeMessageHelper API

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

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

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

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

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

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

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

除了在 spring 策略之间切换之外,有时您还需要进一步的控制(至少我是这样做的,以便解决流行的网络邮件客户端的一些不良行为)。这就是方便的地方MimeMessagePreparator回调接口(interface)出现了。它可以让你很好地混合 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 更高级别且更易于使用。

关于Java 邮件发送器删除第二个内容 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21991928/

相关文章:

java - 用Java读取.txt文件?

hibernate - 未定义 [javax.persistence.EntityManagerFactory] ​​类型的唯一 bean : expected single bean but found 2

JavaMail - 如何设置与 DATA 中的 “RCPT TO:” header 不匹配的 SMTP “To:”

java - 警报服务(重构AlertService和MapAlertDAO类)

java - 抽象类的私有(private)字段不能在子类中访问

java - 如何从双向链表中提取值?

Spring MQTT JAva Config 示例问题

java - Spring MVC - 使用 java 为 Controller 创建 httprequest

jakarta-mail - Java 连接到 Powermta

java - 使用 spring boot 和带有代理的 JavaMailSender 发送邮件