IMAP, отслеживание перемещенных сообщений с использованием идентификатора сообщения

Мы разрабатываем почтовый клиент, написанный на Java. Он имеет те же функции, что и Outlook, Thunderbird и т. Д. Он напрямую связывается с почтовым сервером. Кроме того, наши бизнес-правила требуют, чтобы мы хранили все сообщения в нашей базе данных, а сообщения всегда должны быть синхронизированы. Я знаю, что это не очень подходит для IMAP, но мы должны хранить все в нашей базе данных. Возникает вопрос, как отследить IMAP-сообщение, перемещенное из папки A в папку B? Как мы можем получить информацию об этом? Если вы удаляете сообщение из A, оно удаляется из A и создается заново в B, в результате: значение UID сообщения изменяется. Можем ли мы полагаться на MessageID, найденный в заголовках? Я проверил некоторые почтовые серверы и увидел, что идентификатор сообщения в заголовках остается неизменным. Но я где-то читал, что messageids может быть пустым в зависимости от почтового сервера.

  • Всегда ли MessageID в заголовках установлен, могут ли случаи или почтовые серверы оставаться пустыми?
  • Являются ли значения MessageID в заголовках уникальными в папке IMAP?
  • Возможно ли, что он изменяется при перемещении сообщения или изменении UIDVALIDITY папок?
  • Как насчет установки пользовательского заголовка во время выборки? Когда я добавлю пару нестандартных имен заголовков, будет ли она храниться на почтовом сервере или возможно, что нестандартные почтовые хейдеры будут удалены почтовым сервером? Это плохая идея применить нестандартное значение заголовка?

    IMAPMessage m;
    m.setHeader("myHeader", "myValue");
    
  • Были некоторые предложения в stackru, говорится, что он генерирует хеш, включая messageId и другие параметры, такие как отправитель, тема и т. Д. Это безопасный подход? Мы можем получить конфликты, если не указан уникальный MessageID или отсутствует MessageID.

1 ответ

Есть три вещи, которые вы можете сделать.

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

Во-вторых, x-gm-msgid. Это особенность gmail, 63-битное число, которое никогда не меняется. Если два сообщения имеют одинаковый x-gm-msgid, они совпадают.

В-третьих, код ответа COPYUID сообщает вам о перемещениях, но применяется только тогда, когда вы делаете перемещение, а не когда это делает кто-то другой.

Вместе они должны дать вам довольно хорошее представление о том, как меняются почтовые ящики пользователя.

Другие вопросы по тегам