使用oauth2通过googleapi gmail python发送电子邮件

mir*_*gai 5 python gmail smtp google-api oauth-2.0

我正在尝试使用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))
Run Code Online (Sandbox Code Playgroud)

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

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

从文档中我发送AUTH带有所需的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')
Run Code Online (Sandbox Code Playgroud)

And*_*epo 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))
Run Code Online (Sandbox Code Playgroud)