使用现代身份验证(OAuth)来连接POP、IMAP或SMTP
我的博客园:https://www.cnblogs.com/CQman/
Weixin ID VNET_O365Support
About Feature 由世纪互联运营的 Office 365 云服务技术支持
2022-07-10 08:45 Posted on 北京
我们之前已经向大家发布了Exchange Online 服务即将停用基本身份验证的说明和提醒。
Exchange Online服务即将停用基本身份验证
Office365,公众号:Office365云服务技术支持Exchange Online服务即将停用基本身份验证
而在诸多实际的生产场景中,绝大多数网络打印机厂商、OA 及其他集成系统、邮件客户端还不支持通过 OAuth 认证方式连接 POP、IMAP 或 SMTP。随着停用基本身份验证的时间临近,我们敦促和建议广大接口厂商和系统集成合作伙伴,尽快改用 OAuth 认证方式来连接 POP、IMAP 和 SMTP。
针对这种情况,今天就向大家说明一下,如何使用现代身份验证(OAuth) 来连接 POP、IMAP 和 SMTP。请注意,以下说明只是针对各大厂商对代码进行修改,一般用户无法直接使用 OAuth 方式来连接 POP、SMTP 等协议。
准备工作
如果您还不了解什么是 OAuth,请参考我们之前发布的文档 使用现代身份验证(OAuth)调用 EWS 服务 中的关于 OAuth 是什么 的部分说明:
使用现代身份验证(OAuth)调用 EWS 服务
Robin Dai,公众号:Office365云服务技术支持使用现代身份验证(OAuth)调用 EWS 服务
如果您对 OAuth 申请令牌凭证已经有了一定的了解,那么请继续以下的步骤。
首先注册一个 Azure AD 应用:
通过浏览器访问并登录以下网址:
https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps点击“新注册”,并输入名称,来注册出一个应用。
在证书和密码中创建一个客户端密码并记住这个密码

在API权限中添加权限:
点击添加权限
点击 Microsoft Graph

选择委托的权限中的 SMTP.Send 、POP.AccessAsUser.All 和 IMAP.AccessAsUser.All 勾选并保存。
在 API 权限中点击代表***授予管理员权限

请求OAuth令牌
请求OAuth令牌,是一个关键步骤。由于 Azure AD 的终结点本身存在1.0和2.0两个版本,在这里,我们推荐大家使用1.0版本,以避免在使用2.0版本时,错误的scope参数而导致请求到无效的令牌。
由于该令牌必须有用户参与,因此无法使用客户端密码的方式(grant_type=client_credential)调用,而仅能使用代码授予(grant_type=authorization_code)或用户密码凭据授予(grant_type=password)的方式获取。后面两者的区别在于代码授予一定会弹出要求用户登录的页面,而 用户密码凭据授予可以保持静默登录,但安全性将打折扣。
请求内容如下(以用户密码凭据授予为例,请将自己的租户 ID、注册应用 ID、客户端密码、用户名和密码替换示例中的{tenant ID}、{App ID}、{Client Secret}、user@abc.com和{user password}。):
HTTP
POST https://login.partner.microsoftonline.cn/{tenant ID}/oauth2/token HTTP 1.1
Host: login.partner.microsoftonline.cn
Content-Type: application/x-www-form-urlencoded
client_id={App ID}
&client_secret={Client Secret}
&grant_type=password
&resource=https%3A%2F%2Fpartner.outlook.cn
&username=user%40abc.com
&password={user password}
cURL
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'client_id={App ID}&resource=https%3A%2F%2Fpartner.outlook.cn%2F.default&client_secret={Client Secret}&grant_type=password&username=user%40abc.com&password={user password}' 'https://login.partner.microsoftonline.cn/{tenant}/oauth2/token'
使用OAuth令牌进行连接
在您得到 OAuth令牌后,您需要以 SASL XOAUTH2 的格式来转换和发送凭据。SASL XOAUTH2 以以下格式将用户名、访问令牌编码在一起:
Text
base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")
^A 表示 Control + A () %x01 。
例如,使用访问令牌eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlBOGtWal9hcXpVOWAA(此处缩略了很长一部分),访问的 user@abc.com, SASL XOAUTH2 格式为:
Text
base64("user=user@abc.com^Aauth=Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlBOGtWal9hcXpVOWAA^A^A")
在 base64 编码后,这会转换为以下字符串:
Text
dXNlcj11c2VyQGFiYy5jb21eQWF1dGg9QmVhcmVyIGV5SjBlWEFpT2lKS1YxUWlMQ0p1YjI1alpTSTZJamxCT0d0V2FsOWhjWHBWT1dBQV5BXkE=
在连接不同协议时,连接的形式略有不同,具体请参考:
POP:
Text
AUTH XOAUTH2
<base64 string in XOAUTH2 format>
IMAP:
Text
AUTHENTICATE XOAUTH2 <base64 string in XOAUTH2 format>
SMTP:
Text
AUTH XOAUTH2 <base64 string in XOAUTH2 format>
目前就我们的测试,Java.mail 和 Mailkit 库可以支持SASL XOAUTH2方式的连接。以C# 调用 Mailkit 库,通过OAuth方式连接SMTP发送邮件为例,参考代码如下(已略过请求令牌的代码):
C#
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Net;
usingMailKit.Net.Smtp;
usingMailKit.Security;
usingMimeKit;
usingMailKit;
namespaceOAuth2forMail
{
classProgram
{
staticvoidMain(string[] args)
{
varp = newProgram();
p.Sendmm();
}
voidSendmm()
{
MimeMessagemm = newMimeMessage();
mm.To.Add(newMailboxAddress("My Customer", "customer@abc.com"));
mm.From.Add(newMailboxAddress("Boss Wang", "user@abc.com"));
varbuilder = newBodyBuilder();
builder.TextBody = @"This is a test mail.";
mm.Subject = "Test to send mail with OAuth2";
mm.Body = builder.ToMessageBody();
SaslMechanismOAuth2oauth2 = newSaslMechanismOAuth2("user@abc.com",
"eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlBOGtWal9hcXpVOWAA"
);
using (varclient = newSmtpClient(newProtocolLogger("smtp.log")))
{
client.Connect("smtp.partner.outlook.cn", 587, SecureSocketOptions.StartTls);
client.Authenticate(oauth2);
try
{
client.Send(mm);
Console.WriteLine("send success");
client.Disconnect(true);
}
catch (Exceptionex)
{
Console.WriteLine(ex.Message.ToString());
}
}
}
}
}
综上,建议各大厂商、开发人员尽快修改您的代码,以便支持OAuth的方式来连接POP、IMAP和SMTP协议。


