使用Boost Asio开始使用POP3

时间:2012-01-27 16:19:13

标签: c++ sockets boost-asio

为了帮助自己学习套接字编程,我使用Wt SMTP Library

中的一些代码创建了一个非常简单的SMTP客户端(参见下面的代码)

作为练习,我想我会尝试实施POP3客户端。使用Wikipedia作为参考,看起来您只需要在端口110上连接到服务器并发送命令(就像端口25上的SMTP连接并发送命令一样)。

但是,到目前为止,我甚至无法连接,基本上只是每次都在get_response()超时。我尝试连接到pop.gmail.com没有运气。

我不认为您在首次建立连接时需要发送任何用户/密码/其他信息?我希望在连接后收到+OK POP3 Server Ready行的内容,然后我可以发送USERPASS命令。

我的问题是:在连接阶段我错过了什么吗?我想连接到坏主机(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));
}

1 个答案:

答案 0 :(得分:0)

Gmail要求对其POP3和SMTP连接进行SSL / TLS加密。

对于POP3,您必须连接到端口995并在连接时立即启动SSL / TLS握手。然后,您可以从加密连接中读取服务器的初始+OK问候语并发送命令。

对于SMTP,您有几个选择:

  1. 连接到端口465.连接后立即启动SSL / TLS握手。阅读+OK问候语,并将所有命令发送到加密连接。

  2. 连接到端口587.阅读+OK问候语,并将EHLOSTARTTLS命令发送到未加密的连接。启动SSL / TLS握手。将新的EHLO命令和其他命令发送到加密连接。