Je continue à recevoir l'erreur suivante lorsque j'exécute mon code:
An error occurred: <HttpError 403 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Insufficient Permission">
Ceci est mon code:
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)
Je continue à lire que je dois modifier un fichier d'informations d'identification, mais je n'arrive pas à le trouver. J'ai Windows 7 installé. Est-ce que quelqu'un sait ce que je dois faire pour surmonter cette erreur? Je suis un noob total à ce sujet alors veuillez m'excuser si je semble un peu nooby à ce sujet Merci!
Même si la réponse acceptée est correcte à 100%. Je pense que cela vaut la peine de souligner que c'est la raison.
Lorsque vous autorisez un client du service Gmail, vous pouvez spécifier plusieurs portées différentes: Toutes, composer, étiquettes, etc.
Ceux-ci sont tous énumérés ici: https://developers.google.com/gmail/api/auth/scopes
La portée mentionnée dans la réponse fournit un accès complet à Gmail.
Résolu en modifiant la ligne SCOPES en:
SCOPES = 'https://mail.google.com/'
L'envoi d'email fonctionne parfaitement
L'API Gmail a les portées suivantes:
https://www.googleapis.com/auth/gmail.send est nécessaire ou vous devez disposer d'un accès complet - https://mail.google.com/ .
Les portées prises de ici .
Si vous exécutez le " gmail-python-quickstart " officiel auparavant, veuillez supprimer le fichier "gmail-quickstart.json" sur votre système. Relancez votre programme pour que vous puissiez définir le privilège comme vous le souhaitez.
En plus des réponses de:
et en guise d'avancement de la réponse de ccy ...
Si vous utilisez le code gmail-python-quickstart
d'origine, veillez également à mettre à jour les éléments suivants:
'/path/to/your/secret_client.json'
get_credentials()
à utiliser le chemin logique des informations d'identification ayant échoué ...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)
pour forcer True
de sorte que l'opération logique fonctionne définitivement avec les opérations 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)
Ceci est une solution de hacky, mais vous permettra de vous lever et aller dans peu de temps.
flow
, qui ouvre le navigateur de la fenêtre d’authentification et nécessite que l’utilisateur final accepte le protocole de sécurité avant d’envoyer le courrier électronique.J'ai trouvé que faire les travaux suivants:
secret-client-####.html.json
dans le répertoire défini dans le premier bloc de code à partir de la méthode get_credentials()
. Fondamentalement, copiez-le dans votre répertoire user/.credentials
gmail-python-quickstart.json
actuelgmail-python-quickstart.json
Exécutez votre code, puis cela devrait fonctionner correctement.
Si vous avez utilisé l'exemple officiel de Google, il devrait y avoir un dossier dans le répertoire ~/.credentials/
qui est ancien, supprimez tout ce qui se trouve dans ce répertoire et réexécutez votre code. alors vous devez ajouter de nouvelles autorisations et tout est OK!