Почему поиск в 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!
Ответ 2
Параметр q
/messages/list
работает так же, как и в веб-интерфейсе для меня (проверено на https://developers.google.com/gmail/api/v1/reference/users/messages/list#try-it)
Я думаю, проблема в том, что вы вызываете /messages
, а не /messages/list
Ответ 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