use this Mini Program
: , . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看
使用现代身份验证(OAuth)来连接POP、IMAP或SMTP的更多相关文章
- 138企业邮箱pop/imap和smtp服务器地址
如果客户端设置的是pop模式:接收邮件服务器(pop):pop.138mail.net ,端口号是110 (如果勾选了SSL,端口号则变为995)发送邮件服务器(smtp):smtp.138mail. ...
- mac下远程win8.1时提示"桌面连接无法验证您希望连接的计算机的身份"的解决办法
在os x下使用远程桌面到win8.1,总出现“远程桌面连接无法验证您希望连接的计算机的身份”的提示. 解决方法:1.网上各种解释,包括防火墙是否打开,是否去掉“仅允许运行使用网络级别身份验证的远程计 ...
- windows身份验证模式和SQL server身份验证模式 有什么不同
两个验证方式是有明显不同的. 主要集中在信任连接和非信任连接. windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不判断sa密码,而仅根据用户的windows权限来进行身份验证 ...
- Windows身份验证和混合验证的差别
两个验证方式的不同主要集中在信任连接和非信任连接. windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不推断sapassword.而仅依据用户的windows权 ...
- 在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client
在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client 阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你 ...
- [ASP.NET]SQL Server 连接字符串和身份验证
SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1; Property ...
- SQL Server 连接字符串和身份验证详解
SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1; ...
- SQL Server 连接字符串和身份验证
SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1;P ...
- 远程连接身份验证错误,又找不到加密Oracle修正
远程连接服务器出现了错误,错误信息为:远程连接身份验证错误,又找不到加密Oracle修正. 服务器系统:Windows Server2016 客户端系统:Windows10家庭版和专业版 出错原因 ...
- 20180726 - Windows 10 Pro 下远程桌面连接提示“出现身份验证错误”
问题:Windows 10 Pro 下远程桌面连接提示“出现身份验证错误” [Window Title]远程桌面连接 [Content]出现身份验证错误.要求的函数不受支持 远程计算机: 192.16 ...
随机推荐
- .NET Core开发实战(第28课:工作单元模式(UnitOfWork):管理好你的事务)--学习笔记
28 | 工作单元模式(UnitOfWork):管理好你的事务 工作单元模式有如下几个特性: 1.使用同一上下文 2.跟踪实体的状态 3.保障事务一致性 我们对实体的操作,最终的状态都是应该如实保存到 ...
- 剑指Offer07 重建二叉树
剑指 Offer 07. 重建二叉树 前置概念: 前序:访问根节点,先序遍历左子树,先序遍历右子树: 中序:中序遍历左子树,访问根节点,中序遍历右子树: 后序:后序遍历左子树,后序遍历右子树,访问根节 ...
- 轻松玩转makefile | 变量与模式
前言 本文通过简单的几个示例,以及对同一个Makefile进行几个版本的迭代,帮助快速的理解变量和模式规则的使用. 1.回顾 在上一篇文章中,我们使用Makefile编译fun.c和main.c这两个 ...
- Centos8 安装 MySQL8.0.26
下载 访问 https://dev.mysql.com/downloads/mysql/ 选择 Red Hat Enterprise Linux / Oracle Linux 选择 Red Hat E ...
- thymeleaf利用fragment解决html页面间获取context-path问题
问题说明 我使用spring boot+thymeleaf做了个项目,那前台页面都是html,里面有各种api调用和路径跳转. 大家都知道这些路径不能写死,为保证任何情况下路径的正确性,一般都是这种格 ...
- Python之凯撒加密
凯撒加密介绍 在密码学中,恺撒密码是一种最简单且最广为人知的加密技术. 它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文. 例,当偏移量是3的时 ...
- 使用原生 cookieStore 方法,让 Cookie 操作更简单
前言 对于前端来讲,我们在操作cookie时往往都是基于document.cookie,但它有一个缺点就是操作复杂,它并没有像localStorage那样提供一些get或set等方法供我们使用.对与c ...
- 【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
问题描述 在Azure活动目录中的应用注册,给应用添加API权限时,SecurityEvents.Read.All和IdentityRiskEvent两个权限,在Microsoft graph中找不到 ...
- 钉钉机器人自动关联 GitHub 发送 approval prs
摘要:用技术来解决 PM 枯燥的 approval pr 工作,本文将阐述如何自动化获取 GitHub Organization 下各个 repo 待 merge 的 pull requests 并通 ...
- ExoPlayer播放流程解析
ExoPlayer的播放解析流程如下(以音频为例): 注意: 1.LoadControl.shouldContinueLoading控制是否继续加载. 2.调用setPlayWhenReady(tru ...