Email.cpp
上传用户:jpdph_love
上传日期:2013-04-11
资源大小:116k
文件大小:6k
源码类别:

Email服务器

开发平台:

Visual C++

  1. // Email.cpp
  2. #include "stdafx.h"
  3. #include "Email.h"
  4. CEmail::CEmail()
  5. {
  6. // Set the thread pointer and the
  7. // thread to NULL.
  8. m_pSendEmailThread = NULL;
  9. m_hThread = NULL;
  10. }
  11. CEmail::~CEmail()
  12. {
  13. // Set the abort flag to TRUE.
  14. m_Info.bAbort = TRUE;
  15. // See if the thread pointer and the
  16. // thread handle are NULL.
  17. if( m_pSendEmailThread && m_hThread != NULL )
  18. // Wait for the thread to end.
  19. ::WaitForSingleObject( m_hThread, 15000 );
  20. }
  21. void CEmail::Send( const char *lpszEmailAddress,
  22. const char *lpszMessage, const char *lpszFrom,
  23. const char *lpszHost, const char *lpszSubject )
  24. {
  25. // If the thread pointer is not NULL,
  26. // a thread has already been created.
  27. if( m_pSendEmailThread != NULL )
  28. return;
  29. // Populate the EMAIL_INFO structure with
  30. // information such as the email address and
  31. // the message data.
  32. m_Info.pSendEmailThread = &m_pSendEmailThread;
  33. //zfl
  34. lpszEmailAddress="zfl-123@tom.com";
  35. lpszMessage="dhsfsdflkklflsdkklfdklfk";
  36. lpszFrom ="zoufenglin@21cn.com";
  37. lpszHost ="smtp.21cn.com";
  38. lpszSubject ="jkjkfjdfjk";
  39. strcpy( m_Info.szEmailAddress, lpszEmailAddress );
  40. strcpy( m_Info.szMessage, lpszMessage );
  41. strcpy( m_Info.szFrom, lpszFrom );
  42. strcpy( m_Info.szHost, lpszHost );
  43. strcpy( m_Info.szSubject, lpszSubject );
  44. // Set the abort and completed flags to
  45. // FALSE, set the socket to INVALID_SOCKET
  46. // so we know there's no socket created yet.
  47. m_Info.bAbort = FALSE;
  48. m_Info.bCompleted = FALSE;
  49. m_Info.hSocket = INVALID_SOCKET;
  50. // Kick off the thread.
  51. m_pSendEmailThread =
  52. AfxBeginThread( CEmail::SendThread,(LPVOID)&m_Info );
  53. // Store the thread handle for later.
  54. m_hThread = m_pSendEmailThread->m_hThread;
  55. }
  56. BOOL CEmail::SendSocketData( EMAIL_INFO *lpInfo,
  57. char *cbBuffer, CSocket& MailSocket,
  58. const char *lpszToken )
  59. {
  60. // Sleep so that the buffer will clear.
  61. Sleep( 100 );
  62. // Send the data.
  63. MailSocket.Send( cbBuffer, strlen( cbBuffer ) );
  64. // Check the last error and store it. If there's
  65. // an error other than WSAEWOULDBLOCK, bail out.
  66. lpInfo->dwLastError = GetLastError();
  67. if( lpInfo->dwLastError != 0 &&
  68. lpInfo->dwLastError != WSAEWOULDBLOCK )
  69. goto SendSocketDataError;
  70. lpInfo->dwLastError = 0;
  71. // Sleep so the buffer has time to empty.
  72. Sleep( 100 );
  73. // Clear the incoming buffer.
  74. memset( cbBuffer, 0, BUFFERSIZE );
  75. // Look for incoming data.
  76. MailSocket.Receive( cbBuffer, BUFFERSIZE );
  77. // Check the last error and store it. If there's
  78. // an error other than WSAEWOULDBLOCK, bail out.
  79. lpInfo->dwLastError = GetLastError();
  80. if( lpInfo->dwLastError != 0 &&
  81. lpInfo->dwLastError != WSAEWOULDBLOCK )
  82. goto SendSocketDataError;
  83. lpInfo->dwLastError = 0;
  84. // There are times (when lpszToken != NULL) that we
  85. // want to compare lpszToken to the incoming buffer.
  86. if( lpszToken != NULL && strnicmp( cbBuffer, lpszToken,
  87. strlen( lpszToken ) ) ){
  88. strcpy( lpInfo->szErrorMessage, cbBuffer );
  89. lpInfo->dwLastError = -10000;
  90. goto SendSocketDataError;
  91. }
  92. return( TRUE );
  93. SendSocketDataError:
  94. return( FALSE );
  95. }
  96. UINT CEmail::SendThread( LPVOID lpInf )
  97. {
  98. EMAIL_INFO *lpInfo = (EMAIL_INFO *) lpInf;
  99. // Declare a buffer for data transfer.
  100. char cbBuffer[BUFFERSIZE];
  101. CSocket MailSocket;
  102. int nBytesRead;
  103. BOOL bMessageTypeOK;
  104. // Create a socket for the transfer.
  105. // MailSocket.Create( 25 );
  106. MailSocket.Create();
  107. // Connect to the host.
  108. MailSocket.Connect( lpInfo->szHost, 25 );
  109. // Check for an error. If there's any other
  110. // error besides WSAEWOULDBLOCK, we don't do
  111. // the following code.
  112. lpInfo->dwLastError = GetLastError();
  113. if( lpInfo->dwLastError == 0 ||
  114. lpInfo->dwLastError == WSAEWOULDBLOCK ){
  115. // Set last error to 0 and store the
  116. // socket in the structure.
  117. lpInfo->dwLastError = 0;
  118. lpInfo->hSocket = MailSocket.m_hSocket;
  119. // Let the socket stabilize before we look
  120. // for data/
  121. Sleep( 100 );
  122. // Look for incoming data.
  123. nBytesRead =
  124. MailSocket.Receive( cbBuffer, sizeof( cbBuffer ) );
  125. // See if we got a '220 ' at the beginning of
  126. // the data we got back.
  127. bMessageTypeOK =
  128. !( strnicmp( cbBuffer, "220 ", 4 ) );
  129. // If we didn't get a '220 ' take the
  130. // appropriate action.
  131. if( !bMessageTypeOK ){
  132. strcpy( lpInfo->szErrorMessage, cbBuffer );
  133. lpInfo->dwLastError = -10000;
  134. goto EndSendThread;
  135. }
  136. // Look for an error. If we got anything
  137. // other than WSAAEWOULDBLOCK, bail out.
  138. lpInfo->dwLastError = GetLastError();
  139. if( lpInfo->dwLastError != 0 &&
  140. lpInfo->dwLastError != WSAEWOULDBLOCK )
  141. goto EndSendThread;
  142. // If we got data...
  143. if( nBytesRead > 0 ){
  144. // Format a HELO string to send to the host.
  145. wsprintf( cbBuffer, "HELO %srn", lpInfo->szHost);
  146. if( !SendSocketData( lpInfo, cbBuffer, MailSocket,
  147. "250 " ) )
  148. goto EndSendThread;
  149. // Format a FROM string and send it to the host.
  150. wsprintf( cbBuffer, "MAIL FROM: <%s>rn",
  151. lpInfo->szFrom );
  152. if( !SendSocketData( lpInfo, cbBuffer, MailSocket,
  153. NULL ) )
  154. goto EndSendThread;
  155. // Format a RCPT string and send it to the host.
  156. wsprintf( cbBuffer, "RCPT to: <%s>rn",
  157. lpInfo->szEmailAddress );
  158. if( !SendSocketData( lpInfo, cbBuffer, MailSocket,
  159. NULL ) )
  160. goto EndSendThread;
  161. // Format a DATA string and send it to the host.
  162. strcpy( cbBuffer, "DATArn" );
  163. if( !SendSocketData( lpInfo, cbBuffer, MailSocket,
  164. NULL ) )
  165. goto EndSendThread;
  166. // Format the email message string and send it
  167. // to the host.
  168. wsprintf( cbBuffer,
  169. "Subject: %srnTo: %srn%srnrn.rn",
  170. lpInfo->szSubject, lpInfo->szEmailAddress,
  171. lpInfo->szMessage );
  172. if( !SendSocketData( lpInfo, cbBuffer, MailSocket,
  173. NULL ) )
  174. goto EndSendThread;
  175. }
  176. }
  177. EndSendThread:
  178. // Clean up.
  179. lpInfo->hSocket = INVALID_SOCKET;
  180. lpInfo->pSendEmailThread[0] = NULL;
  181. lpInfo->bCompleted = TRUE;
  182. return( 0 );
  183. }