You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用MFA的Office 365 SMTP认证发送邮件遇条件访问拦截问题

问题描述

已完成以下配置用于通过Microsoft SMTP发送邮件:

  • 为目标用户启用Secure SMTP连接
  • 创建了App Password

测试代码如下:

import smtplib

FROM = "admin@<domain>.onmicrosoft.com"
PWD = "abcdefghi" #app password
recipient = ["dummyuser@abc.com"]
TO = recipient if isinstance(recipient, list) else [recipient]
SUBJECT = "Test Message"
TEXT = "Hello"

# Function that sends email.
def send_mail(username, password, from_addr, to_addrs, msg):
    server = smtplib.SMTP('smtp.office365.com', '587')
    server.ehlo()
    server.starttls()
    server.ehlo()
    server.login(username, password)
    server.sendmail(from_addr, to_addrs, message)
    server.quit()
    
# prepaire message
message = """From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    
# Send Email
send_mail(FROM,PWD,FROM,TO,message)

所有用户均启用了MFA且希望保持该状态,禁用Security Defaults虽能成功发送邮件,但会提升风险。查看登录日志发现错误:

Access has been blocked by Conditional Access policies. The access policy does not allow token issuance.

无法在条件访问中找到跳过MFA的选项,需要实现在不关闭MFA的前提下通过SMTP认证发送邮件。


解决方案

1. 创建针对性的条件访问策略

登录Azure门户,进入Azure Active Directory > 条件访问:

  • 新建策略,命名为“允许SMTP App Password访问”
  • 在用户或工作负载标识中,选择需要使用SMTP的目标用户(如admin@<domain>.onmicrosoft.com)
  • 在云应用或操作中,选择操作,勾选“Exchange Online SMTP”权限
  • 在授予选项中,选择“允许访问”,确认策略仅针对SMTP操作生效,保存策略

2. 确认Exchange Online邮箱的SMTP权限

通过PowerShell验证并启用用户的SMTP客户端认证权限:

# 查看当前状态
Get-CASMailbox -Identity "admin@<domain>.onmicrosoft.com" | Select-Object Name, SmtpClientAuthenticationDisabled

# 如果SmtpClientAuthenticationDisabled为True,执行以下命令启用
Set-CASMailbox -Identity "admin@<domain>.onmicrosoft.com" -SmtpClientAuthenticationDisabled $false

3. 修正测试代码的变量错误

代码中send_mail函数调用了未定义的message参数,需改为传入的msg:

def send_mail(username, password, from_addr, to_addrs, msg):
    server = smtplib.SMTP('smtp.office365.com', '587')
    server.ehlo()
    server.starttls()
    server.ehlo()
    server.login(username, password)
    server.sendmail(from_addr, to_addrs, msg)  # 替换原有的message为msg
    server.quit()

完成以上步骤后,即可在保留MFA和Security Defaults的前提下,通过App Password完成SMTP认证并发送邮件。

内容的提问来源于stack exchange,提问作者Hassan Anwer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:13:28