oauth-2.0 使用JavaMail通过oauth2从www.example.com提取电子邮件时出现Pop3协议错误oulook.com

v8wbuo2f  于 2022-10-31  发布在  Java
关注(0)|答案(2)|浏览(375)

我正尝试使用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。
我还看到了重新添加令牌请求的范围的建议,但这对我来说不起作用,因为微软认为这是一个坏的请求。
有什么想法,什么可能会出错?或增加日志/捕获,以帮助?

c9x0cxw0

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版本中是否包含了这个修复。
但我又加了一句

properties.put("mail.pop3s.auth.xoauth2.two.line.authentication.format", "true");

然后我就再也看不到“协议错误”了。
但是,当我尝试使用访问令牌进行连接时,出现“-ERR身份验证失败:未知用户名或密码错误。”错误。
我解码了base64格式的auth字符串,并仔细检查了用户名和访问令牌,它们都是正确的。我不知道是哪里出了问题,也不知道是否需要为POP3 Oauth2连接进行额外的设置。

编辑1:

由于我为IMAP和POP3都设置了令牌范围,所以我尝试在IMAP中使用完全相同的令牌,一切都正常。我还使用openSSL进行了相同的测试,得到了相同的结果:相同的访问令牌适用于IMAP,但不适用于POP3。
我想微软的POP3 Oauth2支持仍然有一些问题,有人能证实这一点吗?

emeijp43

emeijp432#

自己的回答既然我不能发表意见:
Outlook需要answer by JeremyS中的两行身份验证设置。
另一件需要做的事情是在Outlook帐户设置中允许POP。转到Mail / Sync email / Pop and IMAP并检查是否允许应用程序使用POP,默认情况下不允许。如果不允许,您将得到帮助不大的“-ERR身份验证失败:未知的用户名或错误的密码。”错误。为我工作的雅加达邮件1.6.7。

相关问题