#python-2.7 #gmail-api
#python-2.7 #gmail-api
Вопрос:
Недавно я попробовал свои силы в новом API Gmail. И, похоже, все работает нормально, кроме одного. Моя проблема заключается в следующем:
Я работаю над проектом администратора, которому может потребоваться сгенерировать более одного электронного письма менее чем за минуту в рабочее время. Поэтому только для целей тестирования я запускаю следующий код, который работает нормально:
if __name__ == '__main__':
service = setup() //Simply an helper function to do the basic credential check. Works fine!
print('service:' str(service))
for counter in range(1, 10):
print('Sending message ' str(counter))
message = create_message(<SENDER_EMAIL_ID>,<RECEIVER_EMAIL_ID>, "Email Number: " str(counter) , "Sample text")
response = send_message(service, 'me' , message)
print(response)
Функция setup () выглядит следующим образом:
credentials = get_credentials()
http = credentials.authorize(httplib2.Http())
service = discovery.build('gmail', 'v1', http=http)
Теперь, когда я запускаю код, скажем, три раза подряд менее чем за минуту, код работает нормально, и я могу видеть все 27 электронных писем в папке «Отправленные» идентификатора ОТПРАВИТЕЛЯ электронной почты с помощью веб-браузера. И, таким образом, Gmail API отправляет все сообщения всякий раз, когда делается запрос. Однако только некоторые из этих электронных писем поступают в RECEIVER_EMAIL_ID, а остальные просто отбрасываются.
Однако, если я запускаю программу, скажем, с задержкой в 2-5 минут, тогда все письма будут получены.
Я понятия не имею, почему это так.
Любая помощь была бы очень признательна. 🙂
Комментарии:
1. Я могу себе представить, что API применяет какое-то мягкое ограничение скорости, поэтому я бы предложил сравнить
response
данные при вызовеsend_message()
иresponse
для последующих вызововget_message()
и посмотреть, как ответы отличаются между немедленно отправленными, отложенными и удаленными электронными письмами.2. Мне жаль, что я должен был упомянуть. Я проверяю полученные письма непосредственно с помощью браузера. Поэтому я просто использую send_message(). Также ответ, который я получаю на каждый отправляемый запрос, выглядит следующим образом:
Sent Message: {u'labelIds': [u'SENT'], u'id': u'157bce1438e5db28', u'threadId': u'157bce1438e5db28'}
3. Итак, в вашем ответе нет ошибок, он возвращает ресурс Users.messages для всех элементов в цикле, но только некоторые из них были получены получателем? Кроме того, что вы подразумеваете под «удалением» — ошибка отправки?
4. Я проверю User.messages.resource. Но что я подразумеваю под «удалением», так это то, что операция отправки успешно выполняется в терминале, где в данный момент выполняется код, и отправленный почтовый ящик с идентификатором ОТПРАВИТЕЛЯ электронной почты с помощью браузера. Однако почтовый ящик RECEIVER_EMAIL_ID, к которому осуществляется доступ с помощью браузера, не отражает эти электронные письма.
Ответ №1:
Чтобы подробнее рассказать об ответе @ken-y-n в разделе комментариев, API GMail имеет ограничения на использование. В частности, для этого продукта ежедневное использование составляет около
- 1 миллиард единиц квоты / день
- 250 единиц квоты / пользователь / секунда
Возможно, вы столкнулись с rateLimitExceeded
ошибкой во время тестирования.
Поскольку вы отправляете электронные письма через цикл, это будет стоить вам около 100 единиц при вызове send
(плюс другие расходы в зависимости от методов, которые вы вызываете). Именно по этой причине некоторые электронные письма, похоже, были удалены. Вы можете противостоять этому, реализовав экспоненциальную отсрочку для сообщений, которые не удалось отправить.
Другой альтернативой вместо запуска его через цикл является использование пакетных запросов, которые группируют ваши вызовы API вместе, чтобы уменьшить количество HTTP-подключений, создаваемых вашим приложением.
Комментарии:
1. Спасибо за это! Я изучу ограничения квот. Тем не менее, я все же хотел подтвердить, нормально ли видеть все эти пакетные электронные письма в папке «отправленные», используя браузер для идентификатора ОТПРАВИТЕЛЯ электронной почты. Кроме того, как я уже упоминал, я не получил никакого другого ответа на удаленные электронные письма. Мой ответ на все отправленные запросы был следующим:
Sent Message: {u'labelIds': [u'SENT'], u'id': u'157bce1438e5db28', u'threadId': u'157bce1438e5db28'}