python - sirve - usa imaplib y oauth para la conexión con Gmail
send email python gmail api (3)
Aquí hay un ejemplo de conexión a IMAP usando rutinas presentes en xoauth.py
de Google. Emitirá cierta información de depuración, por lo que probablemente desee cambiar al uso del paquete oauth para una aplicación real. Al menos esto debería comenzar:
import imaplib
import random
import time
import xoauth
MY_EMAIL = ''[email protected]''
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()
Quiero usar Oauth para conectarme a Gmail en Python. Ahora mismo tengo el script xoauth.py de Google ( enlace ), y la generación de un token funciona bien, pero ¿cómo puedo usar eso en otro script? Va a estar en Django.
En este momento, mi secuencia de comandos inicia sesión de esta manera:
m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login("[email protected]", "password")
Pero quiero algo más seguro.
Aquí hay un ejemplo que usa el módulo oauth2
para autenticarse usando oauth, tomado del archivo léame:
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/[email protected]/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()
Bastante más limpio que usar xoauth
.
Google tiene un buen código de ejemplo para hacer OAuth2 e IMAP . También asegúrese de que su alcance sea correcto.
''scope'': ''https://mail.google.com/''
''access_type'': ''offline''
Debajo está el ejemplo del código en el ejemplo de google
import base64
import imaplib
my_email = "[email protected]"
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