Почему поиск в gmail API возвращает другой результат, чем поиск на веб-сайте gmail?

Я использую API gmail для поиска писем от пользователей. Я создал следующий поисковый запрос:

ticket after:2015/11/04 AND -from:me AND -in:trash

Когда я запускаю этот запрос в интерфейсе браузера Gmail, я получаю 11 сообщений (как и ожидалось). Однако, когда я запускаю один и тот же запрос в API, я получаю только 10 сообщений. Код, который я использую для запроса API gmail, написан на Python и выглядит следующим образом:

searchQuery = 'ticket after:2015/11/04 AND -from:me AND -in:trash'
messagesObj = google.get('/gmail/v1/users/me/messages', data={'q': searchQuery}, token=token).data
print messagesObj.resultSizeEstimate  # 10

Я отправил одно и то же сообщение на другой адрес gmail и протестировал его с этого адреса электронной почты, и, к моему удивлению, он обнаруживается в API-поиске с другим адресом электронной почты, поэтому проблема не в самом электронном адресе.

После бесконечной отправки по электронной почте через различные учетные записи test-gmail я думаю (но не на 100% уверен), что функция поиска в браузере имеет другое определение "me". Похоже, что в API-поиске он не включает электронные письма, которые поступают с адресов электронной почты с тем же именем, в то время как эти результаты фактически включены в результат поиска браузера. Например: если "Pete Kramer" отправляет электронное письмо от [email protected] до [email protected] (оба из которых имеют свое имя на "Pete Kramer"), оно будет отображаться в браузере-поиске и не будет отображаться в API-поиске.

Кто-нибудь может подтвердить, что это проблема? И если да, есть ли способ обойти это, чтобы получить те же результаты, что и поисковый запрос браузера? Или кто-нибудь еще знает, почему результаты поиска в браузере gmail отличаются от API-поиска gmail? Все советы приветствуются!

Ответ 1

Я подозреваю, что это параметр запроса after, который дает вам проблемы. 2015/11/04 не является действительной датой ES5 ISO 8601. Вы можете попробовать альтернативу after:<time_in_seconds_since_epoch>

# 2015-11-04 <=> 1446595200

searchQuery = 'ticket AND after:1446595200 AND -from:me AND -in:trash'
messagesObj = google.get('/gmail/v1/users/me/messages', data={'q': searchQuery}, token=token).data
print messagesObj.resultSizeEstimate  # 11 hopefully!

Ответ 3

В первый раз, когда ваше приложение подключается к Gmail, или если частичная синхронизация недоступна, вы должны выполнить полную синхронизацию. При выполнении полной синхронизации ваше приложение должно извлекать и хранить как можно больше из последних сообщений или потоков, необходимых для вашей цели. Например, если ваше приложение отображает список последних сообщений, вы можете захотеть получить и кэшировать достаточное количество сообщений, чтобы разрешить гибкий интерфейс, если пользователь прокручивается за пределы первых нескольких отображаемых сообщений. Общая процедура выполнения операции полной синхронизации следующая:

  • Вызвать messages.list для извлечения первой страницы идентификаторов сообщений.

  • Создайте пакетный запрос запросов messages.get для каждого из сообщений, возвращаемых запросом списка. Если ваше приложение отображает содержимое сообщения, вы должны использовать format = FULL или format = RAW при первом обращении приложения к сообщению и кэшировании результатов, чтобы избежать дополнительных операций поиска. Если вы извлекаете ранее кэшированное сообщение, вы должны использовать format = MINIMAL, чтобы уменьшить размер ответа, поскольку могут меняться только метки.

  • Объедините обновления в свои кешированные результаты. Ваше приложение должно сохранить историю с последним сообщением (первое сообщение в ответе на список) для последующей частичной синхронизации.

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

Частичная синхронизация

Если ваше приложение синхронизировано в последнее время, вы можете выполнить частичную синхронизацию, используя метод history.list, чтобы вернуть все записи истории, более новые, чем startHistoryId, которые вы указываете в своем запросе. Записи истории содержат идентификаторы сообщений и тип изменения для каждого сообщения, такие как добавленные сообщения, удаленные или метки, измененные со времени запуска. Вы можете получить и сохранить historyId из последнего сообщения с полной или частичной синхронизации, чтобы обеспечить как startHistoryId для будущих операций частичной синхронизации.

Ограничения

Истории истории обычно доступны как минимум на одну неделю, а часто и дольше. Тем не менее, период времени, в течение которого доступны записи, может быть значительно меньше, и иногда записи могут быть недоступны в редких случаях. Если startHistoryId, предоставленный вашим клиентом, находится за пределами доступного диапазона записей истории, API возвращает ответ об ошибке HTTP 404. В этом случае ваш клиент должен выполнить полную синхронизацию, как описано в предыдущем разделе.

Из документации API gmail https://developers.google.com/gmail/api/guides/sync