5

我正在尝试使用 OAuth 2 以用户身份发送电子邮件。在 Google 的网站上,他们声明

本文档定义了与 IMAP AUTHENTICATE 和 SMTP AUTH 命令一起使用的 SASL XOAUTH2 机制。此机制允许使用 OAuth 2.0 访问令牌对用户的 Gmail 帐户进行身份验证。

使用他们提供的测试oauth2.py

smtp_conn = smtplib.SMTP('smtp.gmail.com', 587)
smtp_conn.set_debuglevel(True)
smtp_conn.ehlo('test')
smtp_conn.starttls()
smtp_conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(auth_string))

您可以在其中测试是否可以使用提供的访问令牌连接到他们的 smtp 服务器,它会成功,但是当我尝试使用发送电子邮件时sendmail失败。

如果我添加smtp_conn.sendmail('from@test.com', 'to@test.com', 'msg')它说我需要进行身份验证。

从文档中,当我发送AUTH带有所需身份验证字符串的命令时,我没有进行身份验证吗?

谢谢。

更新*

所以很明显,如果我在 try catch 语句的 catch 中重新进行身份验证,它会起作用..有什么想法吗?

try:
    smtp_conn.sendmail('fromt@test.com', 'to@test.com', 'cool')
except:
    smtp_conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(auth_string))
    smtp_conn.sendmail('from@test.com', 'to@test.com', 'cool')
4

1 回答 1

1

在 starttls 之后你需要另一个 ehlo 调用。所以:

    smtp_conn = smtplib.SMTP('smtp.gmail.com', 587)
    smtp_conn.set_debuglevel(True)
    smtp_conn.ehlo()
    smtp_conn.starttls()
    smtp_conn.ehlo()
    smtp_conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(auth_string))
于 2012-10-17T04:29:03.653 回答