gpt4 book ai didi

java - MimeMessage.getAllHeaders() 返回两个不同项目中的两个不同类

转载 作者:行者123 更新时间:2023-12-01 11:50:23 28 4
gpt4 key购买 nike

我有一个关于邮件发送的项目并且工作没有问题,但我创建了另一个关于邮件发送的项目,生成的 MimeMessage 无法在第一个项目中解析。

我研究了这些类,发现 MimeMessage 的 header 类之间存在差异这两个项目都在使用

javax.mail.internet.MimeMessage

但我将 header 记录为:

Enumeration enumer = originalUserMessage.getAllHeaders();
while(true){
try{
Object obj = enumer.nextElement();
if(obj == null) {
break;
}
LOGGER.info("Header class: "+obj.getClass().getName());
LOGGER.info("Header super class:" + obj.getClass().getSuperclass().getName());
} catch (NoSuchElementException nsee) {
break;
}

}

打印的第一个项目:

2015-03-03 16:57:16 INFO  SmimeWriter:204 - Header class: 
javax.mail.Header
2015-03-03 16:57:16 INFO SmimeWriter:205 - Header super class:
java.lang.Object

打印第二个项目

2015-03-03 16:57:39 INFO  SmimeWriter:204 - Header class: 
javax.mail.internet.InternetHeaders$InternetHeader
2015-03-03 16:57:39 INFO SmimeWriter:205 - Header super class:
javax.mail.Header

所有相关类看起来都在 mail.jar 中。我正在使用 Maven 来获取 jar,两个项目都将该 jar 获取为:

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.2</version>
</dependency>

可能是什么问题。还有其他依赖的jar吗?

两个项目都使用相同的方法。设置了 mime 消息其他部分下面的代码块后,但这里出现问题。代码:

        MimeMessage originalUserMessage = new MimeMessage(session);

originalUserMessage.setFrom(from);
originalUserMessage.setRecipients(Message.RecipientType.TO, to);
if(cc != null && cc.length>0){
originalUserMessage.setRecipients(Message.RecipientType.CC, cc);
}

Enumeration enumer = originalUserMessage.getAllHeaders();
while(true){
try{
Object obj = enumer.nextElement();
if(obj == null) {
break;
}
LOGGER.info("Header class: "+obj.getClass().getName());
LOGGER.info("Header super class: "+obj.getClass().getSuperclass().getName());
} catch (NoSuchElementException nsee) {
break;
}

}

最佳答案

这根本不是问题。 contract of the MimeMessage.getAllHeaders() method很清楚:

Return all the headers from this Message as an enumeration of Header objects.

该文档指的是 javax.mail.Header类。

因此,当您调用 MimeMessage.getAllHeaders() 时,只能安全地假设 Enumeration 将返回 javax.mail.Header 的实例。它可能会或可能不会返回作为 Header 子类的对象,根据多态性的基本规则,这是完全有效的事情,只要调用代码可以像 Header 一样安全地对待它们实例。

根据您运行程序的方式,pom.xml 中的 JavaMail 版本可能不相关。在 Java EE 容器(如 GlassFish 和 JBoss)和 servlet 容器(如 Tomcat)中,JavaMail 是由容器提供的,因此即使您将自己版本的 JavaMail 与应用程序打包在一起,ClassLoader 也可能会忽略它并无条件使用提供的 JavaMail由服务器环境决定。

旁注:循环枚举的正确方法是使用其 hasMoreElements()方法:

while (enumer.hasMoreElements()) {
Header header = (Header) enumer.nextElement();
System.out.printf("%s: %s%n", header.getName(), header.getValue());
}

尽管使用 try/catch 在技术上是可行的,但使用 try/catch 来检测枚举的结尾是不正确的。它速度较慢,难以阅读,并且可能会无意中捕获编程错误,这使得调试变得相当困难。

关于java - MimeMessage.getAllHeaders() 返回两个不同项目中的两个不同类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28835636/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com