www googleapis auth python api gmail

python - googleapis - gmail api permissions



¿Cómo puedo evitar el HttpError 403 Permiso insuficiente?(api de gmail, python) (5)

Si ejecuta el " gmail-python-quickstart " oficial anteriormente, elimine el archivo "gmail-quickstart.json" en su sistema. Vuelva a ejecutar su programa para que pueda establecer el privilegio como lo desee.

Sigo recibiendo el siguiente error cuando ejecuto mi código:

An error occurred: <HttpError 403 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Insufficient Permission">

Este es mi código:

import httplib2 import os from httplib2 import Http from apiclient import discovery import oauth2client from oauth2client import client from oauth2client import tools try: import argparse flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args() except ImportError: flags = None #SCOPES = ''https://www.googleapis.com/'' SCOPES = ''https://www.googleapis.com/auth/gmail.compose'' CLIENT_SECRET_FILE = ''client_secret.json'' APPLICATION_NAME = ''Gmail API Quickstart'' def get_credentials(): """Gets valid user credentials from storage. If nothing has been stored, or if the stored credentials are invalid, the OAuth2 flow is completed to obtain the new credentials. Returns: Credentials, the obtained credential. """ home_dir = os.path.expanduser(''~'') credential_dir = os.path.join(home_dir, ''.credentials'') if not os.path.exists(credential_dir): os.makedirs(credential_dir) credential_path = os.path.join(credential_dir, ''gmail-quickstart.json'') store = oauth2client.file.Storage(credential_path) credentials = store.get() if not credentials or credentials.invalid: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatability with Python 2.6 credentials = tools.run(flow, store) print ''Storing credentials to '' + credential_path return credentials def CreateMessage(sender, to, subject, message_text): """Create a message for an email. Args: sender: Email address of the sender. to: Email address of the receiver. subject: The subject of the email message. message_text: The text of the email message. Returns: An object containing a base64 encoded email object. """ message = MIMEText(message_text) message[''to''] = to message[''from''] = sender message[''subject''] = subject return {''raw'': base64.b64encode(message.as_string())} testMessage = CreateMessage(''ENTER SENDERS EMAIL ADDRESS'', ''ENTER RECEIVERRS EMAIL ADDRESS'', ''ENTER SUBJECT'', ''ENTER EMAIL BODY'') def SendMessage(service, user_id, message): """Send an email message. Args: service: Authorized Gmail API service instance. user_id: User''s email address. The special value "me" can be used to indicate the authenticated user. message: Message to be sent. Returns: Sent Message. """ try: message = (service.users().messages().send(userId=user_id, body=message) .execute()) print ''Message Id: %s'' % message[''id''] return message except errors.HttpError, error: print ''An error occurred: %s'' % error testSend = SendMessage(service, ''me'', testMessage)

Sigo leyendo que necesito editar un archivo de credenciales, pero parece que no puedo encontrarlo. Tengo Windows 7 instalado. ¿Alguien sabe lo que debo hacer para superar este error? Soy un novato total en esto, así que discúlpeme si me parece un poco nooby sobre esto. ¡Gracias!


Lo resolvió cambiando la línea SCOPES a:

SCOPES = ''https://mail.google.com/''

El envío de correos electrónicos funciona perfectamente



Aunque la respuesta aceptada es 100% correcta. Creo que vale la pena señalar que ese es el caso.

Cuando autoriza un cliente de servicio de Gmail, puede especificar varios ámbitos diferentes: Todos, redactar, etiquetas, etc.

Estos se enumeran aquí: https://developers.google.com/gmail/api/auth/scopes

El alcance mencionado en la respuesta proporciona acceso completo a Gmail.


Además de las respuestas de:

  1. ccy
  2. apadana
  3. ragnampiza

y como adelanto de la respuesta de ccy ...

Solución 1 ...

... una solución de hackeo

Si está utilizando el código original de gmail-python-quickstart , asegúrese de actualizar también lo siguiente:

  1. CLIENT_SECRET_FILE = ''/path/to/your/secret_client.json''
  2. Forzar get_credentials() para usar la ruta lógica de credenciales fallidas ...

if True: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print(''Storing credentials to '' + credential_path)

para forzar True para que la operación lógica definitivamente funcione las operaciones client.flow :

if True: flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) flow.user_agent = APPLICATION_NAME if flags: credentials = tools.run_flow(flow, store, flags) else: # Needed only for compatibility with Python 2.6 credentials = tools.run(flow, store) print(''Storing credentials to '' + credential_path)

Esta es una solución hacky, pero te hará funcionar en poco tiempo.

El problema...

  • El problema con este enfoque es que obliga al código de flow , que abre el navegador de la ventana de autenticación y requiere que el usuario final acepte el protocolo de seguridad antes de enviar el correo electrónico.
  • Obviamente, esto rompe el concepto de generación y envío automático de correo electrónico.

Solución 2 ...

... una solución estable y más automatizada

Encontré que hacer los siguientes trabajos:

  1. Copie el archivo descargado el secret-client-####.html.json en el directorio definido en el primer bloque de código del método get_credentials() . Básicamente, cópielo en su directorio de user/.credentials
  2. Eliminar el actual gmail-python-quickstart.json
  3. Cambie el nombre de su archivo descargado a gmail-python-quickstart.json

Ejecute su código, y luego debería funcionar bien.

Beneficios ...

  • La página de autenticación no aparece
  • El correo electrónico se envía automáticamente