通过 Boost 和 C++ 进行 SMTP 身份验证

smtp auth via boost and c++

本文关键字:SMTP 身份验证 进行 C++ Boost 通过      更新时间:2023-10-16

我正在使用boost 1.67编写cpp smtp客户端。 当我尝试发送登录数据时,服务器返回身份验证错误,但是当我通过 telnet 手动尝试时,它可以工作。 这是我的代码:

sktSocket.write_some(boost::asio::buffer("AUTH LOGINrn"));
        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("rn"));
        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("rn"));
        showText(strPass);
        size_t lenLogin = sktSocket.read_some(boost::asio::buffer(chLogin), error);
        showResponse(chLogin.data(), lenLogin);

当我运行这段代码时,我得到了响应:

535 Inncorrect authentication data

我真的不知道我做错了什么... 提前致谢

编辑------------

现在我正在使用自己的实现来编码为 base64,它还返回正确的编码字符串作为 beast,但服务器像以前一样使用 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 编码函数。