Определение начала и конца ответа на сообщение, возвращаемого через IMAP

#java #parsing #email #imap

#java #синтаксический анализ #Адрес электронной почты #imap

Вопрос:

Я пытаюсь проанализировать ответ, возвращенный IMAP, который содержит содержимое электронного письма. Как я могу определить начало и конец сообщения, возвращаемого из ответа, полученного через IMAP?

Ниже приведены 2 примера ответов, когда я получаю электронное письмо через IMAP:

 . fetch 3728 body.peek[1]
* 3728 FETCH (BODY[1] {45}
Hello,
This is test message 1. 
:(
:)

)
* 3732 FETCH (FLAGS (Seen Recent))
* 3733 FETCH (FLAGS (Seen Recent))
. OK FETCH completed.
 

И второе извлечение:

 . fetch 3729 body.peek[1]
* 3729 FETCH (BODY[1] {42}
Hello,
This is test message 2. :)

)
The above bracket is part of the message's content.

)
. OK FETCH completed.
 

Во-первых, оба извлечения иногда дают разное окончание, когда на учетную запись поступают новые электронные письма. Во-вторых, похоже, что сообщение заканчивается скобкой и . OK FETCH Completed ответом. Но что произойдет, если содержимое тоже состоит из скобок? Тогда я могу прочитать неправильную скобку и никогда не получить полное содержимое.

Таким образом, при анализе ответа из IMAP, как я должен интерпретировать ответ и правильно получать содержимое?

Ответ №1:

Вы должны прочитать rfc 3501 …

Строки IMAP могут быть представлены в 2 формах: 1) Строка в кавычках. 2) строковый литерал.

Строковый литерал synatx: {number_of_bytes}CRLF — здесь вам нужно прочитать количество байтов. ПРИМЕЧАНИЕ: БАЙТЫ, а не строка!!!

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

Стабильное кодирование — полнофункциональный IMAP-клиент — непростая задача.