当前位置: 首页 > 知识库问答 >
问题:

使用python语言从Outlook发送邮件时出现SMTP身份验证错误

晁国发
2023-03-14
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]').

共有3个答案

薛墨一
2023-03-14

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

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

直到我取消选择并重新选择每个帐户的“认证SMTP”复选框,脚本才开始工作。

谢谢

舒飞捷
2023-03-14

@wombatonfire给出了一个很好的答案,但如果因为任何原因这些步骤都不可能(就像我的情况一样),下面的步骤为我解决了OP问题。

我在电脑上。无法访问管理中心。不得不使用电源外壳。此外,我的Mac上的powershell必须连接到MSFT交换服务器,然后我才能更改邮箱的设置。以下内容使电子邮件按设计工作。

有一个关键的箍要跳过才能使这一切发挥作用。要将 Mac 连接到 MSFT Exchange 服务器,您的 Mac 必须使用 TLS1.2 from/via /through OpenSSL1.0。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的成功至关重要。只有“ExchangeOnlineManagement”包的最新“预览版2.0.4”才能在Mac上工作。

我不知道是否需要这样做,但我卸载了正式版本的“ExanyeOnlineManagement”软件包:

>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 server!

最后一步是在您要使用的邮箱上设置SMTP设置:

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

最后,显而易见,务必明确断开连接(在关闭终端窗口之前):

>Disconnect-ExchangeOnline

这就是球赛。您要将要从中发送电子邮件的每个/任何/所有邮箱的“禁用”设置更改为 false。

现在,在OP中看到的完全记录的、经常重复的python代码将使用SMTP和TLS通过MSFT Exchange发送电子邮件(直到其他东西再次打破这一切:-O)。

尽情享受吧!

吴炎彬
2023-03-14

最有可能的是,您的Exchange Online组织中禁用了经过身份验证的SMTP(SMTP AUTH协议)。

可以在组织级别或按邮箱启用/禁用SMTP AUTH。因为SMTP AUTH仅使用基本身份验证,所以Microsoft建议在组织级别禁用它,并且仅对仍然需要它的个人帐户启用它。

如果组织中启用了安全默认值,则SMTP AUTH被禁用。

SMTP AUTH 可以在 Microsoft 365 管理中心或使用 Exchange Online Powershell 启用。

为简单起见,为单个帐户启用 SMTP 身份验证:

  1. 转到 Microsoft 365 管理中心 (https://admin.microsoft.com/)

之后,您应该能够使用各自的帐户进行身份验证。

重要提示:您需要在Office 365组织中拥有管理员权限才能执行此操作。否则,请向O365组织管理员寻求帮助。

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

 类似资料:
  • 我正在尝试使用 smtp.gmail.com(端口 587)通过 Spring 应用程序发送电子邮件。问题是我间歇性地面临以下错误。 错误并非总是出现,并且邮件发送正常。但有时会出现错误,邮件无法发送。我将以下内容设置为真实的https://www.google.com/settings/security/lesssecureapps 以下是配置 属性如下

  • 我需要将邮件从我的gmail帐户发送到另一个帐户。我使用了以下代码。 但我得到的错误如下。。。javax。邮政MessaginException:无法连接到SMTP主机:SMTP。gmail。com,端口:25 我该怎么解决这个问题。你能帮我吗?

  • 我正在尝试使用javamail和smtp发送邮件。当我从我的gmail地址发送邮件时,它对我有效。我改变了从我的交换账户发送的相同代码,但它不起作用。我正在获得身份验证失败异常。 密码 我尝试使用默认端口,即25,但那一次出现了错误,显示了错误的端口号。所以我假设端口号是对的。我尝试了ping主机和它的工作。我尝试的用户名。但总是有同样的例外。请帮我修一下。 提前谢谢 我启动了调试,得到了以下日志

  • 问题内容: 我正在使用以下方法使用SMTP从Python发送邮件。是使用的正确方法还是我缺少的陷阱? 问题答案: 我使用的脚本非常相似。我将其发布在此处,作为如何使用email。*模块生成MIME消息的示例。因此可以轻松修改此脚本以附加图片等。 我依靠ISP添加日期时间标头。 我的ISP要求我使用安全的smtp连接发送邮件,我依靠smtplib模块(可从http://www1.cs.columbi

  • SMTP服务器 ;                  [myserverName] 默认用户电子邮件后缀 ; [myemailId] 使用SMTP身份验证 ; true 用户名称 ;                     [myemailId] 密码 ;                       [mypassword] 使用SSL ;                       假 SMTP

  • 当我尝试使用PHP SMTP电子邮件服务器发送电子邮件时,发生了以下错误。 邮件程序错误:SMTP错误:无法进行身份验证。 下面是我使用的代码。 } 如何修复此错误。