c++ - 通过 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;
解决方案
您不应该使用boost::beast::detail::base64_encode
,因为那不是公共接口。命名空间中的任何内容detail
都是不应直接使用的实现细节。事实上,我相信它有一个错误。尝试使用不同的 base64 编码函数。
推荐阅读
- sql-server - 从 SQL Server 中的表名获取数据库名
- google-apps-script - 有没有办法在使用谷歌应用脚本运行脚本后删除谷歌文档顶部的大蓝条
- daml - In DAML, what to return when a choice could lead to different new contracts to be created
- python - 我如何使用 Apply() 函数来解决这个问题?
- python - 烧瓶不呈现数据
- python - 为什么python不会在这个函数中添加
- actions-on-google - 教程“actions-on-google/smart-home-nodejs”的难度
- java - Kafka 流监听多个主题挂起
- python - 为什么 PyTables 在使用带有负步的迭代排序时不返回第一行?
- php - PHP 使用字符串来表示数组元素