Smtp.h
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:8k
源码类别:

CA认证

开发平台:

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