为了帮助自己学习套接字编程,我使用Wt SMTP Library
中的一些代码创建了一个非常简单的SMTP客户端(参见下面的代码)作为练习,我想我会尝试实施POP3客户端。使用Wikipedia作为参考,看起来您只需要在端口110上连接到服务器并发送命令(就像端口25上的SMTP连接并发送命令一样)。
但是,到目前为止,我甚至无法连接,基本上只是每次都在get_response()
超时。我尝试连接到pop.gmail.com
没有运气。
我不认为您在首次建立连接时需要发送任何用户/密码/其他信息?我希望在连接后收到+OK POP3 Server Ready
行的内容,然后我可以发送USER
和PASS
命令。
我的问题是:在连接阶段我错过了什么吗?我想连接到坏主机(gmail)吗?如果是这样,是否有一个比我可以测试的pop.gmail.com
更好的主机?或者我是否完全错了?
#include <string>
#include <sstream>
#include <iostream>
#include <iterator>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main()
{
boost::asio::io_service io_service;
tcp::socket socket(io_service);
tcp::resolver resolver(io_service);
tcp::resolver::query query("localhost", "25"); // Change this for POP3
tcp::resolver::iterator endpt_iter = resolver.resolve(query);
boost::system::error_code erc = boost::asio::error::host_not_found;
while(erc && endpt_iter != end)
{
socket.close();
socket.connect(*endpt_iter++, erc);
}
if(erc) { socket.close(); return }
std::cout << get_response(socket) << std::endl; // 220 <my-host-name> ESMTP Postfix
send(socket, "EHLO localhost\r\n");
std::cout << get_response(socket) << std::endl; // 250-<my-host-name>
return 0;
}
std::string get_response(tcp::socket& socket)
{
boost::asio::streambuf response;
for(;;)
{
std::string msg;
boost::asio::read_until(socket, response, "\r\n");
std::istream in(&response);
std::getline(in, msg);
return msg;
}
}
void send(tcp::socket& socket, std::string msg)
{
boost::asio::write(socket, boost::asio::buffer(msg));
}
答案 0 :(得分:0)
Gmail要求对其POP3和SMTP连接进行SSL / TLS加密。
对于POP3,您必须连接到端口995并在连接时立即启动SSL / TLS握手。然后,您可以从加密连接中读取服务器的初始+OK
问候语并发送命令。
对于SMTP,您有几个选择:
连接到端口465.连接后立即启动SSL / TLS握手。阅读+OK
问候语,并将所有命令发送到加密连接。
连接到端口587.阅读+OK
问候语,并将EHLO
和STARTTLS
命令发送到未加密的连接。启动SSL / TLS握手。将新的EHLO
命令和其他命令发送到加密连接。