C++ 发送邮件
 
 
在许多应用程序中,都会或多或少地用到邮件发送程序。本文首先介绍发送邮件必须用到的协议SMTP,然后给出用C++写的一个邮件发送类。
邮件发送要用到邮件服务器和一个邮箱账户,这样你就可以用本文的demo程序进行邮件发送了。
邮件发送协议用SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,而邮件的接收用POP3协议。
在邮件发送程序中,我们实际用到的是SMTP命令,如下表格所示:
 
| 命令 | 描述 | 
| DATA | 开始信息写作 | 
| EXPN<string> | 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用 | 
| HELO<domain> | 向服务器标识用户身份,返回邮件服务器身份 | 
| HELP<command> | 查询服务器支持什么命令,返回命令中的信息 | 
| MAIL FROM<host> | 在主机上初始化一个邮件会话 | 
| NOOP | 无操作,服务器应响应OK | 
| QUIT | 终止邮件会话 | 
| RCPT TO<user> | 标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to: | 
| RSET | 重置会话,当前传输被取消 | 
| SAML FROM<host> | 发送邮件到用户终端和邮箱 | 
| SEND FROM<host> | 发送邮件到用户终端 | 
| SOML FROM<host> | 发送邮件到用户终端或邮箱 | 
| TURN | 接收端和发送端交换角色 | 
| VRFY<user> | 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令 | 
SMTP工作过程:
1. 建立与邮件服务器之间的TCP连接。
2. 客户端发送HELO命令,服务器返回250 ok。
3. 客户端发送AUTH LOGIN, 传输用户名和密码到服务器,登陆邮件服务器。(注意:一般要求用户名和密码用BASE64加密)
4. 发送MAIL FROM命令,初始一个邮件会话。
5. 发送RCPT TO,表明收件人。
6. 发送DATA,表示开始发送信息。
7. 发送QUIT,退出。
 
在每条命令发送结束,末尾加上\r\n,即<CRLF>,回车键,表示此条命令的结束。
C++发送源代码详见https://github.com/duankai/mail
其中,Base64.h是用来对用户名和密码进行加密的,mail.h定义了一些退出代码。如下是GosMail类的定义:
class GosMail
{
public:static GosMail * GetInstance();int SendMail(USER_INFO_T * pstUserInfo, MAIL_INFO_T * pstMailInfo);bool GetStatus();~GosMail();
private:GosMail();bool Init();void GetMailSocket(int iPort = 25);void FreeResource();int InitMailBox();int Login(USER_INFO_T * pstUserInfo);int SendContent(MAIL_INFO_T * pstMailInfo);int QuitEmailBox();
public:
private:SOCKET           m_socket;SOCKADDR_IN      m_sockAddr;bool             m_mailStatus;static GosMail * m_mailInst;int              m_iSockAddrLen;char             recvBuff[1024];char             sendBuff[1024 * 3];
};