登录凭证无法与Gmail SMTP配合使用

165

我正试图通过Gmail在Python中发送一封电子邮件。这是我的代码:

import smtplib

fromaddr = '......................'  
toaddrs  = '......................'  
msg = 'Spam email Test'  
      
username = '.......'  
password = '.......'

server = smtplib.SMTP('smtp.gmail.com', 587)  
server.ehlo()
server.starttls()
server.login(username, password)  
server.sendmail(fromaddr, toaddrs, msg)  
server.quit()

我遇到了错误:

Traceback (most recent call last):
  File "email_send.py", line 18, in <module>
    server.login(username, password)
  File "C:\.....\Python\lib\smtplib.py", line 633
, in login
    raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepte
d. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=1425
7\n5.7.8 {BADCREDENTIALS} s10sm9426107qam.7 - gsmtp')

这似乎是登录问题。我确信我的登录细节是正确的,除了一件事。用户名应该是“blah@gmail.com”还是仅为“blah”?我尝试了两种方法,但出现了同样的错误。

有什么想法错在哪里吗?

注:所有的句号都代替了密码/电子邮件/文件路径等。


1
在https://support.google.com/mail/answer/14257上,可能出现验证码或其他需要用户交互的验证过程等问题。您尝试过正常登录吗? - Robert Lujo
3
确切地说,Gmail在通过代码发送邮件方面非常不稳定。我曾经在使用Python代码通过Gmail账户发送电子邮件时遇到了很多问题,而使用Yahoo账户则效果非常好。 - PepperoniPizza
1
http://stackoverflow.com/questions/16203071/sending-emails-in-python-weird-behaviour - PepperoniPizza
3
你的代码可以使用我的username@gmail.com。如果我输入错误的用户名或密码,我会收到相同的错误信息。 - Txema
1
请使用此链接并通过登录您所需的电子邮件打开此选项。https://myaccount.google.com/lesssecureapps 谢谢。 - Shawnock Guha Paul
@Shawnock Guha Paul 我为此奋斗了很长时间。谢谢! - Lenn Dolling
20个回答

328

更新: 自2022年5月30日起,此功能不再得到支持。请参见https://support.google.com/accounts/answer/6010255?hl=zh-cn&visit_id=637896899107643254-869975220&p=less-secure-apps&rd=1#zippy=%2Cuse-an-app-password

原回答(已失效): 我遇到类似的问题,并偶然发现了这个问题。我得到了SMTP身份验证错误,但我的用户名/密码是正确的。以下是解决方法。我读了这篇文章:

https://support.google.com/accounts/answer/6010255

简而言之,Google不允许您通过smtplib进行登录,因为它将此类登录标记为“较不安全”,所以您必须在登录到您的Google帐户时转到此链接并允许访问:

https://www.google.com/settings/security/lesssecureapps

设置完成后(请参阅我的屏幕截图),应该可以正常工作。

Less Secure Apps

现在登录可用:

smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('me@gmail.com', 'me_pass')

更改后的响应:

(235, '2.7.0 Accepted')

先前的回应:

smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 g66sm2224117qgf.37 - gsmtp')

还是不行?如果你仍然收到SMTPAuthenticationError,但现在代码是534,那么是因为位置未知。请按照以下链接操作:

https://accounts.google.com/DisplayUnlockCaptcha

点击继续,这应该会给你10分钟注册新应用程序。现在尝试另一个登录尝试,应该可以正常工作。

如果这似乎不能立即生效,你可能需要一段时间来解决smptlib中的这个错误:

235 == 'Authentication successful'
503 == 'Error: already authenticated'

这条消息说要使用浏览器进行登录:

SMTPAuthenticationError: (534, '5.7.9 Please log in with your web browser and then try again. Learn more at\n5.7.9 https://support.google.com/mail/bin/answer.py?answer=78754 qo11sm4014232igb.17 - gsmtp')

启用“lesssecureapps”后,去喝杯咖啡,然后再尝试“DisplayUnlockCaptcha”链接。根据用户体验,这个更改可能需要长达一小时才能生效。之后再次尝试登录过程。

更新: 请参见我的答案: 如何使用Python发送Gmail邮件?


1
我已经为不安全的设备启用了它,但是登录似乎对我无效。是否还有其他需要更改的地方? - proprius
允许“lesssecureapps”可以使用SMTP。在切换后生效。已点赞! - Simplicity's_Strength
3
这个不再起作用了。你需要按照OmG发布的创建“应用程序密码”的方法操作。那对我有用! - oriuken
2
下面提到的“应用程序密码”解决方案是全新的解决方案! - ArtixZ
显示剩余4条评论

53

当我尝试使用smtplib时,我也遇到了相同的错误信息。错误信息如下:

