首页 > 编程语言 >java mail实现POP3协议收件的Oauth认证

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

时间:2022-09-30 14:45:38浏览次数:59  
标签:pop3 java 邮箱 POP3 office365 收件 props put mail

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. 遇到过的报错

       

 

 

 

标签:pop3,java,邮箱,POP3,office365,收件,props,put,mail
From: https://www.cnblogs.com/shitechnology/p/16744844.html

相关文章

  • Java:通过标记直接跳出嵌套的循环结构
    这是我在刷面试题的时候遇到的一个使用方法,之前甚至对这种方法闻所未闻,不禁感慨自己的才疏学浅。闲话少说,直接进入正题。具体的使用就是在需要跳出的循环结构前面加一个......
  • java支持的运算符以及作用
    java语言支持如下运算符,优先级使用括号(),算数运算符:+,-,*,/,%(取余运算,或模运算),++(自增),--(自减)赋值运算符:=inta=10(把10赋值给a)关系运算符:>,<,>=,<=,==(java里等......
  • JavaScript大文件(百M以上)的上传下载实现技术
    ​最近遇见一个需要上传超大大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。在某些业务中,大文件上传是一个比较重要的交......
  • 常用注解:Java、Spring框架
    Java8SpringFramework/Boot/Web-- Java中的注解【很神奇】。ben发布于博客园虽然用过很多,但是,对其感知仍然模糊,应该是对它们的使用原理不清楚所致。本文仅整理一......
  • 【java基础】HashSet插入顺序问题
    总结:1、HashSet底层的插入是通过HashMap来实现的2、HashSet并不按照插入的顺序存储,它是无序的3、LinkedHashSet中的元素可以按照它们插入规则集的顺序提取@Test......
  • java 多线程
    线程的状态:New、Runnable、Blocked、Waiting、Timedwaiting、Terminated  newThread()——>New、start()——>Runnable、等待资源——>Blocked、wait()——>waiting......
  • PowerDesigner提示Could not Initialize JavaVM!
    PowerDesigner逆向mysql数据库报CouldnotInitializeJavaVM!提示,是因为powerdesigner基于32位JVM的原因。解决办法:安装32位的JDK或者安装mysql的ODBC驱动(重要提示:务......
  • Install4j for Mac(java安装程序创建器)
    Install4j版是一款很不错的java安装文件生成工具,提供强大的脚本编辑器、命令行编辑器、安装包设计IDE、JRE管理和部署等功能,主要用于生成java应用程序本地化的安装和应用程......
  • 用IO多路复用实现 nginx 静态资源代理(C/Java/Golang)
    用IO多路复用实现nginx静态资源代理(C/Java/Golang)效果展示代理HTML代理图片注意,静态资源代理基于HTTP,可以了解上一篇文章:几十行代码使用TCP简单实现HTT......
  • Java 模拟Terminal连接 Linux Console 源代码
    代码和效果如下,已经转换java文件为exe文件,注意要在Pom文件里面添加依赖。  packagecom.javassh3.javassh3;/*-*-mode:java;c-basic-offset:2;indent-tabs-mode:n......