Я пишу клиент cpp smtp, используя boost 1.67. Когда я пытаюсь отправить данные для входа в систему, сервер возвращает ошибку аутентификации, но когда я пытаюсь сделать это вручную через telnet, он работает. Вот мой код:
sktSocket.write_some(boost::asio::buffer("AUTH LOGIN\r\n"));
size_t lenTemp = sktSocket.read_some(boost::asio::buffer(chTemp),error);
showResponse(chTemp.data(), lenTemp);
std::string strUse = boost::beast::detail::base64_encode(srvTest.strUser);
sktSocket.write_some(boost::asio::buffer(strUse));
sktSocket.write_some(boost::asio::buffer("\r\n"));
showText(strUse);
lenTemp = sktSocket.read_some(boost::asio::buffer(chTemp), error);
showResponse(chTemp.data(), lenTemp);
std::string strPass = boost::beast::detail::base64_encode(srvTest.strPasswd);
sktSocket.write_some(boost::asio::buffer(strPass));
sktSocket.write_some(boost::asio::buffer("\r\n"));
showText(strPass);
size_t lenLogin = sktSocket.read_some(boost::asio::buffer(chLogin), error);
showResponse(chLogin.data(), lenLogin);
Когда я запустил этот код, я получил ответ:
535 Inncorrect authentication data
Я действительно не знаю, что делаю не так ... заранее спасибо
теперь я использую собственную реализацию для кодирования в base64, и она также возвращает правильную закодированную строку как зверь, но сервер отвечает 535, как и раньше
unsigned int paddedCharacters = 0;
while (data.size() % 3 != 0)
{
paddedCharacters++;
data.push_back(0x00);
}
// Crazy typedef black magic
typedef insert_linebreaks<base64_from_binary<transform_width<const unsigned char *, 6, 8>>, 76> base64Iterator;
std::string encodedString(
base64Iterator(data.c_str()),
base64Iterator(data.c_str() + (data.size() - paddedCharacters)));
// Add '=' for each padded character used
for (unsigned int i = 0; i < paddedCharacters; i++)
{
encodedString.push_back('=');
}
return encodedString;
извините, я отредактировал код





Вам не следует использовать boost::beast::detail::base64_encode, потому что это не общедоступный интерфейс. Все, что находится в пространстве имен detail, является деталью реализации, которую не следует использовать напрямую. И на самом деле я считаю, что в этом есть ошибка. Попробуйте использовать другую функцию кодирования base64.
Хорошо. но когда я копирую и вставляю вывод и использую telnet, он работает
отредактировал вопрос, дает тот же результат, что и зверь, но также не работает
Возможно, вам стоит начать с показа полученной ошибки ...