error (535, b'5.7.8 username and password not accepted.

Google已更改对不太安全的应用程序的访问方式。在此之前,有一个字段可以授权访问。现在您可以按照以下步骤操作:

步骤略有变化

  1. 转到Google帐户页面>安全性>登录到Google部分,打开2步验证。您需要启用此功能。

第一步

  1. 当2SV打开时,单击2步验证,滚动到底部找到应用程序密码。

第二步

  1. 为邮件访问生成新的应用程序密码。它将为您生成密码,然后在Python中使用此密码作为gmail_password函数。

    gmail_password='google_generate_it_for_you'

Third step


3
这是最新的答案,也是我认为最好的答案。 - vpz
我正在为一个使用smtplib库和Python构建的自动化工具编写脚本,并设置了密码,但它仍然无法正常工作。 - Kevin G
@KevinG 当你创建密码时,你应该选择特定的应用程序和设备。如果在测试时不匹配,可能会出现错误提示。 - Ephesus
我已经设置好了,我的密码设置错了变量。谢谢! - Kevin G
像魔术一样好用!! - GKV

48

这也是可行的!我们只需要执行“步骤2”,因为如果我们不经常使用Google帐户,Google会自动将“较不安全的应用程序”关闭。 - Ice Bear

21

如果使用的是 smtp.gmail.com,则需要执行以下操作:

  1. 启用不安全应用程序

  2. 您将在 Gmail 收件箱中收到安全电子邮件,请单击“是,这是我”。

  3. 现在再次运行您的代码。


自2022年5月起,Google已删除“不太安全的应用程序”。 - LazerDance

15

拒绝访问

在Gmail中使用"不安全应用的访问"的解决方案已经被拒绝了(在此处找到更多信息:here)。

更新

顺便提一下,您可以通过Google提供的名为"应用密码"的解决方案来访问Gmail帐户。这个解决方案很简单:

1. Active two-step verification of the corresponding account.
2. Create an app password. 
3. Exactly do the same implementation that you have for sending an email (explained in your question). 
   Except, replace the password with the generated app password (a sixteen digit password).

如果您需要更多详细信息,您还可以关注这篇文章(对我来说效果很好)。


这对我来说并没有完全起作用。我仍然得到了相同的错误。但是,如果您对上面附加的程序进行一些微小的更改,那么应该就没问题了:在启用应用程序密码时,请选择邮件而不是其他要选择的应用程序,并在设备下选择“您的计算机”(执行代码的设备),而不是其他。 - Preben Andersen
顺便说一下,我正在使用相同建议的场景,它运行良好。为了解决您的问题,您可以分享您遇到的错误。 - OmG

12

注意:如果您启用了MFA,则必须启用应用程序密码。我不得不进入我的管理员帐户:admin.google.com -> 安全性 -> 启用较少安全性。然后我进入了我的个人帐户:安全性 -> 应用程序密码。然后我才能运行TLS连接并发送电子邮件。 - kevin_theinfinityfund

7

如果出现此错误(535,b'5.7.8 用户名和密码未被接受。了解更多信息请访问\n5.7.8 https://support.google.com/mail/?p=BadCredentials o60sm2132303pje.21 - gsmtp'),则只需进入您的Google帐户安全设置部分,创建一个低安全性帐户并打开低安全性按钮即可。


较不安全的应用程序访问一些应用程序和设备使用较不安全的登录技术,这会使您的帐户容易受到攻击。我们建议您关闭这些应用程序的访问权限,或者如果您想使用它们但知道风险,则可以打开它们的访问权限。如果没有使用,谷歌将自动关闭此设置。了解更多信息。 允许较不安全的应用程序:开启 - vikash tiwary

7

这通常比禁用不安全的应用程序更好,因为出于安全原因,但它们很复杂,所以您无法记住它们,这意味着您要么必须在注释中编写它并在发布最终产品之前将其删除,要么可能将其存储在数据库中。 - random_hooman

4

我也遇到了同样的问题,通过允许 "不安全的应用程序访问" 来解决了这个问题。这可以在 Google 帐户的安全选项卡中找到:enter image description here


@Jamjitul,正如您可能已经注意到的那样,它确实很好地回答了这个问题。 - A. chahid

1

2022年12月更新:

您需要使用应用程序密码才能允许您的应用程序访问您的Google帐户。

因此,您需要执行以下操作:

  1. 根据我的回答生成应用程序密码

  2. 生成的应用程序密码分配给代码中的password,如下所示:

import smtplib

fromaddr = '......................'  
toaddrs  = '......................'  
msg = 'Spam email Test'  

username = '.......'  
password = 'xylnudjdiwpojwzm' # Here

server = smtplib.SMTP('smtp.gmail.com', 587)  
server.ehlo()
server.starttls()
server.login(username, password)  
server.sendmail(fromaddr, toaddrs, msg)  
server.quit()

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