【问题标题】:How can I receive emails in C++ via POP3?如何通过 POP3 在 C++ 中接收电子邮件?
【发布时间】:2010-12-15 16:49:57
【问题描述】:

我一直试图在互联网上找到一个 POP3 C++ 客户端,但我没有找到任何运气。

我们正在为学校开发一个项目,该项目本质上是一门 C++ 课程(所以我不能使用 C#...),并且我们正在制作一个必须支持发送和接收电子邮件和附件的电子邮件客户端。我们也在使用 .NET(因为显然 MFC 很糟糕,虽然我没有使用过,但有人对此有意见吗?),所以我更喜欢微软内置的库解决方案。到目前为止,我们已经能够使用 SMPTclient 发送电子邮件,但没有 POP3 运气。

如果有人在 .NET 中有一个很棒的解决方案,否则我将不得不编写我自己的 POP3 客户端代码,如果有人有一个链接可以让我朝着正确的方向前进,我将不胜感激。

【问题讨论】:

  • 是的,MFC 实际上很糟糕。

标签: c++ .net email pop3


【解决方案1】:

我使用 COM-CDO(在 Windows 上)编写了 SMTP 电子邮件发送代码;用于接收电子邮件 (POP3) 我将以下代码 sn-p 浓缩为一个淡化的示例。如果您的 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 = "gorth@Vettrasoft.com";
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);

【讨论】:

    【解决方案2】:

    POCO 在其网络库中支持 POP3 和 SMTP。

    【讨论】:

    • 我不认为我可以使用任何未内置的库...如果我能说服我的教授,那么这将是完美的;)而且我没有足够的代表来投票这个,但当我这样做时,我会的!
    • 他要你自己写 Pop3Client 吗?如果没有,使用库来实现 win32/.NET 不提供的功能应该没有任何问题。顺便说一句,对于.NET,你可以看看例如codeproject.com/KB/IP/despop3client.aspx
    • 是的,SHE ;) 确实希望我们自己编写它,如果它不是标准库的一部分。您刚刚发布的源代码可能有效,但似乎不如 POP 强大:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多