Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >微软OAuth2 SMTP

微软OAuth2 SMTP
EN

Stack Overflow用户
提问于 2021-10-15 08:57:24
回答 1查看 2.7K关注 0票数 1

我正在尝试构建一个应用程序,从我的Microsoft电子邮件帐户发送电子邮件,在Python中使用SMTP发送与OAuth2一起进行身份验证。身份验证不起作用,我得到了reply: retcode (535); Msg: b'5.7.3 Authentication unsuccessful [LO2P265CA0061.GBRP265.PROD.OUTLOOK.COM]'

我已经在azure上创建了一个AAD应用程序,并下载了在设置凭据之后提供的示例烧瓶应用程序,据我所知,它就是这个存储库

我使用了这个应用程序(从带有我的秘密的AAD门户下载),并尝试使用给定的令牌进行SMTP身份验证,使用的信息来自

登录到我的办公室电子邮件帐户工作,/graphcall也工作。但是SMTP身份验证不起作用,我正在从它接收reply: retcode (535); Msg: b'5.7.3 Authentication unsuccessful [LO2P265CA0061.GBRP265.PROD.OUTLOOK.COM]'

我所要求的令牌的范围是SCOPE = ["User.ReadBasic.All", "https://outlook.office.com/SMTP.Send"],应用程序在配置文件中打开了SMTP.send

下面是一个扩展smtplib.SMTP的类,我是基于这些类编写的:

代码语言:javascript
运行
AI代码解释
复制
import smtplib
import base64


class MicrosoftSMTP(smtplib.SMTP):
    def __init__(self, host="smtp.office365.com", port=587, **kwargs):
        super().__init__(host=host, port=port, **kwargs)

    @staticmethod
    def encode_auth_token(username, token):
        just_a_str = f"user={username}\x01auth=Bearer {token}\x01\x01"
        xoauth2_token = base64.b64encode(just_a_str.encode())

        return xoauth2_token

    def authenticate(self, username, token):
        self.helo()

        # first step, we
        code, msg = self.docmd("auth", "XOAUTH2")
        if code != 334:
            raise Exception(msg.decode())

        # send the token
        self.send(self.encode_auth_token(username, token))

以及连接到应用程序的凭据的代码,并在其中添加一个页面,在其中显示令牌json以进行正常检查:

代码语言:javascript
运行
AI代码解释
复制
@app.route("/send_to_self")
def send_to_self():
    token = _get_token_from_cache(app_config.SCOPE)
    if not token:
        return redirect(url_for("login"))

    # connect to the server
    connection = MicrosoftSMTP()
    connection.set_debuglevel(True)  # for output
    connection.starttls()
    connection.authenticate(
        # same as session["user"]["preferred_username"]
        token["id_token_claims"]["preferred_username"],
        token["access_token"],
    )

    # ... would write an email here with connection.sendmail( ... )

    connection.quit()

    return render_template(
        "send_to_self.html",
        data=token,
        data_session=session["flow"],
        data_user=session["user"],
    )

身份验证失败了,下面是完整的日志:

代码语言:javascript
运行
AI代码解释
复制
send: 'ehlo 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa\r\n'
reply: b'250-LO2P265CA0516.outlook.office365.com Hello [<A.GENERAL.IP>]\r\n'
reply: b'250-SIZE 157286400\r\n'
reply: b'250-PIPELINING\r\n'
reply: b'250-DSN\r\n'
reply: b'250-ENHANCEDSTATUSCODES\r\n'
reply: b'250-STARTTLS\r\n'
reply: b'250-8BITMIME\r\n'
reply: b'250-BINARYMIME\r\n'
reply: b'250-CHUNKING\r\n'
reply: b'250 SMTPUTF8\r\n'
reply: retcode (250); Msg: b'LO2P265CA0516.outlook.office365.com Hello [<A.GENERAL.IP>]\nSIZE 157286400\nPIPELINING\nDSN\nENHANCEDSTATUSCODES\nSTARTTLS\n8BITMIME\nBINARYMIME\nCHUNKING\nSMTPUTF8'
send: 'STARTTLS\r\n'
reply: b'220 2.0.0 SMTP server ready\r\n'
reply: retcode (220); Msg: b'2.0.0 SMTP server ready'
send: 'helo 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa\r\n'
reply: b'250 LO2P265CA0516.outlook.office365.com Hello [<A.GENERAL.IP>]\r\n'
reply: retcode (250); Msg: b'LO2P265CA0516.outlook.office365.com Hello [<A.GENERAL.IP>]'
send: 'auth XOAUTH2\r\n'
reply: b'334 \r\n'
reply: retcode (334); Msg: b''
send: b'dX......EB'
send: 'quit\r\n'
reply: b'535 5.7.3 Authentication unsuccessful [LO2P265CA0516.GBRP265.PROD.OUTLOOK.COM]\r\n'
reply: retcode (535); Msg: b'5.7.3 Authentication unsuccessful [LO2P265CA0516.GBRP265.PROD.OUTLOOK.COM]'

