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

使用JavaMail从oulook.com提取电子邮件时的Pop3协议错误

封烈
2023-03-14

我正在尝试使用JavaMail 1.6.2使用带有POP3和新的OAUTH2集成的守护进程服务从outlook.com中提取电子邮件。

我已经成功地使用OAUTH2和IMAPS进行了身份验证,并且我可以使用带有普通身份验证的POP3来提取电子邮件,因此我认为我的OAUTH2作用域、azure注册应用程序和客户端电子邮件都有正确的设置。

我正在使用的提取电子邮件的范围如下所示,返回的令牌反映了POP范围也已授予:

  • <代码>https://outlook.office.com/POP.AccessAsUser.Alloffline\u访问

我一直看到的例外是:

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。

我还看到了将作用域重新添加到令牌请求的建议,但这对我来说并不奏效,因为Microsoft认为这是一个错误的请求。

对可能出现的问题有什么想法吗?或者增加日志记录/捕获以提供帮助?

共有1个答案

能正青
2023-03-14

当我尝试使用JakartaMail 2.0.1并使用POP3 XOAUTH2连接到outlook.office365.com时,我实际上遇到了同样的问题。

“协议错误”是由github问题中讨论的Microsoft双线身份验证问题引起的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。

我假设Microsoft POP3 Oaut2支持仍然存在一些问题,有人能证实这一点吗?

 类似资料:
  • 问题内容: 我正在尝试访问我的Gmail帐户,并从中检索所有未读电子邮件的信息。 我在引用了许多链接之后编写了代码。我提供一些链接供参考。 使用Java通过GMail帐户发送和接收电子邮件 使用JavaMailAPI接收邮件的Java代码 为了测试我的代码,我创建了一个Gmail帐户。因此,我收到了来自Gmail的4封邮件。检查邮件数量后,我运行我的应用程序。那显示了正确的结果。4封未读邮件。显示

  • 我们收到了正确数量的已删除邮件。但从gmail帐户中,邮件不会被删除。expunge()方法不适用于pop3。pop3是否有类似的方法永久删除电子邮件?我们还设置了文件夹。关闭(真) 代码如下-

  • 问题内容: 我正在使用javamail,但无法从Gmail电子邮件中获取HTML。我有以下内容: 上面所有方法都可以,但是我无法打印或获取实际的HTML或文本电子邮件。我只是得到某种InputStream,如何轻松处理以获得原始的电子邮件HTML? 我也尝试遍历消息,但这并没有使我走得太远: } 谢谢大家的帮助。 问题答案: 该对象包含电子邮件的正文。您需要阅读整个流,才能阅读整个消息。例如,该S

  • 问题内容: 我正在尝试在JavaMail API的帮助下通过IMAP访问来自Gmail帐户的电子邮件。我想知道为什么代码对一个电子邮件帐户有效,而对另一个电子邮件帐户无效。 我可以访问两个电子邮件帐户的文件夹。但是对于其中一个电子邮件帐户,无法访问其他文件夹,例如,它将引发异常。有人可以解释出什么问题了吗? 先感谢您。 这是代码: 问题答案: 是否有一个帐户使用非英语用户界面? Gmail文件夹名

  • 我在试着从他的电子邮件里得到一个用户名。我知道有一些简单的方法可以实现这一点,但它让我怀疑我是否可以只使用Regex来实现这一点。 让我们假设用户输入以下电子邮件:user.sure_name123@mail.co 从该字符串中,我想提取:user sure name

  • 目前,我的代码使用IMAP(imaps)和JavaMail访问我的Gmail收件箱,目的是阅读从最新到最旧发送给我自己的电子邮件,识别哪些电子邮件具有. zip或. xap格式的附件。如果找到,电子邮件的主题会显示出来,并询问我是否要下载附件。 如果我单击否,它会继续搜索。如果我单击是,它会调用createFolder方法来创建一个目录,将附件保存在那里,然后提取它。 问题:我收件箱中最近的一封电