Pour me aider à apprendre la programmation socket, je me suis un client SMTP très simple (voir code ci-dessous), en utilisant un code de la la Wt SMTP LibraryMise en route avec POP3 utilisant Boost Asio
En guise d'exercice, je pensais que je prendrais une chance d'implémenter un client POP3. En utilisant le Wikipedia comme référence, il semblait que vous deviez simplement vous connecter au serveur sur le port 110 et envoyer des commandes (tout comme SMTP se connecte sur le port 25 et envoie des commandes).
Cependant, j'ai jusqu'à présent été incapable de me connecter, et fondamentalement juste le temps d'attente dans le get_response()
chaque fois. J'ai essayé de me connecter à pop.gmail.com
sans aucune chance.
Je ne crois pas que vous ayez besoin d'envoyer un utilisateur/mot de passe/autre information lorsque la connexion est établie pour la première fois? Je m'attendais à recevoir quelque chose le long des lignes +OK POP3 Server Ready
une fois que je me connecte, et je peux ensuite envoyer les commandes USER
et PASS
.
Ma question est: Ai-je oublié quelque chose pendant la phase de connexion? Est-ce que j'essaie de me connecter à un mauvais hôte (gmail)? Si oui, y at-il un meilleur hôte que pop.gmail.com
avec lequel je peux tester? Ou est-ce que je vais tout à fait faux?
#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));
}
Ceci n'est pas un forum, nous n'utilisons généralement pas de salutations aux questions –