CSmtp.h
上传用户:young001
上传日期:2007-07-04
资源大小:33k
文件大小:8k
源码类别:

WEB邮件程序

开发平台:

Visual C++

  1. // CSmtp.h: interface for the CSmtp class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_CSMTP_H__A0D4A072_65DE_11D2_9816_9523BDBAF506__INCLUDED_)
  5. #define AFX_CSMTP_H__A0D4A072_65DE_11D2_9816_9523BDBAF506__INCLUDED_
  6. #if _MSC_VER >= 1000
  7. #pragma once
  8. #endif // _MSC_VER >= 1000
  9. //////////////////////////////////////////////////////////////////////
  10. // CMailMessage
  11. // Formats a message compliant with RFC 822
  12. #include <afxtempl.h>
  13. #include "CConnection.h"
  14. class CMailMessage  
  15. {
  16. public:
  17. CMailMessage();
  18. virtual ~CMailMessage();
  19. void FormatMessage();
  20. int GetNumRecipients();
  21. BOOL GetRecipient(CString& sEmailAddress, CString& sFriendlyName, int nIndex = 0);
  22. BOOL AddRecipient(LPCTSTR szEmailAddress, LPCTSTR szFriendlyName = "");
  23. BOOL AddMultipleRecipients(LPCTSTR szRecipients = NULL);
  24. UINT GetCharsPerLine();
  25. void SetCharsPerLine(UINT nCharsPerLine);
  26. CString m_sFrom;
  27. CString m_sSubject;
  28. CString m_sEnvelope;
  29. CString m_sMailerName;
  30. CString m_sHeader;
  31. CTime m_tDateTime;
  32. CString m_sBody;
  33. private:
  34. UINT m_nCharsPerLine;
  35. class CRecipient
  36. {
  37. public:
  38. CString m_sEmailAddress;
  39. CString m_sFriendlyName;
  40. };
  41. CArray <CRecipient, CRecipient&> m_Recipients;
  42. protected:
  43. // When overriding prepare_header(), call base class 
  44. // version first, then add specialized 
  45. // add_header_line calls.
  46. // This ensures that the base class has a chance to
  47. // create the header lines it needs.
  48. virtual void prepare_header();
  49. virtual void prepare_body();
  50. virtual void end_header();
  51. virtual void start_header();
  52. // This rarely needs overwriting, but is virtual just in case.
  53. // Do not include the trailing CR/LF in parameter.
  54. virtual void add_header_line(LPCTSTR szHeaderLine);
  55. };
  56. // CMIMEContentAgent
  57. // Abstract base class. Content agents support MIME
  58. // content types on behalf of CMIMEMessage
  59. //
  60. class CMIMEContentAgent  
  61. {
  62. public:
  63. CMIMEContentAgent(int nMIMEType);
  64. virtual ~CMIMEContentAgent();
  65. BOOL QueryType(int nContentType);
  66. virtual BOOL AppendPart(LPCTSTR szContent,
  67.  LPCTSTR szParameters, 
  68.  int nEncoding, 
  69.  BOOL bPath, 
  70.  CString& sDestination) = 0;
  71. virtual CString GetContentTypeString() = 0;
  72. protected:
  73. virtual CString build_sub_header(LPCTSTR szContent,
  74.   LPCTSTR szParameters,
  75.   int nEncoding,
  76.   BOOL bPath) = 0;
  77. private:
  78. int m_nMIMETypeIHandle;
  79. };
  80. //////////////////////////////////////////////////////////////////////
  81. // CMIMECode
  82. class CMIMECode
  83. {
  84. public:
  85. CMIMECode();
  86. virtual ~CMIMECode();
  87. virtual int Decode( LPCTSTR szDecoding, LPTSTR szOutput ) = 0;
  88. virtual CString Encode( LPCTSTR szEncoding, int nSize ) = 0;
  89. };
  90. //////////////////////////////////////////////////////////////////////
  91. // CBase64
  92. // An encoding agent that handles Base64
  93. class CBase64 : public CMIMECode  
  94. {
  95. public:
  96. CBase64();
  97. virtual ~CBase64();
  98. // Override the base class mandatory functions
  99. virtual int Decode( LPCTSTR szDecoding, LPTSTR szOutput );
  100. virtual CString Encode( LPCTSTR szEncoding, int nSize );
  101. protected:
  102. void write_bits( UINT nBits, int nNumBts, LPTSTR szOutput, int& lp );
  103. UINT read_bits( int nNumBits, int* pBitsRead, int& lp );
  104. int m_nInputSize;
  105. int m_nBitsRemaining;
  106. ULONG m_lBitStorage;
  107. LPCTSTR m_szInput;
  108. static int m_nMask[];
  109. static CString m_sBase64Alphabet;
  110. private:
  111. };
  112. //////////////////////////////////////////////////////////////////////
  113. // CAppOctetStream
  114. class CAppOctetStream : public CMIMEContentAgent
  115. {
  116. public:
  117. virtual CString GetContentTypeString();
  118. CAppOctetStream( int nContentType );
  119. virtual ~CAppOctetStream();
  120. virtual BOOL AppendPart( LPCTSTR szContent, 
  121.  LPCTSTR szParameters, 
  122.  int nEncoding, 
  123.  BOOL bPath, 
  124.  CString& sDestination );
  125. protected:
  126. virtual void attach_file( CStdioFile* pFileAtt, int nEncoding, CString& sDestination );
  127. virtual CString build_sub_header( LPCTSTR szContent, 
  128.   LPCTSTR szParameters, 
  129.   int nEncoding, 
  130.   BOOL bPath );
  131. };
  132. // CTextPlain
  133. // A MIME content agent that handles the "text/plain"
  134. // content type
  135. class CTextPlain : public CMIMEContentAgent  
  136. {
  137. public:
  138. CTextPlain(int nContentType, UINT nWrapPos = 72);
  139. virtual ~CTextPlain();
  140. virtual BOOL AppendPart(LPCTSTR szContent, LPCTSTR szParameters, int nEncoding, BOOL bPath, CString& sDestination);
  141. virtual CString GetContentTypeString();
  142. protected:
  143. UINT m_nWrapPos;
  144. CString wrap_text(LPCTSTR szText);
  145. virtual CString build_sub_header(LPCTSTR szContent, LPCTSTR szParameters, int nEncoding, BOOL bPath);
  146. };
  147. #include <afxmt.h>
  148. // CMIMEMessage
  149. // Formats a message using the MIME specification.
  150. class CMIMEMessage : public CMailMessage  
  151. {
  152. public:
  153. CMIMEMessage();
  154. virtual ~CMIMEMessage();
  155. // MIME Type Codes
  156. enum eMIMETypeCode {
  157. TEXT_PLAIN = 0,
  158. APPLICATION_OCTETSTREAM,
  159. NEXT_FREE_MIME_CODE
  160. };
  161. enum eMIMEEncodingCode {
  162. _7BIT = 0,
  163. _8BIT,
  164. BINARY,
  165. QUOTED_PRINTABLE,
  166. BASE64,
  167. NEXT_FREE_ENCODING_CODE
  168. };
  169. protected:
  170. void AddMIMEPart(CString sBody,eMIMETypeCode eType,CString sParameters,eMIMEEncodingCode eEncoding,BOOL bPath);
  171.     void insert_message_end(CString& sText);
  172. void register_mime_type(CMIMEContentAgent* pMIMEType);
  173. void insert_boundary(CString& sText);
  174. virtual void append_mime_parts();
  175. virtual void prepare_header();
  176. virtual void prepare_body();
  177. CString m_sNoMIMEText;
  178. CString m_sPartBoundary;
  179. CString m_sMIMEContentType;
  180. private:
  181. class CMIMEPart
  182. {
  183. public:
  184. int m_nEncoding;
  185. int m_nContentType;
  186. CString m_sParameters;
  187. BOOL m_bPath;
  188. CString m_sContent;
  189. };
  190. CList <CMIMEPart, CMIMEPart&> m_MIMEPartList;
  191. class CMIMETypeManager
  192. {
  193. public:
  194. CMIMEContentAgent* GetHandler(int nContentType);
  195. void RegisterMIMEType(CMIMEContentAgent* pMIMEType);
  196. virtual  ~CMIMETypeManager();
  197. CMIMETypeManager();
  198. private:
  199. CCriticalSection m_csAccess;
  200. CList <CMIMEContentAgent*, CMIMEContentAgent*> m_MIMETypeList;
  201. };
  202. static CMIMETypeManager m_MIMETypeManager;
  203. };
  204. //////////////////////////////////////////////////////////////////////
  205. // CSmtp
  206. // Main class for SMTP
  207. //#include <afxsock.h>
  208. #define SMTP_PORT 25 // Standard port for SMTP servers
  209. #define RESPONSE_BUFFER_SIZE 1024
  210. class CSmtp  
  211. {
  212. public:
  213. CSmtp(LPCTSTR szSMTPServerName, UINT nPort = SMTP_PORT);
  214. virtual ~CSmtp();
  215. void SetServerProperties(LPCTSTR szSMTPServerName, UINT nPort = SMTP_PORT);
  216. CString GetLastError();
  217. UINT GetPort();
  218. BOOL Disconnect();
  219. BOOL Connect();
  220. BOOL Auth();
  221. virtual BOOL FormatMailMessage(CMailMessage* msg);
  222. BOOL SendMessage(CMailMessage* msg);
  223. CString GetServerHostName();
  224. CString m_User;
  225. CString m_Pass;
  226. CString m_IP;
  227. private:
  228. BOOL get_response(UINT response_expected);
  229. CString cook_body(CMailMessage* msg);
  230. CString m_sError;
  231. BOOL m_bConnected;
  232. BOOL m_bAuthed;
  233. UINT m_nPort;
  234. CString m_sSMTPServerHostName;
  235. //CSocket m_wsSMTPServer;
  236. CConnection m_wsSMTPServer;
  237. protected:
  238. virtual BOOL transmit_message(CMailMessage* msg);
  239. //
  240. // Helper Code
  241. //
  242. struct response_code {
  243. UINT nResponse; // Response we're looking for
  244. TCHAR* sMessage; // Error message if we don't get it
  245. };
  246. enum eResponse {
  247. GENERIC_SUCCESS = 0,
  248. CONNECT_SUCCESS,
  249. AUTHQUE_SUCCESS,
  250. AUTH_SUCCESS,
  251. DATA_SUCCESS,
  252. QUIT_SUCCESS,
  253. // Include any others here
  254. LAST_RESPONSE // Do not add entries past this one
  255. };
  256. TCHAR* response_buf;
  257. static response_code response_table[];
  258. };
  259. #endif // !defined(AFX_CSMTP_H__A0D4A072_65DE_11D2_9816_9523BDBAF506__INCLUDED_)