java mail实现POP3协议收件的Oauth认证

1. 背景

     有team使用了office365的国际版邮箱进行收发邮件,但是微软会在十月一后关闭基本身份认证,选择使用OAuth 身份验证连接 IMAP、POP 或 SMTP 协议,微软给出了相关的文档链接去实现这个功能。

2. 准备工作

    之前有做过世纪互联的office365邮箱进行收发邮件,他们是使用graph的API去实现这个功能,当初选择的方式是通过他新提供的接口去实现邮箱的收发包括对邮件后续的处理。所以一开始以为会跟这个类似,但没想到的是没有这么复杂,代码不需要很大的重构,可是经历了很多坑,花费了很多时间。。。

3. 具体步骤

       首先你需要在Azure平台上注册应用,拿到相关的参数(也就是tenantId,clientId,cilentSercet),但是对于我们来说,这是对方提供给我们的,所以这一块不是我们考虑的问题。(实际上是因为我自己注册了微软邮箱,但是个人邮箱并没有可选择配置office365邮箱相关的地方,只有企业邮箱才能看到)。因为使用的是POP3协议去收件,根据官方的文档,所以需要在连接邮件服务器的时候添加两行代码。

 

具体代码如下

Properties props = new Properties();
props.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.pop3.host", server);
props.put("mail.pop3.port", port + "");
props.put("mail.pop3.ssl.trust", "*");
//微软文档中认证相关的那两行
props.put("mail.pop3.auth.mechanisms", "XOAUTH2");
props.put("mail.pop3.auth.xoauth2.two.line.authentication.format", "true");

Session session = Session.getInstance(props);
//输出邮件服务器debug信息
session.setDebugOut(System.out);
Store store
= session.getStore("pop3"); store.connect(server, userName, token); log.debug("-----pop3 connect success-------");

       这里有几点需要注意的,第一个获取token,按照微软文档的说明来就可以了。如果用的是outlook.office365邮箱,那么使用的scope要用https://outlook.office365.com/.default。第二点,文档中有说对拿到的token跟username等一些参数进行拼接然后base64编码,使用最终编码后的数据,其实这里做的操作也就是把token跟username关联起来,那么这一步可以省略。因为在后面的connect方法中,有一种传参就可以做到了这一点,所以直接使用token就行了。最最重要的一点!!!不要使用javax.mail的依赖,换成jakarta.mail这个依赖(2.0.1版本)。这里是真的坑,中间各种报错,就是因为这个依赖的问题。

4. 遇到过的报错

       

 

 

 

posted @ 2022-09-30 14:36  写字楼间写字员  阅读(846)  评论(1编辑  收藏  举报