2016-07-27 2 views
1

Недавно Google отключил свою «устаревшую» возможность загрузки, поэтому мне пришлось изменить наши приложения, чтобы использовать пользователей Google(). Messages(). Send api.Отправить крупный адрес электронной почты через API Gmail в Python

Однако это не работает ни на чем более чем 5mb. Я видел одно сообщение на www о том, как это сделать в PHP, но ничего в Python.

Вот мой существующий код:

http  = #My login routine 
service  = build('gmail','v1',http=http) 
email  = {'raw':base64.urlsafe_b64encode(message)} 
reply  = (service.users().messages().send(userId=user,body=email).execute()) 

Google имеет обширную документацию, но не на конкретной возможности отправлять большие сообщения электронной почты в Python. На самом деле на этой странице:

https://developers.google.com/gmail/api/v1/reference/users/messages/send

Они говорят об использовании базового API для отправки сообщений, как большой, как 35MB, но это просто не работает. Я получаю ошибку «ResponseNotReady()».

Я читал о загружаемых фрагментах, возобновляемых загрузках, но ничего не пришло в себя.

Любые мысли там?

+0

У меня была та же проблема [два года назад] (http://stackoverflow.com/questions/24908700/mail-attachment-wrong-media-type-gmail-api/24957873#24957873), и мне пришлось идти вне официальной клиентской библиотеки (см. править в конце ответа). Короче: не кодируйте сообщение и используйте простой URL-адрес загрузки с помощью Content-Type 'message/rfc822'. – Tholle

+0

Любые мысли о возможности создания формата URL из Python? – AaronF

ответ

0

У меня была такая же проблема two years ago, и я до сих пор считаю, что единственный способ отправлять сообщения с большими вложениями - обходить официальную клиентскую библиотеку.

Это пример, используя библиотеку requests вместо того, чтобы:

url = 'https://www.googleapis.com/gmail/v1/users/me/messages/send?uploadType=multipart' 
headers = { 
    'Authorization': 'Bearer ' + accessToken, 
    'Content-Type': 'message/rfc822' 
} 
requests.post(url, headers=headers, payload=message) 

Сообщение не кодируется. Я думаю, вы можете извлечь токен доступа из объекта службы, но я точно не знаю, как это сделать.

+0

Можете ли вы придумать перевод из библиотеки запросов на собственный объект HTTPSConnection? Я не хочу устанавливать другую библиотеку ... это просто еще один диск для управления, хотя я вижу его преимущества. – AaronF

+0

@AaronF Я обычно делаю глупые ошибки, используя библиотеку запросов нижнего уровня, поэтому, я думаю, я не думаю, что буду помогать. – Tholle

+0

Ха, я знаю, что вы имеете в виду. В любом случае спасибо :) – AaronF

Смежные вопросы