it-swarm.com.de

Wie komme ich an HttpError 403 Unzureichende Berechtigungen? (gmail api, python)

Ich erhalte die folgende Fehlermeldung, wenn ich meinen Code ausführte: 

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

Das ist mein 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)

Ich lese ständig, dass ich eine Berechtigungsnachweisdatei bearbeiten muss, aber ich finde sie nicht. Ich habe Windows 7 installiert. Weiß jemand, was ich tun muss, um diesen Fehler zu überwinden? Ich bin ein totaler Noob in dieser Sache, also entschuldigen Sie mich bitte, wenn ich diesbezüglich ein bisschen Noobie sehe. Vielen Dank! 

17
semiflex

Obwohl die akzeptierte Antwort zu 100% korrekt ist. Ich denke, es lohnt sich, darauf hinzuweisen, warum dies der Fall ist.

Wenn Sie einen Google Mail-Service-Client autorisieren, können Sie verschiedene Bereiche angeben: Alle, Verfassen, Beschriftungen usw.

Dies sind alle hier aufgeführt: https://developers.google.com/gmail/api/auth/scopes

Der in der Antwort erwähnte Umfang bietet vollständigen Google Mail-Zugriff.

12
Olshansk

Gelöst wurde es durch Ändern der SCOPES-Zeile in:

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

E-Mail-Versand funktioniert einwandfrei 

9
semiflex

Die Google Mail-API hat folgende Bereiche:  gmail api scopes

Zum Versenden von E-Mails ist https://www.googleapis.com/auth/gmail.send erforderlich oder uneingeschränkter Zugriff https://mail.google.com/ .

Die Bereiche von hier .

9
apadana

Wenn Sie zuvor das offizielle " gmail-python-quickstart " ausgeführt haben, löschen Sie bitte die Datei "gmail-quickstart.json" in Ihrem System. Führen Sie Ihr Programm erneut aus, damit Sie das Privileg beliebig einstellen können. 

8
ccy

Zusätzlich zu den Antworten von:

  1. ccy
  2. apadana
  3. ragnampiza

und als eine unterstützung von ccy's antwort ...


Lösung 1 ...

... ein Hack-Fix

Wenn Sie den ursprünglichen gmail-python-quickstart-Code verwenden, müssen Sie auch Folgendes aktualisieren:

  1. CLIENT_SECRET_FILE = '/path/to/your/secret_client.json'
  2. get_credentials() die Verwendung des Logikpfads für fehlgeschlagene Anmeldeinformationen erzwingen ...

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)

True erzwingen, damit die logische Operation definitiv die client.flow-Operationen ausführt:

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)

Dies ist eine harte Fixierung, bringt Sie aber in kürzester Zeit zum Laufen. 

Das Problem...

  • Das Problem bei diesem Ansatz ist, dass er den Code flow erzwingt, wodurch der Browser des Authentifizierungsfensters geöffnet wird und der Endbenutzer vor dem Senden der E-Mail das Sicherheitsprotokoll akzeptieren muss.
  • Dies bricht offensichtlich das Konzept der automatisierten E-Mail-Generierung und -Sendung.

Lösung 2 ...

... eine stabile, automatisierte Lösung

Ich habe festgestellt, dass ich die folgenden Arbeiten mache:

  1. Kopieren Sie die heruntergeladene secret-client-####.html.json-Datei in das Verzeichnis, das im ersten Codeblock der get_credentials()-Methode definiert ist. Kopieren Sie es grundsätzlich in Ihr user/.credentials-Verzeichnis
  2. Lösche den aktuellen gmail-python-quickstart.json
  3. Benennen Sie Ihre heruntergeladene Datei in gmail-python-quickstart.json um.

Führen Sie Ihren Code aus und dann sollte es funktionieren.

Leistungen...

  • Die Authentifizierungsseite wird nicht angezeigt
  • Die E-Mail wird automatisch gesendet
1
Andrew

Wenn Sie das offizielle Beispiel von Google verwendet haben, sollte sich im ~/.credentials/-Verzeichnis ein Ordner befinden, der alt ist. Entfernen Sie alles in diesem Verzeichnis und führen Sie den Code erneut aus. dann müssen Sie neue Berechtigungen hinzufügen und dann ist alles in Ordnung!

1
Iman Mirzadeh