Проблема с URL-адресом перенаправления с Gmail Api и использованием OAuth в Python - PullRequest
0 голосов
/ 25 мая 2020

Я хочу отправить электронное письмо с помощью протокола Gmail OAuth с адреса Python. Для некоторой предыстории общий процесс моей программы требует ввода данных пользователем, создает изображение, а затем отправляет электронное письмо. Теоретически в какой-то момент программа может отправлять сотни электронных писем. Проблема, с которой я столкнулся, заключалась в том, что когда я пытался получить токен для OAuth, я получил ошибку URL-адреса неавторизованного перенаправления. Приложение не было проверено, и у меня нет учетной записи администратора G Suite, но в каждом руководстве, которое я просматриваю, это не упоминается. Единственные URL-адреса перенаправления, которые я включил, - это https://developers.google.com/oauthplayground и http://localhost:8080/oauth2callback, которые находятся в файле client_secret. json, который я загружаю со страницы учетных данных на сайте разработчиков Google.

Вот что у меня есть:

import base64
import httplib2
from email.mime.text import MIMEText
from apiclient.discovery import build
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import run

# Path to the client_secret.json file downloaded from the Developer Console
CLIENT_SECRET_FILE = 'client_secret.json'

# Check https://developers.google.com/gmail/api/auth/scopes for all available scopes
OAUTH_SCOPE = 'https://www.googleapis.com/auth/gmail.compose'

# Location of the credentials storage file
STORAGE = Storage('gmail.storage')

# Start the OAuth flow to retrieve credentials
flow = flow_from_clientsecrets(CLIENT_SECRET_FILE, scope=OAUTH_SCOPE)
http = httplib2.Http()

# Try to retrieve credentials from storage or run the flow to generate them
# This is where it fails.
credentials = STORAGE.get()
if credentials is None or credentials.invalid:
  credentials = run(flow, STORAGE, http=http)

# Authorize the httplib2.Http object with our credentials
http = credentials.authorize(http)

# Build the Gmail service from discovery
gmail_service = build('gmail', 'v1', http=http)

# create a message to send
message = MIMEText("Message goes here.")
message['to'] = "my_email@gmail.com"
message['from'] = "my_email@gmail.com"
message['subject'] = "your subject goes here"
body = {'raw': base64.b64encode(message.as_string())}

# send it
try:
  message = (gmail_service.users().messages().send(userId="me", body=body).execute())
  print('Message Id: %s' % message['id'])
  print(message)
except Exception as error:
  print('An error occurred: %s' % error)

1 Ответ

0 голосов
/ 22 июня 2020

Это обсуждалось более подробно в комментариях.

В основном, когда вы создаете приложение, которое взаимодействует со службами Google, пользователь должен принять области, которые будет иметь ваше приложение. Это означает, что вам нужно создать Экран согласия Oauth .

Итак, вы go в свой проект в Google Console Cloud , там выберите Api & Сервисы> Экран согласия OAuth или go на по этой ссылке . Чтобы создать этот экран согласия OAuth, вам будет предложено два варианта:

  • Внутренний: Только для учетных записей G Suite ваше приложение будет доступно только членам вашей организации
  • Внешний: Единственный вариант для учетных записей НЕ G Suite, если вы получаете доступ к «мощным» областям, приложение необходимо будет проверить, в противном случае оно будет помечено как непроверенное.

Для вашего случая (который кажется личным использованием / разработкой) просто go впереди и для работы с непроверенным приложением выберите Внешнее .

OAuth Consent Screen creation

You can see that in fact google is pointing out that I need verification but on creation I get prompted with a screen explaining that my app is an непроверенное приложение

Экран OAuth

Используйте только в личных целях (максимальное количество пользователей - 100).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...