我正在尝试使用JavaMail 1.6.2使用带有POP3和新的OAUTH2集成的守护进程服务从outlook.com中提取电子邮件。
我已经成功地使用OAUTH2和IMAPS进行了身份验证,并且我可以使用带有普通身份验证的POP3来提取电子邮件,因此我认为我的OAUTH2作用域、azure注册应用程序和客户端电子邮件都有正确的设置。
我正在使用的提取电子邮件的范围如下所示,返回的令牌反映了POP范围也已授予:
我一直看到的例外是:
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认为这是一个错误的请求。
对可能出现的问题有什么想法吗?或者增加日志记录/捕获以提供帮助?
当我尝试使用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方法来创建一个目录,将附件保存在那里,然后提取它。 问题:我收件箱中最近的一封电