WEB开发网
开发学院软件开发VC 一组实现邮件发送功能的C++封装类-SMailer 阅读

一组实现邮件发送功能的C++封装类-SMailer

 2010-07-01 20:43:08 来源:WEB开发网   
核心提示:MailInfo类MailInfo封装了一封邮件所包含的全部信息,包括:发件人姓名地址、收件人姓名地址、主题、正文、附件等等,一组实现邮件发送功能的C++封装类-SMailer(2),class MailInfo{public:MailInfo();void setSenderName(const std::strin

MailInfo

类MailInfo封装了一封邮件所包含的全部信息,包括:发件人姓名地址、收件人姓名地址、主题、正文、附件等等。

class MailInfo
{
public:
  MailInfo();
  void setSenderName(const std::string name);
  void setSenderAddress(const std::string address);
  std::string getSenderName() const;
  std::string getSenderAddress() const;
  void addReceiver(const std::string name, const std::string address);
  void setReceiver(const std::string name, const std::string address);
  const Receivers& getReceivers() const;
  void setPriority(std::string priority);
  std::string getPriority() const;
  void setSubject(const std::string subject);
  std::string getSubject() const;
  void addMimeContent(MimeContent* content);
  void clearMimeContents();
  const MimeContents& getMimeContents() const;
private:
  std::string _sender_name;
  std::string _sender_address;
  Receivers  _receivers;
  std::string _priority;
  std::string _subject;
  MimeContents _contents;
};

有两点说明:

- 由于收件人可能不止一个,所以在MailInfo中使用了一个std::multimap容器来记录收件人的姓名和地址,上面的Receivers就是std::multimap,其中以姓名为key,地址为value。因为是multimap,所以也就满足了同名同姓的情况了。

- 正如前面看到的,对于邮件的正文和附件,MailInfo采取了一视同仁的态度,能做到这一点应该要归功于MimeContent的抽象特性。MailInfo中使用了一个std::vector容器,用来保存MimeContent子类对象的指针,上面的MimeContents就是std::vector<MimeContent*>。另外,函数addMimeContent、clearMimeContents和getMimeContents为外界提供了添加、删除正文或附件的统一接口。 

MailWrapper

MailWrapper对MailInfo做了进一步的包装,用于对MailInfo的信息进行加工再处理,以适应真正的邮件发送的需要。它内含了一个指向MailInfo类对象的指针。另外,对收件人和正文/附件信息的遍历,MailWrapper采用了类似Iterator Pattern的方法,但是考虑到仅限于此处用到了遍历机制并且不想使程序变得过于复杂,于是此处直接将遍历接口附着于MailWrapper之上了:

class MailWrapper
{
public:
  MailWrapper(MailInfo* mail_info);
  std::string getSenderAddress();
  std::string getHeader();
  std::string getEnd();
  void traverseReceiver();
  bool hasMoreReceiver();
  std::string nextReceiverAddress();
  void traverseContent();
  bool hasMoreContent();
  std::string& nextContent();
private:
  static const std::string _mailer_name;
  static const std::string _boundary;
  MailInfo* _mail_info;
  Receivers::const_iterator _rcv_itr;
  std::string _content;
  MimeContents::const_iterator _con_itr;
  std::string prepareFrom();
  std::string prepareTo();
  std::string prepareDate();
  std::string prepareName(const std::string raw_name);
};

Tags:实现 邮件 发送

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接