当前位置: 首页 > 知识库问答 >
问题:

JavaMail IMAP消息内容SSL/非SSL

梅跃
2023-03-14

我遇到了在JavaMailIMAP奇怪的问题。

我已经知道很多关于JavaMail的知识,我也知道在哪里可以找到问题/答案,但我找不到解决这个问题的方法。

我有IMAP频道,我可以设置SSL启用或禁用。当我创建新的电子邮件消息(比如说,主题:“测试”,身体:“你好”)并从雷鸟客户端发送,以便能够用我的IMAP频道下载时,事情变得越来越奇怪。

在启用SSL的情况下,一切正常。(在我的IMAP频道中)我从电子邮件文件夹中收到消息,成功连接到商店后,我从该消息中获取内容()(它始终是字符串类型,而不是MimemMultipart或Multipart),输出为“HELLO”。

然而,在禁用SSL的情况下,一切正常,但我收到的是不同的正文。看起来整个消息都被解析了(看下面)

message.getContent(). toString();使用SSL

HELLO

消息getContent()。toString();不使用SSL

Return-Path: and@127.0.0.1
Received: from [127.0.0.1] (localhost [127.0.0.1]) by PC ; Wed, 22 Jan 2014 13:23:17 +0100
Message-ID: <52DFB835.9020300@127.0.0.1>
Date: Wed, 22 Jan 2014 13:23:17 +0100
From: "and@127.0.0.1" <and@127.0.0.1>
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130509 Thunderbird/17.0.6
MIME-Version: 1.0
To: and@127.0.0.1
Subject: TEST
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

有人知道发生了什么吗?下面是我的代码片段(向您展示最重要的部分:

// properties used to create session 
String protocol = useSSL ? "imaps" : imap";

properties.setProperty("mail.store.protocol", protocol);
properties.setProperty("mail." + protocol + ".host", ...);
properties.setProperty("mail." + protocol + ".user", ...);
properties.setProperty("mail." + protocol + ".port", ...);
properties.setProperty("mail." + protocol + ".password", ...);

// only when using ssl
properties.setProperty("mail.imaps.auth", "true");
properties.setProperty("mail.imaps.starttls.enable", "true");
properties.setProperty("mail.imaps.ssl.checkserveridentity", "true");
properties.setProperty("javax.net.ssl.trustStore", ...);
properties.setProperty("javax.net.ssl.trustStorePassword", ...);

// get store and other important things
Store store = this.session.getStore(protocol);
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] newMessages = folder.getMessages();
for (Message newMessage : newMessages) {
  Object o = newMessage.getContent();
  System.out(o.toString()); // should write "HELLO", but instead it parses whole message (only on NON SSL MODE!)
}

//编辑:添加了调试信息//编辑2:调试信息现在使用{CONTENT_info,FLAGS,ENVELOPE}包含了获取文件夹的完整细节

DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc]
DEBUG: mail.imap.fetchsize: 16384
DEBUG: protocolConnect returning false, host=127.0.0.1, user=and@127.0.0.1, password=<null>
* OK IMAPrev1
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 CHILDREN IDLE QUOTA SORT ACL NAMESPACE RIGHTS=texk
A0 OK CAPABILITY completed
DEBUG: protocolConnect login, host=127.0.0.1, user=and@127.0.0.1, password=<non-null>
A1 LOGIN and@127.0.0.1 password
A1 OK LOGIN completed
DEBUG: connection available -- size: 1
A2 SELECT INBOX
* 1 EXISTS
* 0 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1378802425] current uidvalidity
* OK [UNSEEN 50167] unseen messages
* OK [UIDNEXT 50168] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
A2 OK [READ-WRITE] SELECT completed
A3 SEARCH UNSEEN ALL
* SEARCH 1
A3 OK Search completed
A4 FETCH 1 (BODYSTRUCTURE)
* 1 FETCH (UID 50167 BODYSTRUCTURE ("TEXT" "PLAIN" ("CHARSET" "UTF-8") NIL "test" "7bit" 7 2))
A4 OK FETCH completed
A5 FETCH 1 (BODY[TEXT]<0.7>)
* 1 FETCH (UID 50167 ENVELOPE ("Tue, 28 Jan 2014 15:08:59 +0100" "test" (("and@127.0.0.1" NIL "and" "127.0.0.1")) (("and@127.0.0.1" NIL "and" "127.0.0.1")) (("and@127.0.0.1" NIL "and" "127.0.0.1")) (("and@127.0.0.1" NIL "and" "127.0.0.1")) NIL NIL NIL "<52E7B9FB.2030409@127.0.0.1>") BODY[HEADER] {479}
Return-Path: and@127.0.0.1
Received: from [127.0.0.1] (localhost [127.0.0.1]) by A-PC ; Tue, 28 Jan 2014 15:08:59 +0100
Message-ID: <52E7B9FB.2030409@127.0.0.1>
Date: Tue, 28 Jan 2014 15:08:59 +0100
From: "and@127.0.0.1" <and@127.0.0.1>
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130509 Thunderbird/17.0.6
MIME-Version: 1.0
To: and@127.0.0.1
Subject: test
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

 BODY[TEXT]<0> {7}
HELLO
)
A5 OK FETCH completed
A6 FETCH 1 (FLAGS)
* 1 FETCH (UID 50167 FLAGS (\Seen))
A6 OK FETCH completed
A7 FETCH 1 (ENVELOPE INTERNALDATE RFC822.SIZE FLAGS BODYSTRUCTURE)
* 1 FETCH (UID 50167 RFC822.SIZE 462 FLAGS (\Seen) INTERNALDATE "28-Jan-2014 15:08:59 +0100" ENVELOPE ("Tue, 28 Jan 2014 15:08:59 +0100" "test" (("and@127.0.0.1" NIL "and" "127.0.0.1")) (("and@127.0.0.1" NIL "and" "127.0.0.1")) (("and@127.0.0.1" NIL "and" "127.0.0.1")) (("and@127.0.0.1" NIL "and" "127.0.0.1")) NIL NIL NIL "<52E7B9FB.2030409@127.0.0.1>") BODYSTRUCTURE ("TEXT" "PLAIN" ("CHARSET" "UTF-8") NIL "test" "7bit" 7 2))
A7 OK FETCH completed
A8 STORE 1 +FLAGS (\Seen)
* 1 FETCH (FLAGS (\Seen) UID 50167)
A8 OK STORE completed
A9 CLOSE
A9 OK CLOSE completed
DEBUG: added an Authenticated connection -- size: 1
IMAP DEBUG: IMAPProtocol noop
A10 NOOP
A10 OK NOOP completed
DEBUG: connection available -- size: 1
A11 SELECT INBOX
* 1 EXISTS
* 0 RECENT
* FLAGS (\Deleted \Seen \Draft \Answered \Flagged)
* OK [UIDVALIDITY 1378802425] current uidvalidity
* OK [UIDNEXT 50168] next uid
* OK [PERMANENTFLAGS (\Deleted \Seen \Draft \Answered \Flagged)] limited
A11 OK [READ-WRITE] SELECT completed
A12 SEARCH UNSEEN ALL
* SEARCH
A12 OK Search completed
A13 CLOSE
A13 OK CLOSE completed
DEBUG: added an Authenticated connection -- size: 1
IMAP DEBUG: IMAPProtocol noop
A14 NOOP
A14 OK NOOP completed
A15 LOGOUT
* BYE Have a nice day
A15 OK Logout completed
DEBUG: IMAPStore connection dead
DEBUG: IMAPStore cleanup, force false
DEBUG: IMAPStore cleanup done

