我正尝试使用JavaMail 1.6.2,outlook.com通过一个带有POP3和新的OAUTH2集成的守护程序服务从www.example.com提取电子邮件。
我已经能够成功地使用OAUTH2和IMAPS进行身份验证,并且我可以使用POP3通过普通身份验证提取电子邮件,因此我认为我的OAUTH2作用域、Azure注册应用程序和客户端电子邮件的设置是正确的。
我正在使用的提取电子邮件的作用域如下所示,返回的令牌反映了POP作用域也被授予:
https://outlook.office.com/POP.AccessAsUser.All
https://outlook.office.com/POP.AccessAsUser.All
个
我一贯看到的例外是:
javax.mail.AuthenticationFailedException: Protocol error. Connection is closed. 10
at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:215)
at javax.mail.Service.connect(Service.java:366)
邮件调试日志在抛出异常之前显示此信息:
com.sun.mail.pop3.protocol : +OK The Microsoft Exchange POP3 service is ready. [<long string is here>]
CAPA
+OK
: TOP
: UIDL
: SASL PLAIN XOAUTH2
: USER
.
authentication command trace suppressed
authentication command failed
QUIT
<EOF>
我的当前代码如下:
properties.put("mail.store.protocol", "pop3s");
properties.put("mail.pop3s.host", "outlook.office365.com");
properties.put("mail.pop3s.port", "995");
properties.put("mail.pop3s.ssl.enable", "true");
properties.put("mail.pop3s.connectiontimeout", 5000);
properties.put("mail.pop3s.timeout", 5000);
properties.put("mail.pop3s.partialfetch", false);
properties.put("mail.pop3s.auth.mechanisms", "XOAUTH2");
properties.put("mail.pop3.sasl.enable", "true");
properties.put("mail.pop3.sasl.mechanisms", "XOAUTH2");
properties.put("mail.pop3.auth.login.disable", "true");
properties.put("mail.pop3.auth.plain.disable", "true");
properties.put("mail.pop3s.auth.plain.disable", "true");
properties.put("mail.debug", "true");
Session session = Session.getInstance(properties);
session.setDebug(true);
Store store = session.getStore("pop3s");
store.connect("outlook.office365.com", email, accessToken);
某些字段可能会过多;我还没有削减什么是相关的,但这种配置工程的IMAPS,而不是POP3。
我还看到了重新添加令牌请求的范围的建议,但这对我来说不起作用,因为微软认为这是一个坏的请求。
有什么想法,什么可能会出错?或增加日志/捕获,以帮助?
2条答案
按热度按时间c9x0cxw01#
当我尝试使用JakartaMail 2.0.1并使用POP3 XOAUTH 2连接到www.example.com时,实际上也遇到了同样的问题outlook.office365.com。
“协议错误”是由Microsoft两行身份验证问题引起的,该问题已在github问题https://github.com/eclipse-ee4j/mail/issues/461中讨论
相关的修复在https://github.com/eclipse-ee4j/mail/pull/477中,我不确定最新的JavaMail/JakartaMail版本中是否包含了这个修复。
但我又加了一句
然后我就再也看不到“协议错误”了。
但是,当我尝试使用访问令牌进行连接时,出现“-ERR身份验证失败:未知用户名或密码错误。”错误。
我解码了base64格式的auth字符串,并仔细检查了用户名和访问令牌,它们都是正确的。我不知道是哪里出了问题,也不知道是否需要为POP3 Oauth2连接进行额外的设置。
编辑1:
由于我为IMAP和POP3都设置了令牌范围,所以我尝试在IMAP中使用完全相同的令牌,一切都正常。我还使用openSSL进行了相同的测试,得到了相同的结果:相同的访问令牌适用于IMAP,但不适用于POP3。
我想微软的POP3 Oauth2支持仍然有一些问题,有人能证实这一点吗?
emeijp432#
自己的回答既然我不能发表意见:
Outlook需要answer by JeremyS中的两行身份验证设置。
另一件需要做的事情是在Outlook帐户设置中允许POP。转到
Mail / Sync email / Pop and IMAP
并检查是否允许应用程序使用POP,默认情况下不允许。如果不允许,您将得到帮助不大的“-ERR身份验证失败:未知的用户名或错误的密码。”错误。为我工作的雅加达邮件1.6.7。