使用Gmail OAuth2和SMTP(Python)发送电子邮件

时间:2013-01-09 01:47:03

标签: python oauth smtp gmail google-api

我正在开发一个应用程序,允许用户通过Gmail进行身份验证并发送电子邮件。

以下是需要发生的事情:

  • 用户使用OAuth2进行身份验证
  • 获取用户的电子邮件地址(或任何其他持久性唯一标识符)并用于将用户登录到应用程序
  • 用户可以使用SMTP撰写和发送电子邮件

但是,我遇到了身份验证问题。我正在使用的函数是OAuth2WebServerFlow():

flow = OAuth2WebServerFlow(client_id=GOOGLE_CLIENT_ID,
                           client_secret=GOOGLE_CLIENT_SECRET,
                           scope=scope,
                           redirect_uri=base_app_url + '/oauth2callback')

scope ='https://mail.google.com/ '时效果很好,但问题是我无法获取用户的电子邮件地址,因为用户没有给出许可(由https://developers.google.com/oauthplayground/表示)。因此,我必须对自己的电子邮件地址进行硬编码才能使其正常工作。

另一方面,当 scope ='https://mail.google.com/,https://www.googleapis.com/auth/userinfo.email'时,我可以获得用户的电子邮件地址包含以下内容:

r = requests.get('https://www.googleapis.com/oauth2/v2/userinfo',
                 headers={'Authorization': 'OAuth ' + access_token})

然而,在这种情况下的问题是,当我去发送电子邮件时,不接受用于创建auth字符串的access_token,给我以下错误(我认为这是不合适的):

SMTPSenderRefused: (535,
                    '5.7.1 Username and Password not accepted. Learn more at\n5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 cv19sm54718503vdb.5',
                    u'<MY_NAME@MY_GOOGLE_APP_DOMAIN.COM>')

以下是我发送电子邮件的代码:

def send_email(user_address, access_token, recipient_address, subject, body):
    xoauth2_string = 'user=%s\1auth=Bearer %s\1\1' % (user_address, access_token)
    url = "https://mail.google.com/mail/b/" + user_address + "/smtp/"

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

    header = 'To:' + recipient_address + '\n'
    header += 'From:' + user_address + '\n'
    header += 'Subject:' + subject + ' \n'
    header += 'Content-Type: text/html; charset=UTF-8\n' 
    msg = header + '\n ' + body + ' \n\n'

    conn.sendmail(user_address, recipient_address, msg)

基本上我想知道是否:

  1. 我可以使用scope ='https://mail.google.com/'获取用户的电子邮件或其他一些持久性唯一标识符。
  2. 有一种方法可以使用scope ='https://mail.google.com/,https://www.googleapis.com/auth/userinfo.email'来使SMTP工作。
  3. 为什么我的身份验证字符串被拒绝了?有什么我想念的吗?请求多个权限时,谷歌API是否有问题?

0 个答案:

没有答案