Загрузка заголовков POP3 с определенной даты (Python) - PullRequest
3 голосов
/ 26 сентября 2011

Я пытаюсь написать pop3 и imap клиенты на python, используя доступные библиотеки, которые будут загружать заголовки писем (а затем и целые тела писем) с разных серверов и сохранять их в базе данных mongodb. Проблема, с которой я сталкиваюсь, заключается в том, что этот клиент загружает электронные письма в дополнение к обычному почтовому клиенту пользователя. Поэтому, исходя из предположения, что пользователь может или не может оставлять электронные письма на сервере при загрузке с помощью своего почтового клиента, я хотел бы получать заголовки, но собирать их только с определенной даты, чтобы избежать захвата целых почтовых ящиков каждый раз, когда я получаю заголовки.

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

Как почтовые клиенты справляются с этой ситуацией при работе с серверами POP3?

1 Ответ

3 голосов
/ 26 сентября 2011

Outlook входит в систему на сервере POP3 и выдает команды STAT, LIST и UIDL; затем, если он решает, что у пользователя нет новых сообщений, он выходит из системы. Я наблюдал, как Outlook делает это при отслеживании сетевого трафика между клиентом и моим сервером PMail-DBMail. Я видел, что Outlook не может обнаружить новые сообщения на сервере POP3, используя этот метод. Thunderbird ведет себя аналогично, но я никогда не видел, чтобы он не обнаруживал новые сообщения.

Выполните команды LIST и UIDL на сервере после входа в систему. LIST дает индексный номер (линейная позиция сообщения в почтовом ящике) и размер каждого сообщения. UIDL дает вам тот же индекс и вычисленное значение хеш-функции для каждого сообщения.

Для каждого пользователя вы можете сохранить размер и значение хеша, заданное LIST и UIDL. Если вы видите тот же размер и хеш-значение, предположите, что это одно и то же сообщение. Когда данное сообщение больше не появляется в этом списке, предположим, что оно было удалено, и удалите его из локальной памяти.

Для полной чистоты запомните относительное положение пар размер / хэш в списке сообщений, чтобы вы могли поддерживать возможность их повторения. (Мое предположение о новой ошибке обнаружения сообщений в Outlook заключается в том, что иногда эти значения повторяются, по крайней мере, для DBMail, но Outlook запоминает их даже после их удаления и навсегда считает их не новыми. Если бы это был я, я бы попытался избежать этого поведение.)

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

...