服务器是hMailServer,在启用SSL和NONSSL端口的127.0.0.1上运行。

看来,我只能从邮件中获得标题,而不是正文。。

谢谢你的建议,祝你度过愉快的一天!

共有1个答案

岳出野
2023-03-14

我解决了这个问题。我遇到的错误与“无法加载BODYSTRUCTURE”错误有关(下面的链接-阅读有关IMAP复杂性的信息)。

https://java.net/projects/javamail/pages/Exchange

http://www.oracle.com/technetwork/java/javamail/faq/index.html#imapserverbug

要获得正确的正文消息,所要做的就是使用MimeMessage构造函数创建消息的副本。

// newMessages - it is array of messages from the mail inbox
// create copy of the message using MimeMessage constructor
MimeMessage message = new MimeMessage(newMessages[0]); // without it, the content was as in my first post
// get content from the mssage
Object messageContent = message.getContent();
// output it as a string
System.out.println(messageContent.toString());

问题解决了,现在我得到了我想要的和我应该得到的。唯一剩下的是,为什么SSL和非SSL消息内容之间存在差异?也许是病毒问题?

谢谢你的帮助和兴趣。

祝你有美好的一天。

 类似资料:
  • 我试图用HttpResponseMessage返回一个错误消息,但我得到的是我假定的< code>StringContent。ToString()。这是我的代码: 错误状态代码类似于401、404等。消息是纯文本的,如“照片未找到”或“错误的参数”。我的期望是,当出现错误时,用状态代码(401等)进行响应。)和一条纯文本错误消息。我收到的是HTML格式的响应,状态代码为200,内容如下: Stat

  • 我正在尝试使用TwilioAPI,我想使用消息内容作为过滤器。所以我想提出一个要求https://api.twilio.com/2010-04-01/Accounts/AccSID/Messages.json?body=“test”,它将包括所有正文中包含单词“test”的消息,无论是入站消息还是出站消息。 在Twilio文档中,我只能找到按发送日期过滤的邮件。上述用例可以通过Twilio实现吗?

  • 问题内容: 我已经配置了一个Docker容器来运行Nginx并设置/ etc / nginx / sites-available / default文件,如下所示 运行docker容器时,我在主机上映射了/ etc / ssl / certs和/ etc / ssl / private文件夹 并且映射的/ t-base / log文件夹中的nginx错误日志文件保持为空。 其次是 刚回来并说ngi

  • 我对discord.js比较陌生,我已经开始构建一个bot项目,它允许用户通过命令创建一个消息,将该消息存储在我的专用服务器上的一个隐藏通道中,然后可以通过消息ID提取所述消息。 我使用了write,它返回在隐藏通道中发送的消息的消息ID,但我完全被get命令难住了。我试过在网上搜索,但我尝试的每个方法都会返回错误,如“无法读取未定义的属性'fetch'”或“'channel'未定义”。这里是我尝

  • 几个月前,微软决定改变Http响应消息类。以前,您可以简单地将数据类型传递给构造函数,然后返回包含该数据的消息,但现在不行了。 现在,您需要使用Content属性来设置消息的内容。问题是它属于HttpContent类型,我似乎找不到一种方法将字符串转换为HttpContent。 有人知道如何处理这个问题吗?谢谢。

  • 我有一个ASP.NET的MVC WEB API。出于几个原因(因为没有授权而重定向...),我不能只使用一个简单的对象并在我的控制器方法中返回它。因此,我需要允许我重定向的Http响应消息类。 目前我正在这样做: ..将序列化为JSON的对象转换为HttpResponseMessage的内容。不知何故,我觉得有另一种更好的方法可以做到这一点。对此有什么想法吗?