Gmail使用应用专用密码阻止来自Python的登录尝试

时间:2017-09-27 10:15:09

标签: python python-3.x authentication smtp gmail

我正在尝试使用Python的smtplib从Google帐户发送电子邮件,但收到错误,现在我有点不知所措。 Google会回复以下信息:Please log in via your web browser and then try again. Learn more at https://support.google.com/mail/answer/78754

该帐户启用了两个因素身份验证,因此我使用特定于应用程序的密码登录。根据我的理解,这应该可以在不启用不太安全的应用程序的设置的情况下工作,不应该吗?我在测试时没有遇到任何问题,我一直在使用另一个帐户,但现在我终于获得了正确帐户的凭据,并且不会接受身份验证。

我知道有一个Python Gmail 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()

编辑: 两个帐户之间存在一个有趣的区别:在https://myaccount.google.com/lesssecureapps上,我的旧(工作)帐户说“此设置不适用于启用了双因素身份验证的帐户”,而新帐户则说“此设置为由您的域管理员管理“,即使两者都使用2FA,它也在两个域中被强制使用。所以我想域管理员必须改变一些设置,但我不知道会是哪一个。

3 个答案:

答案 0 :(得分:4)

我尝试复制你的情况(使用启用了双因素身份验证的帐户)。创建我的应用密码后,我在代码中使用了它。

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

s = smtplib.SMTP(server, port)
s.connect(server, port)

您执行2次连接。

尝试

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()

答案 1 :(得分:1)

似乎很简单,但请检查以确保Allow less secure apps已启用。

答案 2 :(得分:0)

我很好奇你是否启用了IMAP(尽管SMTP与IMAP无关)...

以下是包含许多不同解决方案的旧列表 - Sending email through Gmail SMTP server with C#