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];
};
本文介绍的内容用C++实现了一个简单的邮件发送类,将来会将邮件接收类也补充完整,欢迎大家提出意见和指出不足之处。