Gmail使用特定于应用程序的密码阻止Python的登录尝试

Gmail使用特定于应用程序的密码阻止Python的登录尝试,python,python-3.x,authentication,smtp,gmail,Python,Python 3.x,Authentication,Smtp,Gmail,我试图使用Python的smtplib从Google帐户发送电子邮件,但出现了一个错误,现在我有点不知所措。Google回应如下:请通过您的web浏览器登录,然后重试。了解更多信息,请访问https://support.google.com/mail/answer/78754 该帐户已启用双因素身份验证,因此我使用特定于应用程序的密码登录。据我所知,这应该可以在不启用较不安全应用程序设置的情况下工作,不是吗?我在测试时对另一个帐户做了同样的操作,没有出现问题,但现在我终于获得了正确帐户的凭据,并

我试图使用Python的smtplib从Google帐户发送电子邮件,但出现了一个错误,现在我有点不知所措。Google回应如下:
请通过您的web浏览器登录,然后重试。了解更多信息,请访问https://support.google.com/mail/answer/78754

该帐户已启用双因素身份验证,因此我使用特定于应用程序的密码登录。据我所知,这应该可以在不启用较不安全应用程序设置的情况下工作,不是吗?我在测试时对另一个帐户做了同样的操作,没有出现问题,但现在我终于获得了正确帐户的凭据,并且它不会接受身份验证

我知道有一个PythonGmail API可以与OAuth一起使用,但是如果可能的话,我不想包含更多的包和重写太多,我也不想启用“不太安全的应用程序”设置。 有没有一种方法可以在没有任何一种方法的情况下实现这一点

如果有区别的话,下面是我用来发送电子邮件的代码。如前所述,这在另一个帐户中运行良好,因此我不确定它是否真的相关

def send_mail(to_address, subject, body):
    smtp_user = "myaccount@domain.com"
    smtp_password = "MyAppPasswordFromGoogle"
    server = "smtp.gmail.com"
    port = 587

    msg = MIMEMultipart("alternative")
    msg["Subject"] = subject
    msg["From"] = smtp_user
    msg["To"] = to_address
    msg.attach(MIMEText(body, "html"))
    s = smtplib.SMTP(server, port)
    s.connect(server, port)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(smtp_user, smtp_password)
    s.sendmail(smtp_user, to_address, msg.as_string())
    s.quit()
编辑:
这两个帐户之间有一个有趣的区别:在上,我的旧(工作)帐户说“此设置不适用于启用了双因素身份验证的帐户”,而新帐户说“此设置由您的域管理员管理”,尽管两者都使用2FA,而且在两个域中都是强制的。因此,我认为域管理员必须更改某些设置,但我不知道该更改哪个设置。

我尝试完全复制您的案例(使用启用了双因素身份验证的帐户)。创建应用程序密码后,我在代码中使用了它

无论如何,我认为你的问题如下:

s = smtplib.SMTP(server, port)
s.connect(server, port)
执行两次连接

试一试

s = smtplib.SMTP()
s.connect(server, port)
或者只是这个

s = smtplib.SMTP(server, port)
整个代码:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


smtp_user = 'myUser@gmail.com'
smtp_password = 'my16charactersAppPassword'
server = 'smtp.gmail.com'
port = 587
msg = MIMEMultipart("alternative")
msg["Subject"] = 'Why,Oh why!'
msg["From"] = smtp_user
msg["To"] = "destinationUser@gmail.com"
msg.attach(MIMEText('\nsent via python', 'plain'))
s = smtplib.SMTP(server, port)
s.ehlo()
s.starttls()
s.login(smtp_user, smtp_password)
s.sendmail(smtp_user, "destinationUser@gmail.com", msg.as_string())
s.quit()

我只是好奇您是否启用了IMAP(尽管SMTP与IMAP无关)


这是一个包含许多不同解决方案的旧列表-

看起来很简单,但请检查以确保已启用

可悲的是,事实并非如此。我尝试了各种组合,显然我无意中复制了一个同时具有两个连接的组合。我将编辑问题以反映这一点。不管怎样,我对你的两个版本都得到了相同的结果。另外,正如我之前所说的,同一个代码可以在另一个帐户中正常工作,因此,尽管它可能并不漂亮,但我非常怀疑代码中是否存在实际的逻辑错误,该错误只会出现在一个帐户中,而不会出现在另一个帐户中。好的,np。在中的“我的帐户”中,写着“此设置不适用于启用了两步验证的帐户。此类帐户需要特定于应用程序的密码才能访问不太安全的应用程序。”。就像在你的账户里一样。您正在使用Gsuite吗?我发现的唯一一件事(从您的问题描述中)是肯定的,我们正在使用GSuite(对于这两个帐户)。当然,我们已经建立了MX记录等等,但我甚至不知道该去哪里找。在这里开始提问之前,我已经对此进行了相当多的研究,除了上面提到的两个设置之外,我不知道还有其他相关设置。@DominiquePaul不幸的是没有。我最终通过AWS SES发送电子邮件,绕过了整个问题。我认为谷歌特定于应用程序的密码方法总体上是非常不稳定的——我甚至不能让它在一台机器上与Outlook一起工作。这是一个遗憾,因为它背后的想法并不坏。正如我在问题中所写的,这正是我不想使用的设置。没有它应该是可能的。这是我的解决方案。我相信“不太安全的应用程序”意味着“允许特定于应用程序的密码工作”,但这似乎没有写在任何地方。在这里记下以备将来参考。是的,我启用了IMAP。在接下来的几天里,我将在您的链接中尝试解决方案。