SMailer.h
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. // Simple Mail Sender (Interface)
  3. //
  4. // Copyright (c) 2003 by Morning
  5. // http://morningspace.51.net
  6. // mailto:moyingzz@etang.com
  7. //
  8. // Permission to use, copy, modify, distribute and sell this program for any 
  9. // purpose is hereby granted without fee, provided that the above copyright 
  10. // notice appear in all copies and that both that copyright notice and this 
  11. // permission notice appear in supporting documentation.
  12. //
  13. // It is provided "as is" without express or implied warranty.
  14. ////////////////////////////////////////////////////////////////////////////////
  15. #ifndef _SMAILER_H_
  16. #define _SMAILER_H_
  17. #pragma warning( disable : 4786 ) // warning C4786: identifier was truncated to '255' characters in the browser information
  18. //
  19. #include <string>
  20. #include <vector>
  21. #include <map>
  22. // #include <exception>
  23. // #include <winsock2.h>
  24. //
  25. namespace SMailer {
  26. // class MimeContent(Abstract class)
  27. /////////////////////////////////////
  28. class MimeContent
  29. {
  30. public:
  31.     MimeContent(const std::string content = "");
  32.     virtual std::string  getType() const = 0;
  33.     virtual std::string  getDisposition() const;
  34.     virtual std::string  getTransEncoding() const = 0;
  35.     virtual std::string& getContent() = 0;
  36. protected:
  37.     std::string _content;
  38. };
  39. typedef std::vector<MimeContent*> MimeContents;
  40. // class PlainTextContent
  41. /////////////////////////////////////
  42. class TextPlainContent : public MimeContent
  43. {
  44. public:
  45.     TextPlainContent(const std::string content, 
  46.                      const std::string charset = "gb2312");
  47.     virtual std::string  getType() const;
  48.     virtual std::string  getTransEncoding() const;
  49.     virtual std::string& getContent();
  50. private:
  51.     std::string _charset;
  52. };
  53. // class TextHtmlContent
  54. /////////////////////////////////////
  55. class TextHtmlContent : public MimeContent
  56. {
  57. public:
  58.     TextHtmlContent(const std::string content, 
  59.                     const std::string charset = "gb2312");
  60.     virtual std::string  getType() const;
  61.     virtual std::string  getTransEncoding() const;
  62.     virtual std::string& getContent();
  63. private:
  64.     std::string _charset;
  65. };
  66. // class AppOctStrmContent
  67. /////////////////////////////////////
  68. class AppOctStrmContent : public MimeContent
  69. {
  70. public:
  71.     AppOctStrmContent(const std::string file_name);
  72.     virtual std::string  getType() const;
  73.     virtual std::string  getDisposition() const;
  74.     virtual std::string  getTransEncoding() const;
  75.     virtual std::string& getContent();
  76. private:
  77.     std::string _file_name;
  78.     std::string _name;
  79. };
  80. // class Priority(Helper class)
  81. /////////////////////////////////////
  82. class Priority
  83. {
  84. public:
  85.     static const std::string important;
  86.     static const std::string normal;
  87.     static const std::string trivial;
  88. };
  89. // class MailInfo
  90. /////////////////////////////////////
  91. typedef std::multimap<std::string, std::string> Receivers;
  92. class MailInfo
  93. {
  94. public:
  95.     MailInfo();
  96.     void setSenderName(const std::string name);
  97.     void setSenderAddress(const std::string address);
  98.     std::string getSenderName() const;
  99.     std::string getSenderAddress() const;
  100.     void addReceiver(const std::string name, const std::string address);
  101.     void setReceiver(const std::string name, const std::string address);
  102.     const Receivers& getReceivers() const;
  103.     void setPriority(std::string priority);
  104.     std::string getPriority() const;
  105.     void setSubject(const std::string subject);
  106.     std::string getSubject() const;
  107.     void addMimeContent(MimeContent* content);
  108.     void clearMimeContents();
  109.     const MimeContents& getMimeContents() const;
  110. private:
  111.     std::string  _sender_name;
  112.     std::string  _sender_address;
  113.     Receivers    _receivers;
  114.     std::string  _priority;
  115.     std::string  _subject;
  116.     MimeContents _contents;
  117. };
  118. // class MailWrapper
  119. /////////////////////////////////////
  120. class MailWrapper
  121. {
  122. public:
  123.     MailWrapper(MailInfo* mail_info);
  124.     std::string getSenderAddress();
  125.     std::string getHeader();
  126.     std::string getEnd();
  127.     void traverseReceiver();
  128.     bool hasMoreReceiver();
  129.     std::string nextReceiverAddress();
  130.     void traverseContent();
  131.     bool hasMoreContent();
  132.     std::string& nextContent();
  133. private:
  134.     static const std::string _mailer_name;
  135.     static const std::string _boundary;
  136.     MailInfo* _mail_info;
  137.     Receivers::const_iterator _rcv_itr;
  138.     std::string _content;
  139.     MimeContents::const_iterator _con_itr;
  140.     std::string prepareFrom();
  141.     std::string prepareTo();
  142.     std::string prepareDate();
  143.     std::string prepareName(const std::string raw_name);
  144. };
  145. // class MailSender
  146. /////////////////////////////////////
  147. class MailSender
  148. {
  149. public:
  150.     MailSender(const std::string server_name, 
  151.                const std::string user_name = "", 
  152.                const std::string user_pwd = "");
  153.     ~MailSender();
  154.     void setMail(MailWrapper* mail);
  155.     bool sendMail();
  156.     
  157.     const char * getErrMessage()
  158.     {
  159.      return _err_message.c_str();
  160.     }
  161. private:
  162.     enum {SERVICE_PORT = 25};
  163.     enum Operaion
  164.     {
  165.         send_helo_cmd, 
  166.         send_auth_cmd, 
  167.         send_username, 
  168.         send_password, 
  169.         send_mail_cmd, 
  170.         send_rcpt_cmd, 
  171.         send_data_cmd, 
  172.         send_header, 
  173.         send_content, 
  174.         send_end, 
  175.         send_quit_cmd, 
  176.     };
  177.     std::string _server_name;
  178.     std::string _user_name;
  179.     std::string _user_pwd;
  180.     SOCKET _socket;
  181.     MailWrapper* _mail;
  182.     
  183.     std::string _err_message;
  184.     std::string getSenderAddress() const;
  185.     bool conn();
  186.     bool hello();
  187.     bool login();
  188.     bool sendHeader();
  189.     bool sendContent();
  190.     bool sendEnd();
  191.     bool quit();
  192.     bool sendRequest(Operaion operation, const std::string content);
  193.     bool rcvResponse(const std::string expected_response);
  194.     friend class ErrorMessage;
  195. };
  196. // class ErrorMessage(Helper class)
  197. /////////////////////////////////////
  198. class ErrorMessage
  199. {
  200. public:
  201.     static ErrorMessage& getInstance();
  202.     std::string request (MailSender::Operaion request_operation);
  203.     std::string response(const std::string expected_response);
  204. private:
  205.     std::map<MailSender::Operaion, std::string> _request_errmsg_map;
  206.     std::map<std::string, std::string> _respons_errmsg_map;
  207.     ErrorMessage();
  208. };
  209. // class MailException(Helper class)
  210. /////////////////////////////////////
  211. class MailException : public std::exception
  212. {
  213. public:
  214.     MailException(std::string message = "")
  215.      : _message(message)
  216.     {
  217.     }
  218. ~MailException() { }
  219.     const char *what() const
  220.     {
  221.         return _message.c_str();
  222.     }
  223. private:
  224.     std::string _message;
  225. };
  226. } // namespace SMailer
  227. #endif // _SMAILER_H_