Как определить UID сообщения в IMAP
-
23-09-2019 - |
Вопрос
Я работаю в проекте почтового клиента с использованием C #.Я использую как протокол POP, так и протокол IMAP для связи с сервером.Проблема в том, что я не могу понять, почему, когда я хочу получить UID для сообщения, результат от POP-сервера и IMAP-сервера отличается.
POP
C: UIDL 1
S: +OK 1 UID2-1269789826
и
IMAP
C: $ FETCH 1 (UID)
S: * 1 FETCH (UID 2)
S: $ OK Fetch completed.
Почему результат для получения UID так отличается?В IMAP есть еще одна функция для этого?Любая помощь приветствуется.Спасибо.
Решение
POP3 и IMAP - это два разных протокола.Идентификаторы UID, используемые этими двумя протоколами, не связаны и вообще не должны быть одинаковыми.Фактически, UID POP3 - это произвольная строка, в то время как UID IMAP - это 32-разрядное число (передается в виде строки).
Теоретически, можно написать почтовый сервер, который поддерживает как IMAP, так и POP3, использующий один и тот же UID для обоих протоколов, но я не знаю ни одного сервера, который действительно делал бы это. На практике вы должны рассматривать UIDS POP3 и IMAP UIDS как несвязанные значения.
RFC 1939 (POP3):Уникальный идентификатор сообщения представляет собой произвольную строку, определяемую сервером, состоящую от одного до 70 символов в диапазоне от 0x21 до 0x7E, которая однозначно идентифицирует сообщение в maildrop и которая сохраняется во всех сеансах.
RFC 3501 (IMAP):(Атрибут сообщения с уникальным идентификатором (UID) - это) 32-разрядное значение, присваиваемое каждому сообщению, которое при использовании со значением достоверности уникального идентификатора (см. Ниже) формирует 64-разрядное значение, которое НЕ ДОЛЖНО ВЕЧНО ссылаться на какое-либо другое сообщение в почтовом ящике или любой последующий почтовый ящик с тем же именем.
Другие советы
Очень важный факт IMAP
Это то, чему я научился, играя с GMail (я ожидаю, что другие системы будут такими же):
- Отправил сообщение на мой почтовый ящик
- Он имеет жидкость 45
- Переместить сообщение в мусорное ведро
- Теперь он имеет UID 5 (поскольку UID уникален для каждого почтового ящика).
- Переместите его обратно во входящие
- Теперь у него есть UID 46
- Переместите его обратно в мусор
- Теперь у него есть UID 6
- Уловите идею...
Я переместил сообщения, используя GMail.com Пользовательский интерфейс
Насколько я могу судить, UID полезен только для поиска последних писем в папке.Вы можете запустить команду Search("ПоискUID 34:*
), чтобы получить все сообщения в папке с UID 34 или выше.
Но не начинайте использовать UID в качестве ключа к этому сообщению в базе данных, иначе вы получите дубликаты.
Я думаю, что я собираюсь потратить полученное время и хэшировать его с содержимым сообщения, чтобы получить UID, который я действительно могу поместить в базу данных.