我说过的话:

  1. 我们允许此邮箱使用SMTP。
  2. 令牌允许SMTP。
  3. XOAUTH2令牌编码器的输出与网站上示例的输出相匹配

令牌数据如下所示,删除了令牌和用户名

代码语言:javascript
运行
AI代码解释
复制
{
    "access_token": "ey<...>aw",
    "client_info": "ey<...>In0",
    "expires_in": 3599,
    "ext_expires_in": 3599,
    "id_token": "ey<...>jQ",
    "id_token_claims": {
        "aud": "8<...>9",
        "exp": 1634319637,
        "iat": 1634315737,
        "iss": "https://login.microsoftonline.com/5<...>1/v2.0",
        "name": "<Name of the user>",
        "nbf": 1634315737,
        "nonce": "c1<...>d0",
        "oid": "cd<...>1b",
        "preferred_username": "user.name@company.com",
        "rh": "0.A<...>As.",
        "sub": "2w<...>ww",
        "tid": "50<...>31",
        "uti": "8W<...>AA",
        "ver": "2.0"
    },
    "refresh_token": "0.A<...>4Y",
    "scope": "openid profile SMTP.Send User.ReadBasic.All email",
    "token_type": "Bearer"
}
EN

回答 1

Stack Overflow用户

发布于 2021-10-24 04:01:20

  1. 通过将“启用安全性默认值”切换到“否”,禁用Azure Security默认设置:
代码语言:javascript
运行
AI代码解释
复制
- Sign in to the Azure portal as a security administrator, conditional access administrator, or Global administrator.
- Browse to Azure Active Directory -> Properties.
- Select Manage security defaults.
- Set the Enable security defaults toggle to No.
- Select save.
  1. 将用户排除在阻止遗留身份验证的条件访问策略之外:
代码语言:javascript
运行
AI代码解释
复制
- Sign in to the Azure portal as a Security administrator, Conditional Access administrator, or Global administrator.
- Browse to Azure Active Directory > Security > Conditional Access.
- In the policy that blocks legacy Authentication, exclude the mailbox being used under Users and Groups > Exclude.
- Select Save.

您应该使用SMTP服务器:带有apicalsolutions-com.mail.protection.outlook.com端口25的。当用户使用您域的任何用户时。即使它没有链接邮箱,您也可以用来登录。

阅读更多的这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69588201

