Я использую Gmail Api для отправки электронной почты на python, но похоже, что он не работает с Python 3.4.
Вот код:
msg = MIMEText(html, 'html')
SCOPES = ['https://www.googleapis.com/auth/gmail.send']
username = '[email protected]'
CLIENT_SECRET_FILE = '/client_secret.json'
credentials = ServiceAccountCredentials.from_json_keyfile_name(CLIENT_SECRET_FILE, SCOPES)
try:
http_auth = credentials.authorize(Http())
service = discovery.build('gmail', 'v1', http=http_auth)
gmailMsg = {'raw': base64.urlsafe_b64encode(msg.as_string().encode('utf-8')).decode('utf-8')}
message = (service.users().messages().send(userId = username, body = gmailMsg).execute())
Ошибка:
<HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Bad Request">
Для справки, учетные данные, которые я создал для своего проекта, представляют собой учетную запись службы для платформы, отличной от пользовательского интерфейса (сервер-сервер). Я подумал, что, возможно, объект gmailMsg был закодирован неправильно. Но когда я использовал его в Google Apis Explorer, угадайте, что: это сработало. Единственная разница, которую я вижу, заключается в том, что в Python JSON использует одинарные кавычки, а в Google API Explorer мне пришлось использовать двойные кавычки.
У кого-нибудь есть рекомендации?
P/S: я пробовал следующие варианты кодирования:
base64.urlsafe_b64encode(msg.as_string().encode('utf-8')).decode('utf-8')
base64.urlsafe_b64encode(msg.as_string().encode('utf-8')).decode('ascii')
base64.urlsafe_b64encode(msg.as_string().encode('ascii')).decode('ascii')
base64.urlsafe_b64encode(msg.as_bytes()).decode('utf-8')
base64.urlsafe_b64encode(msg.as_bytes()).decode('ascii')
base64.urlsafe_b64encode(msg.as_bytes()).decode()
Изменить: интересно, я пытался использовать Label Api, который не требует тела. Но я получил ту же ошибку. Единственные изменения:
SCOPES = ['https://www.googleapis.com/auth/gmail.labels']
message = (service.users().labels().list(userId = username).execute())