Вопрос: Gmail Api, возвращающий электронные письма с внутренними датами в будущем - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь использовать API Gmail для синхронизации всех электронных писем из почтового ящика пользователя Gmail. Я использую метод частичной синхронизации, описанный в документации Gmail «Синхронизация клиентов» [1]. Одним из перечисленных ограничений является то, что в редких случаях история некоторых электронных писем недоступна. При таких обстоятельствах рекомендуется, чтобы клиент использовал «полную синхронизацию», в которой говорится, что клиент должен «извлекать и хранить столько самых последних сообщений или потоков, сколько необходимо для вашей цели».

Это все имеет смысл. Когда у меня возникают проблемы с частичной синхронизацией, я пытаюсь просмотреть сообщения входящих сообщений по временному диапазону. Для этого я эффективно сохраняю запись ( emailAddress, historyId, internalDate ) каждой электронной почты, которую я синхронизирую, а затем, когда я возвращаюсь к полной синхронизации, я пытаюсь синхронизировать всю электронную почту начиная с самой последней internalDate, которую я уже синхронизировал.

Моя проблема заключается в том, что случаи, которые, по-видимому, приводят к сбою частичной синхронизации, также приводят к сбою полной синхронизации, и многие из этих случаев вызваны сообщениями с internalDates в будущем (I не могу поделиться этими примерами по соображениям конфиденциальности). Случай сбоя выглядит примерно так:

  1. Я синхронизирую электронную почту E с historyId H и внутренней датой I в будущем
  2. проходит некоторое время
  3. Я получаю push-уведомление от Google, указывающее, что это новые письма для синхронизации
  4. Я ищу самое последнее сообщение, которое у меня есть syncecd для этого inboxId, в поиске электронной почты E
  5. Я пытаюсь выполнить частичную синхронизацию, используя конечную точку listHistory [2] с historyId H
  6. Сбой запроса listHistory с 404
  7. Я пытаюсь выполнить полную синхронизацию, используя конечную точку listMessages [3], используя запрос newer_than:{hours_since-internalDate-I}, но этот запрос не имеет никакого смысла, поскольку internalDate этого сообщения находится в будущем.

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

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

Итак, мой вопрос, каков рекомендуемый способ справиться с фальшивым будущим internalDates? И это ошибка?

  1. https://developers.google.com/gmail/api/guides/sync
  2. https://developers.google.com/gmail/api/v1/reference/users/history/list
  3. https://developers.google.com/gmail/api/v1/reference/users/messages/list

1 Ответ

1 голос
/ 25 июля 2019

Если вы уверены, что это ошибка, вы можете зайти в систему отслеживания проблем Google (шаблон здесь ) и сообщить об этом, чтобы их команда инженеров могла посмотреть и выяснить, что является причиной этой ошибки.В качестве альтернативы, если это сохраняется для других писем или пользователей, вы можете открыть заявку в службу поддержки непосредственно с ними, зайдя на панель управления admin и выбрав «Связаться со службой поддержки» в?меню в правом верхнем углу.Таким образом, Google может взглянуть на ошибочные внутренние даты без необходимости публиковать потенциально конфиденциальные данные на общедоступном форуме.

В то же время вы можете обойти это динамически, убедившись, что вы этого не сделаетеизвлекать письма со временем в будущем (псевдо-код):

var now = new Date().getTime()
var q = "newer_than:1h before:" + now

GmailServiceConnect.Users.messages.list(userId = "user@domain.ext", q = q).execute()

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

...