При написании соединения для подключения к протоколу 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, и о реализациях, используемых для работы с протоколами.
RETR
для каждого и сохраните полное сообщение в локальной базе данных. Таким образом, вы не сохраняете весь почтовый ящик в памяти. - person Jonathan Julian   schedule 20.10.2011