Начало работы с POP3 с помощью Boost Asio - PullRequest
0 голосов
/ 27 января 2012

Чтобы помочь себе освоить программирование сокетов, я создал очень простой SMTP-клиент (см. Код ниже), используя некоторый код из библиотеки Wt SMTP

В качестве упражнения я подумал, что мне нужно сделать попытку внедрения клиента POP3. Используя Википедию в качестве ссылки, выглядело так, как будто вы должны просто подключиться к серверу через порт 110 и отправить команды (так же, как SMTP подключается к порту 25 и отправляет команды).

Тем не менее, я до сих пор не мог даже подключиться, и в основном просто время ожидания в 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));
}

1 Ответ

0 голосов
/ 28 января 2012

Gmail требует шифрования SSL / TLS на своих соединениях POP3 и SMTP.

Для POP3 вам необходимо подключиться к порту 995 и инициировать рукопожатие SSL / TLS сразу после подключения. Затем вы можете прочитать начальное +OK приветствие сервера и отправить команды зашифрованному соединению.

Для SMTP у вас есть несколько вариантов:

  1. подключиться к порту 465. Инициировать рукопожатие SSL / TLS сразу после подключения. Прочитайте приветствие +OK и отправьте все команды зашифрованному соединению.

  2. подключиться к порту 587. Прочитать приветствие +OK и отправить команды EHLO и STARTTLS в незашифрованное соединение Инициируйте рукопожатие SSL / TLS. Отправьте новую команду EHLO и другие команды в зашифрованное соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...