启用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
相关产品推荐
相关产品推荐

