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 сообщает вам о перемещениях, но применяется только тогда, когда вы делаете перемещение, а не когда это делает кто-то другой.
Вместе они должны дать вам довольно хорошее представление о том, как меняются почтовые ящики пользователя.