Как обойти HttpError 403 Недостаточное разрешение? (gmail api, python)

Я продолжаю получать следующую ошибку при выполнении моего кода:

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

Это мой код:

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 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)

Я продолжаю читать, что мне нужно отредактировать файл учетных данных, но я не могу найти его. У меня установлен Windows 7. Кто-нибудь знает, что мне нужно сделать, чтобы пройти эту ошибку? Я полный ноб в этом, поэтому, пожалуйста, извините меня, если я немного поразмыслил об этом. Благодарю!

Ответ 1

Несмотря на то, что принятый ответ на 100% правильный. Я думаю, стоит отметить, почему это дело.

Когда вы разрешаете клиенту службы gmail, вы можете указать несколько разных областей: Все, составить, метки и т.д.

Все они перечислены здесь: https://developers.google.com/gmail/api/auth/scopes

Объем, указанный в ответе, обеспечивает полный доступ к Gmail.

Ответ 3

Решил его, изменив строку SCOPES на:

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

Отправка электронной почты отлично работает

Ответ 4

Если вы запустили официальный " gmail-python-quickstart", удалите файл "gmail-quickstart.json" в своей системе, Повторно запустите свою программу, чтобы вы могли установить привилегию по своему усмотрению.

Ответ 5

В дополнение к ответам от:

  • CCY
  • Apadana
  • ragnampiza

и в качестве дальнейшего ответа ccy...


Решение 1...

... исправление хака

Если вы используете оригинальный код gmail-python-quickstart, обязательно обновите следующее:

  • CLIENT_SECRET_FILE = '/path/to/your/secret_client.json'
  • Принудительно get_credentials() использовать логический путь неудачных учетных данных...

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 так, чтобы логическая операция, безусловно, работала с операциями 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)

Это взломанное исправление, но вы получите в кратчайшие сроки.

Проблема...

  • Проблема с этим подходом заключается в том, что он заставляет код flow, который открывает браузер окна проверки подлинности и требует, чтобы конечный пользователь принял протокол безопасности перед отправкой электронной почты.
  • Это, очевидно, нарушает концепцию автоматической генерации и отправки электронной почты.

Решение 2...

... стабильное, более автоматизированное решение

Я обнаружил, что выполнение следующих работ:

  • Скопируйте загруженный файл secret-client-####.html.json в каталог, определенный в первом блоке кода, из метода get_credentials(). В основном скопируйте его в каталог user/.credentials
  • Удалить текущий gmail-python-quickstart.json
  • Переименуйте загруженный файл в gmail-python-quickstart.json

Запустите свой код, а затем он должен работать нормально.

Преимущества...

  • Страница аутентификации не отображается
  • Письмо отправляется автоматически

Ответ 6

Если вы использовали официальный официальный пример Google, должна быть папка в каталоге ~/.credentials/, которая является старой, удаляет все внутри этого каталога и повторно запускает ваш код. то вам нужно добавить новые разрешения, и тогда все будет в порядке!