复制
相关文章
微软邮箱设置smtp_邮件服务器怎么设置
Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 – TFS 2013
全栈程序员站长
2022/11/09
7.8K0
微软邮箱设置smtp_邮件服务器怎么设置
SMTP 扫描
如果和 POP3 / IMAP / Exchange 混在一起就更加难以理解了,接下来我就着重介绍一下这几个的区别
意大利的猫
2020/08/20
2.3K0
SMTP协议
> 参考文献 [RFC 5321](https://www.rfc-editor.org/rfc/rfc5321.txt "https://www.rfc-editor.org/rfc/rfc5321.txt")
孤鸿
2022/09/23
1.6K0
smtp服务器配置_smtp 服务器
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
9.1K0
[快学Python3]SMTP发送邮件
概述 在本文中,主要介绍使用smtplib进行文本格式、HTML格式和带附件的邮件发送处理。 导入smtplib模块 import smtplib 关键函数说明 # 创建smtp对象 smtp = smtplib.SMTP([host [, port [, localhost]]] ) # 参数说明 # host: smtp服务地址,例如126邮箱的是:smtp.126.com # port: smtp服务端口 # localhost: 如果你的smtp服务在本机,则只需指定localhost即可 #
苦叶子
2018/04/09
4K0
[快学Python3]SMTP发送邮件
SMTP协议详解
电子邮件有三个主要的组成部分:用户代理,邮件服务器和简单的邮件传输协议(SMTP),我们几天主要来说一下在应用层中的SMTP协议,它使用TCP可靠数据传输服务,像大多数应用层协议一样,SMTP也有俩个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端,每台邮件服务器既运行SMTP服务器端也运行SMTP客户端。
秋名山码神
2022/12/13
1.6K0
python SMTP邮件发送
本例使用的时python2.7环境,python3的操作应该也是差不多的。 需要用到smtplib和email两个包。
py3study
2020/01/16
1.8K0
快速建立 smtp 服务
一般情况下,我们会使用各种云厂商或者第三方提供的 smtp 邮件服务,来发送邮件,如发送注册验证码,找回密码邮件等等。但有时我们想自建 smtp 服务来自己发送邮件,避免一些敏感信息被三方服务屏蔽。所以本文记录如何快速构建一个属于自己的 smtp 服务来发送邮件。
LinkinStar
2022/10/28
1.7K0
wordpress邮箱发送smtp插件 Easy WP SMTP配置教程
wordpress邮箱发送smtp插件 Easy WP SMTP配置教程 新建了几个wordpress站点,这几天解决了邮件发送问题。
用户7146828
2021/08/09
3.1K0
smtp邮件服务器配置,配置SMTP服务器[通俗易懂]
的全称是“SimpleMailTransferProtocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。
全栈程序员站长
2022/11/09
10.5K0
smtp邮件服务器配置,配置SMTP服务器[通俗易懂]
SMTP的相关命令
邮件的发送,主要是通过SMTP协议来实现的。SMTP协议最早在RFC 821(1982年)中定义,最后更新是在RFC 5321(2008年)中,更新中包含了扩展SMTP(ESMTP)。
大江小浪
2018/07/25
2.7K0
SMTP的相关命令
OAuth2 图解
本文简单的描述出了 OAuth2 工作背景,看完后可以轻松理解 OAuth2 是用来解决什么问题的。
dys
2020/06/18
1K0
OAuth2 图解
如何添加smtp服务器_smtp服务器设置
在现在这个时代中,人们传输信息基本上都是用邮件传输,那么你知道电脑之间是怎么用邮件传输的么。
全栈程序员站长
2022/09/27
4.5K0
如何添加smtp服务器_smtp服务器设置
速读原著-TCP/IP(SMTP协议)
两个M TA之间用NVT ASCII进行通信。客户向服务器发出命令,服务器用数字应答码和可选的人可读字符串进行响应。这与上一章的 F T P类似。
cwl_java
2020/03/18
1K0
Python SMTP 发送邮件方法
在很多时候,使用 Python 发送邮件可能没有办法使用邮件服务器提供的 API,因为不是所有的邮件服务商都会提供 API 供客户使用的。
HoneyMoose
2021/03/24
1.4K0
Python SMTP 发送邮件方法
WordPress SMTP发送邮件设置
前几天设置了ssl证书,用的是Let’s Encrypt免费ssl证书设置好了才发现不能发送邮件,这点事我不能接受的,以前用的国外的VPS一直没有问题,搬至腾讯云就不能用mail()函数发邮件,刚开始一直以为是我的Exim4(debian默认的就是这个)配置有问题,然后就开始重装centos,装好以后还是不行,一直以为配置有问题,看日志发现不通,然后突然想到阿里云屏蔽25端口,是不是腾讯云也屏蔽了25端口。结果不出意料真的屏蔽了。害我重装了好几次申请Let’s Encrypt免费证书的次数也用光了。
爱游博客
2019/08/07
3.1K0
WordPress SMTP发送邮件设置
Windows 使用 Telnet 测试 smtp
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
为为为什么
2022/08/06
2.4K0
Windows 使用 Telnet 测试 smtp
SMTP服务器未设置_smtp服务器怎么填
什么是smtp服务器呢?smtp服务器是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。不过很多用户都不知道怎么去打开这个smtp服务器,针对这个问题,接下来小编给大家做详细介绍。
全栈程序员站长
2022/11/10
4.1K0
Python 测试 SMTP 服务
SMTP 服务用于转发邮件,本文记录 Python 测试SMTP的方法。 SMTP SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 核心语法 创建 SMTP 对象 语法如下: import smtplib smtpObj = smtplib.SMTP( [host [, po
为为为什么
2022/08/06
1.4K0
Python 测试 SMTP 服务
【WEB安全】SMTP注入
blocks|key|de7d7|type|unstyled|text|## 漏洞介绍
用户1709153
2023/06/06
5901

相似问题

微软Oauth2 403被禁止

20

微软从oauth2登录问题

12

微软oauth2 (代表后台任务)

13

微软中的oauth2连接

14

使用Oauth2 Gmail连接到SMTP

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文