我想使用 Google 的 SMTP 服务从我的 Google 帐户发送电子邮件。
所以我去谷歌API控制台创建了一个服务账户,即...@developer.gserviceaccount.com
,下载了私有证书。
使用 Python,您可以使用oauth2client库来获取此类对的凭据对象:SignedJwtAssertionCredentials
. 您提供"https://mail.google.com"
SMTP 服务的范围。
它在 Google 的OAuth2 with Python run-through 文档中进行了解释,除了那里的示例假设您有一个“已安装的应用程序”,并且您将使用网络流来提示用户授权发送电子邮件他们的帐户。
就我而言,这是来自我自己的帐户,所以我已经设置了一个服务帐户,并附有一个私有证书,我可以使用它来授权凭据。
这个 Python 脚本演示了这个问题:
import httplib2
import smtplib
import base64
import datetime
from oauth2client.client import SignedJwtAssertionCredentials
http = httplib2.Http()
google_user = "some-account@developer.gserviceaccount.com"
google_cert = open('some-private-cert.p12', 'rb').read()
credentials = SignedJwtAssertionCredentials(
google_user, google_cert,
scope='https://mail.google.com/',
)
credentials.refresh(http)
# To demonstrate that we've got a valid access token, let's make a
# couple of assertions:
#
# 1. The credentials have been refreshed:
assert credentials.access_token is not None
#
# 2. The access token hasn't expired (and isn't about to):
assert (credentials.token_expiry - datetime.datetime.utcnow()).total_seconds() > 60
auth_string = 'user=%s\1auth=Bearer %s\1\1' % (
google_user, credentials.access_token
)
smtp_conn = smtplib.SMTP('smtp.gmail.com', 587)
smtp_conn.set_debuglevel(True)
smtp_conn.ehlo()
smtp_conn.starttls()
smtp_conn.ehlo()
# Now, authenticate (but this fails):
smtp_conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(auth_string))
错误响应是(base64-decoded):
{"status":"400",
"schemes":"Bearer",
"scope":"https://mail.google.com/"}
我不知道它应该工作,但我不明白为什么不工作。