我正在尝试使用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,它也在两个域中被强制使用。所以我想域管理员必须改变一些设置,但我不知道会是哪一个。
答案 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#