根据user_id获取Google帐户电子邮件地址

时间:2015-04-24 13:39:45

标签: python google-app-engine gmail-api

基于@bossylobster的this answer,我已经成功实现了一个与GMail API连接的cron作业。目前我的代码中有user_id和电子邮件地址,但我正在构建一个应该在用户列表中运行的应用程序。

在这种情况下的问题是,当我在CredentialsModel上运行循环时,我没有用户的电子邮件地址。由于我使用的是webapp 2中的用户模型(基于this tutorial),我也无法在任何地方看到这个ID(据我所知)。

如果我能以某种方式检索具有user_id和凭据的电子邮件地址,或者在给出权限时将电子邮件地址和user_id保存在用户模型中......处理此问题的最佳方法是什么?

获取授权的代码:

http = httplib2.Http(memcache)
service = discovery.build("gmail", "v1", http=http)
decorator = OAuth2Decorator(client_id=settings.CLIENT_ID,
                        client_secret=settings.CLIENT_SECRET,
                        scope=settings.SCOPE)

class getPermissions(webapp2.RequestHandler):
  @decorator.oauth_aware
  def get(self):
    template_values = {
    'url': decorator.authorize_url(),
    'has_credentials': decorator.has_credentials()
    }
    self.response.out.write(template.render('templates/auth.html', template_values))

2 个答案:

答案 0 :(得分:2)

您可以使用userId =“me”调用Gmail API,这意味着,只需使用凭据中经过身份验证的用户的userId - 无需指定电子邮件地址/ userId。 C.F. docs中userId字段的描述: https://developers.google.com/gmail/api/v1/reference/users/labels/list

答案 1 :(得分:2)

Gmail API特定方法

您可以致电users.getProfile()获取该用户的电子邮件地址:

user_profile = service.users().getProfile(userId='me').execute()
user_email = user_profile['emailAddress']

此方法的优点是不需要添加任何其他API范围。

通用方法

如果您将email添加到OAuth范围列表中,那么您的凭据对象将包含用户的电子邮件地址:

try:
  print credentials.id_token['email']
except KeyError:
  print 'Unknown email'

请参阅Google's docs for the email scope