使用imaplib和oauth连接Gmail

18

我想在Python中使用Oauth来连接Gmail。目前,我已经从Google (链接) 获取了xoauth.py脚本,并且生成令牌一切正常,但是如何在另一个脚本中使用它呢?它将在Django中使用。

目前,我的脚本是这样登录的:

m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login("example@gmail.com", "password")

但我希望有更安全的选项。

3个回答

16

这是一个使用oauth2模块进行OAuth身份验证的示例,摘自自述文件:

import oauth2 as oauth
import oauth2.clients.imap as imaplib

# Set up your Consumer and Token as per usual. Just like any other
# three-legged OAuth request.
consumer = oauth.Consumer('your_consumer_key', 'your_consumer_secret')
token = oauth.Token('your_users_3_legged_token', 
    'your_users_3_legged_token_secret')

# Setup the URL according to Google's XOAUTH implementation. Be sure
# to replace the email here with the appropriate email address that
# you wish to access.
url = "https://mail.google.com/mail/b/your_users_email@gmail.com/imap/"

conn = imaplib.IMAP4_SSL('imap.googlemail.com')
conn.debug = 4 

# This is the only thing in the API for impaplib.IMAP4_SSL that has 
# changed. You now authenticate with the URL, consumer, and token.
conn.authenticate(url, consumer, token)

# Once authenticated everything from the impalib.IMAP4_SSL class will 
# work as per usual without any modification to your code.
conn.select('INBOX')
print conn.list()

比使用xoauth要干净得多。


嗨Acorn,我对oauth2和imaplib都很陌生,现在有一些问题,你能在这里回答吗:http://stackoverflow.com/questions/17976626/oauth2-and-imap-connection-with-gmail - Cacheing
5
我不明白"your_users_3_legged_token"和"your_users_3_legged_token_secret"来自哪里:/ - daveoncode

7

Google 有一个很好的示例代码用于进行 OAuth2 和 IMAP。同时,确保你的范围是正确的。

'scope': 'https://mail.google.com/'
'access_type': 'offline'

以下是来自谷歌示例代码的样本:
import base64
import imaplib

my_email = "xyz@gmail.com"
access_token = ""    #Oauth2 access token

auth_string = GenerateOAuth2String(my_email, access_token, base64_encode=False)
TestImapAuthentication(my_email, auth_string)


def TestImapAuthentication(user, auth_string):
  """Authenticates to IMAP with the given auth_string.

  Prints a debug trace of the attempted IMAP connection.

  Args:
    user: The Gmail username (full email address)
    auth_string: A valid OAuth2 string, as returned by GenerateOAuth2String.
        Must not be base64-encoded, since imaplib does its own base64-encoding.
  """
  print
  imap_conn = imaplib.IMAP4_SSL('imap.gmail.com')
  imap_conn.debug = 4
  imap_conn.authenticate('XOAUTH2', lambda x: auth_string)
  imap_conn.select('INBOX')


def GenerateOAuth2String(username, access_token, base64_encode=True):
  """Generates an IMAP OAuth2 authentication string.

  See https://developers.google.com/google-apps/gmail/oauth2_overview

  Args:
    username: the username (email address) of the account to authenticate
    access_token: An OAuth2 access token.
    base64_encode: Whether to base64-encode the output.

  Returns:
    The SASL argument for the OAuth2 mechanism.
  """
  auth_string = 'user=%s\1auth=Bearer %s\1\1' % (username, access_token)
  if base64_encode:
    auth_string = base64.b64encode(auth_string)
  return auth_string

谷歌提供OAuth 1和2的示例。他们的OAuth 1 API已经过时,我无法在django-social-auth中使其工作。上述OAuth 2与django-social-auth完美配合。 - Mark Horgan

3

这里是使用Google的xoauth.py中提供的例程连接到IMAP的示例。它将输出一些调试信息,因此您可能希望在实际应用中切换到使用oauth包。至少这应该能让您入门:

import imaplib
import random
import time

import xoauth

MY_EMAIL = 'xxx@gmail.com'
MY_TOKEN = # your token
MY_SECRET = # your secret

def connect():
    nonce = str(random.randrange(2**64 - 1))
    timestamp = str(int(time.time()))

    consumer = xoauth.OAuthEntity('anonymous', 'anonymous')
    access = xoauth.OAuthEntity(MY_TOKEN, MY_SECRET)
    token = xoauth.GenerateXOauthString(
        consumer, access, MY_EMAIL, 'imap', MY_EMAIL, nonce, timestamp)

    imap_conn = imaplib.IMAP4_SSL('imap.googlemail.com')
    imap_conn.authenticate('XOAUTH', lambda x: token)
    imap_conn.select('INBOX')

    return imap_conn

connect()

确实有效,谢谢。我该如何使用oauth包来完成它? - HankSmackHood
如果您可以容忍打印语句,那么可以继续使用xoauth,或者只需从本地副本中删除它们。我个人没有使用过oauth,但我想API类似。oauth存储库中有一个示例:oauth客户端示例 - samplebias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接