首页 > 解决方案 > 通过 boost 和 c++ 进行 smtp 身份验证

问题描述

我正在使用 boost 1.67 编写一个 cpp smtp 客户端。当我尝试发送登录数据时,服务器返回身份验证错误,但是当我通过 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;

标签: c++authenticationboostsmtp

解决方案


您不应该使用boost::beast::detail::base64_encode,因为那不是公共接口。命名空间中的任何内容detail都是不应直接使用的实现细节。事实上,我相信它有一个错误。尝试使用不同的 base64 编码函数。


推荐阅读