Я пытаюсь tp получить список электронных писем через IMAP, используя сокет boost :: asio синхронно. Моя реализация
std::string cmail::ImapClient::execute(const std::string &cmd)
{
boost::system::error_code error;
boost::asio::write(socket, boost::asio::buffer(cmd), error);
if(error)
{
spdlog::error("Failed to dispatch command " + cmd + " because " + error.message());
return "";
}
boost::asio::streambuf buffer;
boost::asio::read_until(socket, buffer, '\n', error);
if(error)
{
spdlog::error("Failed to receive response for command " + cmd + " because " + error.message());
return "";
}
boost::asio::streambuf::const_buffers_type data = buffer.data();
std::string response(boost::asio::buffers_begin(data), boost::asio::buffers_begin(data) + buffer.size());
if(spdlog::default_logger()->level() == spdlog::level::trace)
{
std::string s = response;
s.pop_back();
spdlog::trace("S: " + s);
}
return response;
}
Фактический cmd
Я передаю этот метод A002 FETCH 1:* (BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)] FLAGS)
. В почтовом ящике 5 писем. Так что 1.*
должен получить 5 писем. Однако я получаю только полную информацию электронной почты для писем 1 и 2 и только поле «От» 3-го письма.
Если я изменю команду на A002 FETCH 2:5 (BODY.PEEK[HEADER.FIELDS (DATE FROM SUBJECT)] FLAGS)
, я снова получу ожидаемый контент для писем 2 и 3, в то время как response
не содержит ничего после поля «От» 4-го числа.
РЕДАКТИРОВАТЬ:
Я проверяю, что в папке «Входящие» есть 5 писем, выдав команда A001 SEARCH SINCE 10-Apr-2020
, на которую сервер отвечает * SEARCH 1 2 3 4 5
.
Что касается того, как я проверяю, что сервер ответил данными для 5 электронных писем, согласно протоколу spe c, сервер должен завершить sh ответ с A002 OK ...
, A002 NO ...
или A002 BAD ...
. Ответ, который я получаю, не отправляет это завершающее предложение. Кроме того, в обоих случаях, которые выглядят так, будто полезная нагрузка усекается, размер ответа составляет 512 символов. Не уверен, насколько строгой является эта проверка, но число байтов в 512, кажется, указывает на некоторое ограничение размера где-то ...