Как почтовые клиенты обрабатывают почту с POP-сервера?

При написании соединения для подключения к протоколу POP3 через сокеты я мог использовать команду LIST для получения списка электронных писем. Предположим, я делаю команду LIST, она возвращает 3700 писем в списке. Я прочитал весь ответ в буфер. Теперь я хочу перечислить эти письма одно за другим в своем приложении.

LIST
1 1472
...
3696 3224
3697 5998
3698 1970
3699 1425
3700 129345
.

У меня было 2 идеи. Во-первых, я мог разобрать ответ построчно и получить номер сообщения. И для каждой строки я получаю номер сообщения, скажем, #3700, я делаю TOP 3700 10. Таким образом, это будет читать 10 строк заголовков почты. Сначала я подумал, что это будет хорошо, потому что мне не нужно загружать всю почту только для темы, имени, адреса и некоторого краткого содержания электронной почты; Я мог бы сэкономить трафик. Но проблема не в том, что все электронные письма имеют только 10 строк заголовков. Некоторые электронные письма имеют очень длинные заголовки, а другие очень короткие. Трудно определить, сколько строк читать. Мало того, поскольку электронная почта загружается не полностью, когда пользователь хочет прочитать всю почту, мне нужно отправить еще одну команду RETR, чтобы получить всю электронную почту. Затем предположим, что было другое подключение к учетной записи POP и удалено сообщение #3700. Мое приложение по-прежнему распознает электронную почту по этому «неуникальному» идентификатору сообщения. Когда мое приложение хочет загрузить электронное письмо и отправляет RETR 3700, оно ответит -ERR Server Unavailable. 21

Вторая идея, которую я имею, состоит в том, чтобы использовать RETR 3700. Это будет читать всю почту, только для того немного информации, чтобы перечислить его в приложении. Я подумал, что это глупо, потому что, если в почтовом ящике много писем, я извлекаю весь почтовый ящик в память приложения!

Каковы общие/умные способы, с помощью которых почтовый клиент будет обрабатывать почту с POP-сервера?

PS: я не использую JavaMail, потому что намерен узнать больше о том, как работает протокол POP, и о реализациях, используемых для работы с протоколами.


person Carven    schedule 20.10.2011    source источник
comment
Почему вы не используете библиотеку JavaMail, в которой уже решено большинство этих проблем?   -  person Mark Rotteveel    schedule 20.10.2011
comment
Это своего рода требование, и я также хотел бы узнать больше о том, как работает протокол POP, и о реализациях, используемых для работы с протоколами.   -  person Carven    schedule 20.10.2011
comment
Ваш пользователь хочет видеть всю свою электронную почту, поэтому в конечном итоге вам придется загрузить ее всю. Используйте RETR для каждого и сохраните полное сообщение в локальной базе данных. Таким образом, вы не сохраняете весь почтовый ящик в памяти.   -  person Jonathan Julian    schedule 20.10.2011
comment
да, загрузка копии письма на локальный диск — один из способов. Но я также видел почтовые клиенты, которым это не нужно, и я подумал, что, возможно, есть способ сделать это? Например, приложение «Почта» на iPhone не загружает всю электронную почту. Кажется, он перечисляет почту, загружая только заголовки. Он загружает полное электронное письмо только тогда, когда я пытаюсь прочитать это конкретное электронное письмо.   -  person Carven    schedule 20.10.2011
comment
@xEnOn, значит, вы страдаете от синдрома NIH и загружаете своего клиента / босса дополнительной работой, чтобы решить уже решенную проблему?   -  person Mark Rotteveel    schedule 20.10.2011
comment
Вы уверены, что почтовое приложение iPhone использует POP3, а не IMAP? С IMAP гораздо больше гибкости в определении того, что нужно получить с сервера.   -  person Mark Rotteveel    schedule 20.10.2011
comment
о.. Значит, iPhone использует IMAP, что позволяет использовать упомянутые мной возможности?   -  person Carven    schedule 20.10.2011
comment
Да, IMAP более гибкий, но и более сложный, чем POP3.   -  person Jonathan Julian    schedule 21.10.2011


Ответы (1)


2-й аргумент команды TOP — это неотрицательное количество строк сообщения для загрузки — строки заголовков не включаются.

Вы можете использовать команду TOP с 0 в качестве количества строк (TOP message_number 0) для загрузки только заголовков сообщений.

person Pawel Lesnikowski    schedule 20.10.2011