Я пытаюсь использовать API Gmail для синхронизации всех электронных писем из почтового ящика пользователя Gmail. Я использую метод частичной синхронизации, описанный в документации Gmail «Синхронизация клиентов» [1]. Одним из перечисленных ограничений является то, что в редких случаях история некоторых электронных писем недоступна. При таких обстоятельствах рекомендуется, чтобы клиент использовал «полную синхронизацию», в которой говорится, что клиент должен «извлекать и хранить столько самых последних сообщений или потоков, сколько необходимо для вашей цели».
Это все имеет смысл. Когда у меня возникают проблемы с частичной синхронизацией, я пытаюсь просмотреть сообщения входящих сообщений по временному диапазону. Для этого я эффективно сохраняю запись ( emailAddress, historyId, internalDate )
каждой электронной почты, которую я синхронизирую, а затем, когда я возвращаюсь к полной синхронизации, я пытаюсь синхронизировать всю электронную почту начиная с самой последней internalDate
, которую я уже синхронизировал.
Моя проблема заключается в том, что случаи, которые, по-видимому, приводят к сбою частичной синхронизации, также приводят к сбою полной синхронизации, и многие из этих случаев вызваны сообщениями с internalDates
в будущем (I не могу поделиться этими примерами по соображениям конфиденциальности). Случай сбоя выглядит примерно так:
- Я синхронизирую электронную почту E с historyId H и внутренней датой I в будущем
- проходит некоторое время
- Я получаю push-уведомление от Google, указывающее, что это новые письма для синхронизации
- Я ищу самое последнее сообщение, которое у меня есть syncecd для этого inboxId, в поиске электронной почты E
- Я пытаюсь выполнить частичную синхронизацию, используя конечную точку listHistory [2] с historyId H
- Сбой запроса listHistory с 404
- Я пытаюсь выполнить полную синхронизацию, используя конечную точку listMessages [3], используя запрос
newer_than:{hours_since-internalDate-I}
, но этот запрос не имеет никакого смысла, поскольку internalDate
этого сообщения находится в будущем.
Я могу представить несколько разных решений этой проблемы. Возможно, я должен просто игнорировать эти электронные письма как спам, или, возможно, я должен сохранить временную метку, когда я синхронизировал каждое электронное письмо, а затем выполнить полную синхронизацию с временной меткой, которую я сохранил.
В любом случае, это похоже на ошибку в Gmail API, поскольку internalDate
действительно должно быть, когда Gmail получил электронное письмо. Сначала я подозревал, что это может быть вызвано новой функцией расписания Gmail и что internalDate
может быть, когда электронная почта была запланирована в будущем, но я подтвердил, что некоторые из моих примеров, безусловно, относятся к электронным письмам, которые входят в почтовый ящик пользователя * 1034. * получено , а не отправлено . На самом деле не уверен, что делать с этим краевым корпусом в internalDate
API.
Итак, мой вопрос, каков рекомендуемый способ справиться с фальшивым будущим internalDates
? И это ошибка?
- https://developers.google.com/gmail/api/guides/sync
- https://developers.google.com/gmail/api/v1/reference/users/history/list
- https://developers.google.com/gmail/api/v1/reference/users/messages/list