2009-11-12 6 views
1

J'ai essayé de trouver un client POP3 C++ sur internet mais je n'ai pas trouvé de chance.Comment puis-je recevoir des emails en C++ via POP3?

Nous travaillons sur un projet pour l'école qui est essentiellement un cours C++ (donc je ne peux pas utiliser C# ...), et nous faisons un client de messagerie qui doit supporter l'envoi et la réception de mails et de pièces jointes. Nous travaillons aussi avec .NET (parce qu'apparemment MFC est terrible, même si je ne l'ai pas utilisé, quelqu'un a une opinion là-dessus?), Et donc je préférerais une solution de bibliothèque Microsoft intégrée à cela. Jusqu'à présent, nous avons été en mesure d'envoyer des emails en utilisant SMPTclient, mais pas de chance POP3. Si quelqu'un a une solution dans .NET ce serait génial, sinon je vais devoir écrire mon propre code client POP3, et si quelqu'un a un lien pour que cela me mette dans la bonne direction, il serait très apprécié .

+3

Oui, MFC est, en fait, terribles. –

Répondre

3

POCO prend en charge POP3 et SMTP dans sa bibliothèque réseau.

+0

Je ne pense pas que je peux utiliser des bibliothèques qui ne sont pas intégrées ... Si je peux convaincre mon prof alors ce sera parfait;) Et je n'ai pas assez de rep pour upvote cela mais quand je le ferai je le ferai ! – shawnjan

+0

Veut-il que vous écriviez le Pop3Client vous-même? Si ce n'est pas le cas, il ne devrait pas y avoir de problème avec l'utilisation de bibliothèques pour les fonctionnalités que win32/.NET n'offre pas. Btw, pour .NET, vous pouvez jeter un coup d'œil, par exemple. http://www.codeproject.com/KB/IP/despop3client.aspx –

+0

Oui, elle;) veut que nous l'écrivions nous-mêmes si elle ne fait pas partie de la bibliothèque standard. Le code source sur celui que vous venez de publier pourrait fonctionner, mais ne semble pas aussi intense que POP :) – shawnjan

0

J'ai écrit du courrier électronique SMTP en envoyant du code en utilisant COM-CDO (sous Windows); pour obtenir le courrier électronique (POP3) J'ai condensé l'extrait de code suivant comme un exemple édulcoré. Si votre serveur POP3 utilise TLS/SSL, vous devez mettre en œuvre SSL et le code prendra probablement des années à développer. Je seconde l'utilisation de POCO. Voici ce que j'ai pour non-SSL (désolé pour tous les appels Z de RÉPERTOIRE, il devrait être facile à comprendre):

#include <winsock2.h> 

#define MAX_MSG   40000     // max message length 
#define COMM_SUFF  "\r\n" 
#define COMM_USER  "USER " 
#define COMM_PASS  "PASS " 
#define COMM_STAT  "STAT\r\n" 
#define COMM_LIST  "LIST\r\n" 
#define COMM_QUIT  "QUIT\r\n" 
#define COMM_RETR  "RETR " 
#define COMM_TOP  "TOP " 
#define COMM_DELETE  "DELE " 
#define COMM_NOOP  "NOOP\r\n" 

SOCKET sock_no;        // SOCKET no 
struct sockaddr_in sok = {0};    // SOCKET struct 
struct hostent *hp; 
string_o command, s, msg_num; 
string_o user = "EMAIL_USERNAME"; 
string_o passw = "EMAIL_PASSWORD"; 
char buff[MAX_MSG];       // pop-3 output buffer 
sock_no = socket (AF_INET, SOCK_STREAM, 0); // init socket 
sok.sin_family = AF_INET; 
int n_bytes = 0;       // num of return bytes 

s = "[email protected]"; 
hp = gethostbyname(s.data());    // get server IP address 
if (hp != NULL) 
    bcopy ((u_char *) &sok.sin_addr, (const u_char *) hp->h_addr, hp->h_length); 
else 
    return -1; 

sok.sin_port = (unsigned short int) htons(110); 

//.......................................................... 
// connect to pop-3 server and logon 
//.......................................................... 
if (::connect(sock_no, (sockaddr *) &sok, sizeof (sockaddr_in)) != 0) 
    return -1; 

n_bytes = ::recv (sock_no, buff, MAX_MSG, 0); // skip first server answer 

// send "user" command 
command = COMM_USER + user + COMM_SUFF; 
n_bytes = ::send (sock_no, command.data(), command.size(), 0); 

// get server answer 
n_bytes = ::recv (sock_no, buff, MAX_MSG, 0); 

// send PASS command 
command = COMM_PASS + passw + COMM_SUFF; 
n_bytes = ::send (sock_no, command.data(), command.size(), 0); 

n_bytes = ::recv (sock_no, buff, MAX_MSG, 0); // get server answer 

//.......................................................... 
// get list of messages; get number of messages in inbox 
//.......................................................... 
command = COMM_STAT; 
n_bytes = ::send (sock_no, command.data(), command.size(), 0); 
n_bytes = ::recv (sock_no, buff, MAX_MSG, 0); 

// extract number of messages 
msg_num = get_field(buff, "+OK "); 
pos = msg_num.find(' ', &ie); 
msg_num = msg_num.substring(0, pos); 
count = ::z_str_to_int (msg_num.data()); 

//.......................................................... 
// do all messages from list. # of messages begins from 1 
//.......................................................... 
for (i = 1; i <= count && !ie; i++) 
    ie = process_nextmail (sock_no, i, buff, do_kill); 

//.......................................................... 
// quit and disconnect pop-3 server; send "QUIT" command 
//.......................................................... 
command = COMM_QUIT; 
n_bytes = ::send (sock_no, command.data(), command.size(), 0); 
return ::closesocket(sock_no); 
Questions connexes