SMTP.cpp
Upload User: tjsct008
Upload Date: 2016-12-02
Package Size: 3750k
Code Size: 5k
Category:

WEB Mail

Development Platform:

Visual C++

  1. // SMTP.cpp: implementation of the CSMTP class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "MailMulti.h"
  6. #include "SMTP.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CSMTP::response_code CSMTP::response_table[]=
  16. {
  17. //GENERIC_SUCCESS
  18. {250,"SMTP服务器错误!"},
  19. //CONNECT_SUCCESS
  20. {220,"SMTP服务器不可用!"},
  21. //DATA_SUCCESS
  22. {354,"SMTP服务器不能接收数据!"},
  23. //QUIT_SUCCESS
  24. {221,"SMTP服务器没有终止会话!" }
  25. };
  26. CSMTP::CSMTP(LPCSTR szSMTPServerName,UINT nPort /* = SMTP_PORT */)
  27. {
  28.     ASSERT(szSMTPServerName!=NULL);
  29. AfxSocketInit();
  30. m_sSTMPServerHostName = szSMTPServerName;
  31. m_nPort = nPort;
  32. m_bConnected = FALSE;
  33. m_sError = "OK";
  34. response_buf = NULL;
  35. }
  36. CSMTP::~CSMTP()
  37. {
  38.     DisConnect();
  39. }
  40. BOOL CSMTP::Connect()
  41. {
  42. CString sHello;
  43. TCHAR local_host[80];
  44. if(m_bConnected)
  45. return TRUE;
  46. try
  47. {
  48. response_buf = new TCHAR[RESPONSE_BUFFER_SIZE];
  49. if(response_buf == NULL)
  50. {
  51. m_sError = "内存不足!";
  52. return FALSE;
  53. }
  54. }
  55. catch (CException * e)
  56. {
  57. response_buf = NULL;
  58. m_sError = "内存不足!";
  59. delete e;
  60. return FALSE;
  61. }
  62. if(!m_wsSMTPServer.Create())
  63. {
  64. m_sError = "无法创建套接字!";
  65. delete response_buf;
  66. response_buf = NULL;
  67. return FALSE;
  68. }
  69. if(!m_wsSMTPServer.Connect(GetServerHostName(),GetPort()))
  70. {
  71. m_sError = "无法链接到服务器!";
  72. delete response_buf;
  73. response_buf = NULL;
  74. return FALSE;
  75. }
  76. if(!get_response(CONNECT_SUCCESS))
  77. {
  78. m_sError = "服务器无反应";
  79. m_wsSMTPServer.Close();
  80. delete response_buf;
  81. response_buf = NULL;
  82. return FALSE;
  83. }
  84. gethostname(local_host,80);
  85. sHello.Format(_T("HELLO%srn"),local_host);
  86. m_wsSMTPServer.Send((LPCSTR)sHello,sHello.GetLength());
  87. if(!get_response(GENERIC_SUCCESS))
  88. {
  89. m_wsSMTPServer.Close();
  90. delete response_buf;
  91. response_buf = NULL;
  92. return FALSE;
  93. }
  94. m_bConnected = TRUE;
  95. return TRUE;
  96. }
  97. BOOL CSMTP::get_response(UINT response_expect)
  98. {
  99. ASSERT(response_expect>=GENERIC_SUCCESS);
  100. ASSERT(response_expect<LAST_RESPONSE);
  101. CString sResponse;
  102. UINT response;
  103. response_code * pResp;
  104. if(m_wsSMTPServer.Receive(response_buf,RESPONSE_BUFFER_SIZE==SOCKET_ERROR))
  105. {
  106. m_sError = "套接字错误!";
  107. return FALSE;
  108. }
  109. sResponse = response_buf;
  110. scanf((LPCSTR)sResponse.Left(3),_T("%d"),&response);
  111. pResp = &response_table[response_expect];
  112. if(response!=pResp->nResponse)
  113. {
  114. m_sError.Format(_T("%d:%s"),response,(LPCSTR)pResp->sMessage);
  115. return FALSE;
  116. }
  117. return TRUE;
  118. }
  119. CString CSMTP::GetServerHostName()
  120. {
  121. return m_sSTMPServerHostName;
  122. }
  123. UINT CSMTP::GetPort()
  124. {
  125. return m_nPort;
  126. }
  127. BOOL CSMTP::SendMessage(CMailMessage * msg)
  128. {
  129. ASSERT(msg!=NULL);
  130. if(m_bConnected == NULL)
  131. {
  132. m_sError = "必须首先创建连接!";
  133. return FALSE;
  134. }
  135. if(FormatMailMessage(msg)==FALSE)
  136. {
  137. return FALSE;
  138. }
  139. if(transmit_message(msg)==FALSE)
  140. return FALSE;
  141. return TRUE;
  142. }
  143. BOOL CSMTP::FormatMailMessage(CMailMessage * msg)
  144. {
  145. ASSERT(msg!=NULL);
  146. msg->FormatMessage();
  147. return TRUE;
  148. }
  149. BOOL CSMTP::transmit_message(CMailMessage * msg)
  150. {
  151. CString sFrom;
  152. CString sTo;
  153. CString sTemp;
  154. CString sMail;
  155. ASSERT(msg!=NULL);
  156. if(m_bConnected==FALSE)
  157. {
  158. m_sError = "首先创建连接!";
  159. return FALSE;
  160. }
  161. sFrom.Format(_T("Mail From:<%s>rn"),(LPCTSTR)msg->m_strFrom);
  162. m_wsSMTPServer.Send((LPCTSTR)sFrom,sFrom.GetLength());
  163. if(!get_response(GENERIC_SUCCESS))
  164. return FALSE;
  165. sMail = (LPCTSTR)msg->m_strTo;
  166. sTo.Format(_T("RCPT To:<%s>rn"),(LPCTSTR)sMail);
  167. m_wsSMTPServer.Send((LPCTSTR)sTo,sTo.GetLength());
  168. get_response(GENERIC_SUCCESS);
  169. sTemp = "DATArn";
  170. m_wsSMTPServer.Send((LPCTSTR)sTemp,sTemp.GetLength());
  171. if(!get_response(DATA_SUCCESS))
  172. return FALSE;
  173. m_wsSMTPServer.Send((LPCTSTR)msg->m_strHead,msg->m_strHead.GetLength());
  174. sTemp = cook_body(msg);
  175. m_wsSMTPServer.Send((LPCTSTR)sTemp,sTemp.GetLength());
  176. sTemp = "rn.rn";
  177. m_wsSMTPServer.Send((LPCTSTR)sTemp,sTemp.GetLength());
  178. if(!get_response(GENERIC_SUCCESS))
  179. return FALSE;
  180. return TRUE;
  181. }
  182. CString CSMTP::cook_body(CMailMessage * msg)
  183. {
  184. ASSERT(msg!=NULL);
  185. CString sTemp;
  186. CString sCooked = "";
  187. LPCTSTR szBad = "rn.rn";
  188. LPCTSTR szGood = "rn.rn";
  189. int nPos;
  190. int nStart =0;
  191. int nBadlength = strlen(szBad);
  192. sTemp = msg->m_strBody;
  193. if(sTemp.Left(3)==".rn")
  194. sTemp = "."+sTemp;
  195. while((nPos=sTemp.Find(szBad))>-1)
  196. {
  197. sCooked = sTemp.Mid(nStart,nPos);
  198. sCooked+=szGood;
  199. sTemp = sCooked+
  200. sTemp.Right(sTemp.GetLength()-(nPos+nBadlength));
  201. }
  202. return sTemp;
  203. }
  204. BOOL CSMTP::DisConnect()
  205. {
  206. BOOL ret;
  207. if(!m_bConnected)
  208. return TRUE;
  209. CString sQuit = "QUITrn";
  210. m_wsSMTPServer.Send((LPCTSTR)sQuit,sQuit.GetLength());
  211. ret = get_response(QUIT_SUCCESS);
  212. m_wsSMTPServer.Close();
  213. if(response_buf!=NULL)
  214. {
  215. delete []response_buf;
  216. response_buf = NULL;
  217. }
  218. m_bConnected = FALSE;
  219. return ret;
  220. }
  221. CString CSMTP::GetLastError()
  222. {
  223. return m_sError;
  224. }