2012-01-27 1 views
0

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)); 
} 
+0

Ceci n'est pas un forum, nous n'utilisons généralement pas de salutations aux questions –

Répondre

0

Gmail requiert le chiffrement SSL/TLS sur ses connexions POP3 et SMTP. Pour POP3, vous devez vous connecter au port 995 et lancer une prise de contact SSL/TLS immédiatement après la connexion. Ensuite, vous pouvez lire le message d'accueil +OK initial du serveur à partir de la connexion cryptée et lui envoyer des commandes.

Pour SMTP, vous avez deux choix:

  1. connecter au port 465. lancer une poignée de main SSL/TLS immédiatement lors de la connexion. Lisez le message d'accueil +OK et envoyez toutes les commandes à la connexion cryptée.

  2. Connectez-vous au port 587. Lisez le message d'accueil +OK et envoyez les commandes EHLO et STARTTLS à la connexion non cryptée. Initiez la négociation SSL/TLS. Envoyez une nouvelle commande EHLO et d'autres commandes à la connexion cryptée.