C++通过socket套接字,使用smtp协议和pop3协议进行邮件发送和读取。
Smtp协议很简单,在建立socket之后。
依次发送如下消息。
EHLO 服务器地址
AUTH LOGIN
USER 邮箱帐号
PASS 邮箱密码 /*邮箱密码是需要base64加密的*/
MAIL FROM: 发件人地址
RCPT TO: 收件人地址
DATA
Subject: 主题
From: 发件人
To: 收件人
邮件内容 /*base64编码*/
. /*符号 "." 独占一行*/
QUIT
Socket初始化:
sock = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sock, F_SETFD, O_NONBLOCK);
memset(&server, 0,sizeof(server));
server.sin_family = AF_INET;
hp = gethostbyname(serverUrl.c_str());
每将一行数据发送到socket,就再发送一个回车换行符 "\r\n" 。通知系统执行命令。
在写这个程序的时候,最初是用同步方式。在同步通信下,如果某步骤延时,将导致这个软件一直无法返回。随后改为异步通信,上面代码为异步通信参数设置。
每发送一次命令,就读取服务器响应,超时,将返回。
在linux c++,不熟悉定时器使用,就改为程序里计算运行时间的方式,在write_socket函数里面,判断是否超时,超时则抛出一个TimeoutException异常,由外层程序接受异常,进行处理。
------------------------------------------------------------------------------------------------------------
POP3
Pop3协议收取邮件和smtp发送邮件类似,但是邮件内容解码比较麻烦,很多邮件还带有附件。
USER 邮箱帐号
PASS 密码
STAT /*邮箱情况*/
LIST /*列出邮件编号 及大小*/
RETR 邮件编号 /*第i封邮件内容*/
QUIT
Pop3处理附件是对附件进行base64编码,然后放在邮件内容中的,使用特定的分隔符进行分割。获得邮件后,需要解析邮件内容,将里面的附件内容部分,保存为附件文件。
因为使用标准c++ ,所以windows平台下也可以进行同样处理。