POP3.cpp
上传用户:yh_company
上传日期:2013-04-25
资源大小:19k
文件大小:5k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // POP3.cpp: Implementation of CPOP3.
  2. // Copyright (C) 1998 Michael Krebs
  3. // In Adaption of Wes Clyburn's CSMTP class
  4. //////////////////////////////////////////////////////////////////////
  5. #include "stdafx.h"
  6. #include "POP3.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. TCHAR* CPOP3::error_table[] =
  13. {
  14. "Server didn't connect",
  15. "Bad user name", // IDENTIFICATION
  16. "Invalid username/password combination", // AUTHENTIFICATION
  17. "STATus couldn't be retrieved", // STATUS
  18. "RETRieve failed", // RETRIEVE
  19. "Could not DELEte message", // DELE
  20. "Error while QUITting" // QUIT
  21. };
  22. //////////////////////////////////////////////////////////////////////
  23. // Konstruktion/Destruktion
  24. //////////////////////////////////////////////////////////////////////
  25. CPOP3::CPOP3( LPCTSTR szPOP3ServerName, UINT nPort, LPCTSTR sUsername, LPCTSTR sPassword)
  26. {
  27. ASSERT( szPOP3ServerName != NULL );
  28. AfxSocketInit();
  29. m_sPOP3ServerHostName = szPOP3ServerName;
  30. m_nPort = nPort;
  31. m_sUsername = sUsername;
  32. m_sPassword = sPassword;
  33. m_bConnected = FALSE;
  34. m_sError = _T( "OK" );
  35. }
  36. CPOP3::~CPOP3()
  37. {
  38. if( m_bConnected )
  39. Disconnect();
  40. }
  41. BOOL CPOP3::Connect()
  42. {
  43. CString sUser;
  44. CString sPass;
  45. if( m_bConnected )
  46. return TRUE;
  47. if( !m_wsPOP3Server.Create() )
  48. {
  49. m_sError = _T( "Unable to create the socket." );
  50. return FALSE;
  51. }
  52. if( !m_wsPOP3Server.Connect( GetServerHostName(), GetPort() ) )
  53. {
  54. m_sError = _T( "Unable to connect to server" );
  55. m_wsPOP3Server.Close();
  56. return FALSE;
  57. }
  58. if( !get_response( CONNECTION ) )
  59. {
  60. m_wsPOP3Server.Close();
  61. return FALSE;
  62. }
  63. sUser.Format( "USER %srn", GetUsername());
  64. m_wsPOP3Server.Send( (LPCTSTR)sUser, sUser.GetLength() );
  65. if( !get_response( IDENTIFICATION ) )
  66. {
  67. m_wsPOP3Server.Close();
  68. return FALSE;
  69. }
  70. sPass.Format( "PASS %srn", GetPassword());
  71. m_wsPOP3Server.Send( (LPCTSTR)sPass, sPass.GetLength() );
  72. if( !get_response( AUTHENTIFICATION ) )
  73. {
  74. m_wsPOP3Server.Close();
  75. return FALSE;
  76. }
  77. m_bConnected = TRUE;
  78. return TRUE;
  79. }
  80. BOOL CPOP3::get_response( UINT executed_action )
  81. {
  82. int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE );
  83. if( nChars == SOCKET_ERROR )
  84. {
  85. m_sError = _T( "Socket Error" );
  86. return FALSE;
  87. }
  88. m_sResponse = response_buf;
  89. m_sResponse = m_sResponse.Left(nChars);
  90. if (m_sResponse.Left(4)=="-ERR")
  91. {
  92. m_sError=error_table[executed_action];
  93. return FALSE; 
  94. }
  95. return TRUE;
  96. }
  97. UINT CPOP3::GetPort()
  98. {
  99. return m_nPort;
  100. }
  101. CString CPOP3::GetUsername()
  102. {
  103. return m_sUsername;
  104. }
  105. CString CPOP3::GetPassword()
  106. {
  107. return m_sPassword;
  108. }
  109. CString CPOP3::GetLastError()
  110. {
  111. return m_sError;
  112. }
  113. CString CPOP3::GetServerHostName()
  114. {
  115. return m_sPOP3ServerHostName;
  116. }
  117. void CPOP3::SetServerProperties( LPCTSTR sServerHostName, UINT nPort)
  118. {
  119. ASSERT( sServerHostName != NULL );
  120. // Needs to be safe in non-debug too
  121. if( sServerHostName == NULL )
  122. return;
  123. m_sPOP3ServerHostName = sServerHostName;
  124. m_nPort = nPort;
  125. }
  126. void CPOP3::SetUserProperties( LPCTSTR sUsername, LPCTSTR sPassword )
  127. {
  128. ASSERT( sUsername != NULL );
  129. ASSERT( sPassword != NULL );
  130. if( sUsername == NULL )
  131. return;
  132. if( sPassword == NULL )
  133. return;
  134. m_sUsername = sUsername;
  135. m_sPassword = sPassword;
  136. }
  137. BOOL CPOP3::Disconnect()
  138. {
  139. BOOL ret;
  140. if( !m_bConnected )
  141. return TRUE;
  142. // Disconnect gracefully from the server and close the socket
  143. CString sQuit = _T( "QUITrn" );
  144. m_wsPOP3Server.Send( (LPCTSTR)sQuit, sQuit.GetLength() );
  145. // No need to check return value here.
  146. // If it fails, the message is available with GetLastError
  147. ret = get_response( QUIT );
  148. m_wsPOP3Server.Close();
  149. m_bConnected = FALSE;
  150. return ret;
  151. }
  152. int CPOP3::GetNumMessages()
  153. {
  154. CString sStat = _T( "STATrn" );
  155. m_wsPOP3Server.Send( (LPCTSTR)sStat, sStat.GetLength() );
  156. if( !get_response( STATUS ) ) return -1;
  157. int pos=m_sResponse.FindOneOf("0123456789");
  158. if (pos<0) return -1;
  159. return atoi(m_sResponse.Mid(pos));
  160. }
  161. BOOL CPOP3::GetMessage( UINT nMsg, CMailMessage* msg)
  162. {
  163. CString sMsg;
  164. CString sRetr;
  165. sRetr.Format("RETR %drn",nMsg);
  166. m_wsPOP3Server.Send( (LPCTSTR)sRetr, sRetr.GetLength() );
  167. if( !get_response( RETRIEVE ) ) return FALSE;
  168. sMsg=m_sResponse;
  169. while ( sMsg.Find("rn.rn")<0 ) 
  170. {
  171. // nChars = number of bytes read
  172. int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE );
  173. if ( nChars == SOCKET_ERROR ) return FALSE;
  174. m_sResponse=response_buf;
  175. sMsg+=m_sResponse.Left( nChars ); //only the first nChars bytes of response_buf are valid !
  176. }
  177. sMsg=sMsg.Mid(sMsg.Find("rn")+2); //first line of output is +OK
  178. sMsg=sMsg.Left(sMsg.GetLength()-3); //last line is always .rn
  179. int br=sMsg.Find("rnrn"); //breakpoint between header and body
  180. msg->m_sHeader=sMsg.Left(br);
  181. msg->m_sBody=sMsg.Mid(br+4);
  182. msg->DecodeHeader();
  183. msg->DecodeBody();
  184. return TRUE;
  185. }
  186. BOOL CPOP3::DeleteMessage( UINT nMsg )
  187. {
  188. CString sDele = _T( "STATrn" );
  189. sDele.Format("DELE %drn",nMsg);
  190. m_wsPOP3Server.Send( (LPCTSTR)sDele, sDele.GetLength() );
  191. return get_response( DELE );
  192. }