Как я могу получать электронные письма на C ++ через POP3?

Я пытался найти клиент POP3 C ++ в Интернете, но мне не повезло.

Мы работаем над школьным проектом, который по сути является курсом C ++ (поэтому я не могу использовать C # ...), и мы делаем почтовый клиент, который должен поддерживать отправку и получение писем и вложений. Мы также работаем с .NET (потому что, очевидно, MFC ужасен, хотя я не использовал его, у кого-нибудь есть мнение по этому поводу?), И поэтому я бы предпочел решение, встроенное в библиотеку Microsoft. До сих пор мы могли заставить отправку электронной почты работать с помощью SMPTclient, но не повезло с POP3.

Если у кого-то есть решение в .NET, это было бы здорово, иначе мне придется написать свой собственный клиентский код POP3, и если у кого-то есть ссылка на это, чтобы направить меня в правильном направлении, это было бы очень признательно.


person shawnjan    schedule 12.11.2009    source источник
comment
Да, MFC на самом деле ужасен.   -  person Paul Sonier    schedule 12.11.2009


Ответы (2)


POCO имеет поддержку POP3 и SMTP в своей сетевой библиотеке.

person Georg Fritzsche    schedule 12.11.2009
comment
Я не думаю, что смогу использовать какие-либо библиотеки, которые не встроены ... Если я смогу убедить своего профессора, это будет идеально;) И у меня недостаточно репутации, чтобы проголосовать за это, но когда я это сделаю, я буду! - person shawnjan; 12.11.2009
comment
Он хочет, чтобы вы сами написали Pop3Client? В противном случае не должно быть ничего плохого в использовании библиотек для функций, которые Win32 / .NET не предлагает. Кстати, для .NET вы можете взглянуть, например, на codeproject.com/KB/IP/despop3client.aspx - person Georg Fritzsche; 12.11.2009
comment
Да, SHE;) хочет, чтобы мы написали ее сами, если она не входит в стандартную библиотеку. Исходный код того, что вы только что опубликовали, может работать, хотя, кажется, не так сложен, как POP :) - person shawnjan; 12.11.2009

Я написал код отправки электронной почты SMTP с помощью COM-CDO (в Windows); для получения электронной почты (POP3) я сократил следующий фрагмент кода в качестве упрощенного примера. Если ваш POP3-сервер использует TLS / SSL, ваш не работает без стороннего программного обеспечения - вам нужно внедрить SSL, и на разработку кода, вероятно, уйдут годы. Я поддерживаю использование POCO. Вот что у меня есть для не-SSL (извините за любые вызовы Z DIrectory, это должно быть легко понять):

#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);
person user1509395    schedule 07.03.2013