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
La API de Gmail tiene estos ámbitos:
Para enviar correos electrónicos, se necesita https://www.googleapis.com/auth/gmail.send o acceder a https://mail.google.com/ .
Los ámbitos tomados de aquí .
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:
- ccy
- apadana
- 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:
- CLIENT_SECRET_FILE =
''/path/to/your/secret_client.json''
- 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:
- Copie el archivo descargado el
secret-client-####.html.json
en el directorio definido en el primer bloque de código del métodoget_credentials()
. Básicamente, cópielo en su directorio deuser/.credentials
- Eliminar el actual
gmail-python-quickstart.json
- 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