Python语言在Outlook发送邮件时出现SMTP身份验证错误

6
import smtplib


smtpObj = smtplib.SMTP('smtp.office365.com', 587)

smtpObj.ehlo()

smtpObj.starttls()

smtpObj.login('xxx@gmail.com', ' abcde')

smtpObj.sendmail('xxx@gmail.com', 'yyyy@outlook.com', 'Subject: So long.\nDear Alice, so long and thanks for all the fish. Sincerely, Bob')

{}

smtpObj.close()

我遇到的错误提示信息

SMTPAuthenticationError: (535, b'5.7.3 Authentication unsuccessful [BM1PR01CA0150.INDPRD01.PROD.OUTLOOK.COM]').

你是否已经查看了这里的建议?https://stackoverflow.com/questions/34045404/jenkins-email-extension-plugin-unsuccessful-authentication-with-office-365-accou/49287610#49287610。特别是要仔细检查你的密码和电子邮件地址。 - dspencer
如何检查电子邮件地址是否作为共享邮箱创建? - Nandu
3个回答

9
最可能的情况是,您的Exchange Online组织中已禁用认证SMTP(SMTP AUTH协议)。
SMTP AUTH可以在组织级别或每个邮箱级别上启用/禁用。由于SMTP AUTH只使用基本身份验证,Microsoft建议在组织级别上禁用它,并仅为仍需要它的个别帐户启用它。
如果组织中启用了安全默认值,则SMTP AUTH将被禁用。
SMTP AUTH可以在Microsoft 365管理中心或使用Exchange Online Powershell中启用。
为了简单起见,要为单个帐户启用SMTP AUTH:
  1. 进入Microsoft 365管理中心(https://admin.microsoft.com/) > 用户 > 活动用户
  2. 选择要发送电子邮件的用户,转到邮件选项卡。
  3. 电子邮件应用程序部分单击管理电子邮件应用程序
  4. 启用认证SMTP并单击保存更改

接下来,您应该能够使用相应的帐户进行身份验证。

重要提示:您需要在Office 365组织中拥有管理员权限才能这样做。否则,请向您的O365组织管理员寻求帮助。

更多详细信息:https://learn.microsoft.com/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission


0

感谢 @wombatonfire - 非常有帮助 - 我对你的回答有一个小补充。

我尝试了几个小时来设置多个电子邮件地址以从 Python 脚本发送邮件;我正在使用的所有帐户都显示在 Active User 页面上启用了身份验证 SMTP,但我仍然遇到了身份验证错误。

直到我为每个帐户 取消选择重新选择 "Authenticated SMTP" 复选框后,脚本才能正常工作。

谢谢


1
感谢您的贡献。这应该是对所引用帖子的评论。根据SO准则,它不符合答案的要求(这对于该平台的良好运作非常必要--它与论坛的工作方式不同)。一旦您获得足够的声望,就可以在任何地方发表评论。我们感谢您的帮助和参与。欢迎来到SO。您可以在帮助部分阅读更多信息。 - SherylHohman

0

@wombatonfire 给出了一个很棒的答案,但如果由于任何原因这些步骤不可行(就像我的情况一样),以下方法解决了我的问题。

我使用的是 Mac。无法进入管理员中心。必须使用 PowerShell。 此外,在我的 Mac 上,PowerShell 必须连接到 MSFT 交换服务器,然后才能更改我的邮箱设置。以下内容使电子邮件按设计工作。

要使所有这些工作正常运行,需要跨越一个关键障碍。 要将您的 Mac 连接到 MSFT Exchange 服务器,您的 Mac 必须使用来自/通过 OpenSSL1.0 的 TLS1.2。OpenSSL1.1 不行。

在您的 Mac 上获取终端窗口:

Click LaunchPad, type "term", click Terminal

在终端窗口中,检查您的 Mac 上有哪些 OpenSSL 版本:
>ls -al /usr/local/Cellar/openssl*

查看当前正在使用的版本:

>openssl version -a

OpenSSL 1.1.* 不好。 OpenSSL 1.0.* 很好。

通常,你可以使用brew来切换包的版本:

>brew switch openssl 1.0.2s
>brew link --overwrite openssl

但是我遇到了这个错误:警告:拒绝链接 macOS 提供/遮蔽的软件:openssl。 所以我不得不想办法解决。

更改 PATH 环境变量(仅在此终端会话中,而非永久性更改)。

>PATH=/usr/local/Cellar/openssl/1.0.2s/bin:$PATH

现在检查,显示良好版本:

>openssl version -a

接下来,我按照此处记录的步骤安装了 PowerShell: https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7

现在,以管理员身份打开 PowerShell。

>sudo su - root
<your mac password>
root>pwsh 

在 PowerShell 提示符处,仔细检查您的 PowerShell 版本。需要版本 7。
>$host.version

我有:7.0.3修订版-1

检查PowerShell中安装了哪些模块:

>Get-Module -ListAvailable

如果未列出“PowerShellGet”,请安装它:
>Install-Module -Name PowerShellGet -Force

这一步对于在 Mac 上成功非常关键。只有最新的“预览版本2.0.4”的“ExchangeOnlineManagement”软件包才能在 Mac 上运行。

我不知道是否需要,但我使用以下命令卸载了“ExchangeOnlineManagement”软件包的发布版本:

>Uninstall-Module -Name ExchangeOnlineManagement -RequiredVersion 2.0.3

如果预览版本不存在,请安装它:
>Install-Module -Name ExchangeOnlineManagement -AllowPrerelease -Force

还有最后一个细节需要注意。告诉PowerShell您想要“ExchangeOnlineManagement”包使用哪个版本的TLS:

>[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

最后,是时候连接到母舰了: (在 Mac 上比 Windows 更棘手,可能需要更多技巧)。

>Connect-ExchangeOnline -UserPrincipalName youremail@yourdomain

上述命令将尝试打开一个特殊的身份验证页面。至少在我的 Mac 上,它无法打开。因此:
COPY the giant link that gets displayed in the powershell window

PASTE the giant link into a web browser (I used Safari).

在浏览器页面上输入您的Exchange凭据后,您的PowerShell将显示一个进度条,然后神奇地连接到MSFT Exchange服务器!

设置您想要使用的邮箱的SMTP设置的最后一步:

Set-CASMailbox -Identity youremail@yourdomain -SmtpClientAuthenticationDisabled $false

最后,显然总是要明确断开连接(在关闭终端窗口之前)是很重要的。
>Disconnect-ExchangeOnline

这就是比赛结束的时候了。您需要将“disabled”设置为false,以便从每个/任何/所有邮箱发送电子邮件。

现在,您可以使用完全记录的、经常重复的Python代码(如OP中所示)通过SMTP和TLS发送电子邮件,直到其他问题再次出现。

祝您愉快!


嗨,我也遇到了同样的问题,管理员无法允许SMTP_AUTH的基本身份验证...但我必须使用Python脚本来完成这个自动化脚本。你能提供一些关于这个的输入吗? - Vipendra Singh
抱歉,@VipendraSingh。我不知道除了我所描述的方式之外还有什么其他方法可以完成。 - Dan Farfan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接