acl  3.5.3.0
mail_body.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include "../stdlib/string.hpp"
5 #include "../stdlib/noncopyable.hpp"
6 #include "../http/http_ctype.hpp"
7 
8 #if !defined(ACL_MIME_DISABLE)
9 
10 namespace acl {
11 
12 class mime_code;
13 class mail_attach;
14 
15 /**
16  * 邮件正文构建类
17  */
19 {
20 public:
21  /**
22  * 构造函数
23  * @param charset {const char*} 正文的字符集
24  * @param encoding {const char*} 正文的编码格式
25  */
26  mail_body(const char* charset = "utf-8",
27  const char* encoding = "base64");
28  ~mail_body();
29 
30  /**
31  * 获得正文折内容类型
32  * @return {const string&}
33  */
34  const string& get_content_type() const
35  {
36  return content_type_;
37  }
38 
39  /**
40  * 获得正文内容类型对象
41  * @return {const http_ctype&}
42  */
43  const http_ctype& get_ctype() const
44  {
45  return ctype_;
46  }
47 
48  /**
49  * 设置邮件正文为 TEXT/HTML 格式
50  * @param html {const char*} HTML 数据
51  * @param len {size_t} html 数据长度(虽然 html 是字符串格式,但提供
52  * 数据长度有利于调用更灵活高效,内部不再重新通过 strlen 计算长度)
53  * @return {mail_body&}
54  */
55  mail_body& set_html(const char* html, size_t len);
56 
57  /**
58  * 设置邮件正文为 TEXT/PLAIN 格式
59  * @param plain {const char*} TEXT 数据
60  * @param len {size_t} plain 数据长度(虽然 plain 是文本格式,但提供
61  * 数据长度有利于调用更灵活高效,内部不再重新通过 strlen 计算长度)
62  * @return {mail_body&}
63  */
64  mail_body& set_plain(const char* plain, size_t len);
65 
66  /**
67  * 当邮件内容为 multipart/alternative 格式时调用此函数设置相应类型的
68  * 正文内容
69  * @param html {const char*} 正文中的 HTML 数据(非空)
70  * @param hlen {size_t} html 数据长度(>0)
71  * @param plain {const char*} 正文中的 TEXT 数据(非空)
72  * @param plen {size_t} plain 数据长度(>0)
73  * @return {mail_body&}
74  */
75  mail_body& set_alternative(const char* html, size_t hlen,
76  const char* plain, size_t plen);
77 
78  /**
79  * 当邮件正文内容为 multipart/relative 格式时调用此函数设置正文内容
80  * @param html {const char*} 正文中的 HTML 数据(非空)
81  * @param hlen {size_t} html 数据长度(>0)
82  * @param plain {const char*} 正文中的 plain 数据(非空)
83  * @param plen {size_t} plain 数据长度(>0)
84  * @param attachments {const std::vector<mail_attach*>&} 存放
85  * 与 html 中的 cid 相关的图片等附件对象
86  * @return {mail_body&}
87  */
88  mail_body& set_relative(const char* html, size_t hlen,
89  const char* plain, size_t plen,
90  const std::vector<mail_attach*>& attachments);
91 
92  /**
93  * 获得 set_html 函数设置的 html/plain 数据
94  * @param len {size_t} 存放数据长度结果
95  * @return {const char*}
96  */
97  const char* get_html(size_t& len) const
98  {
99  len = hlen_;
100  return html_;
101  }
102 
103  /**
104  * 获得 set_plain 函数设置的 plain/plain 数据
105  * @param len {size_t} 存放数据长度结果
106  * @return {const char*}
107  */
108  const char* get_plain(size_t& len) const
109  {
110  len = plen_;
111  return plain_;
112  }
113 
114  /**
115  * 获得 set_attachments 函数设置的附件集合
116  * @return {const std::vector<mail_attach*>*}
117  */
118  const std::vector<mail_attach*>* get_attachments() const
119  {
120  return attachments_;
121  }
122 
123  /**
124  * 构造邮件正文并将结果追加于给定的输出流中
125  * @param out {ostream&} 输出流对象
126  * @return {bool} 操作是否成功
127  */
128  bool save_to(ostream& out) const;
129 
130  /**
131  * 构造邮件正文并将结果追加于给定的缓冲区中
132  * @param out {string&} 存储结果
133  * @return {bool} 操作是否成功
134  */
135  bool save_to(string& out) const;
136 
137  /**
138  * text/html 格式的邮件正文构造过程,并将结果追加于给定的缓冲区中
139  * @param in {const char*} 输入的 html 格式数据
140  * @param len {size_t} in 的数据长度
141  * @param out {string&} 以数据追加方式存储结果
142  * @return {bool} 操作是否成功
143  */
144  bool save_html(const char* in, size_t len, string& out) const;
145 
146  /**
147  * text/plain 格式的邮件正文构造过程,并将结果追加于给定的缓冲区中
148  * @param in {const char*} 输入的 plain 格式数据
149  * @param len {size_t} in 的数据长度
150  * @param out {string&} 以数据追加方式存储结果
151  * @return {bool} 操作是否成功
152  */
153  bool save_plain(const char* in, size_t len, string& out) const;
154 
155  /**
156  * multipart/relative 格式的邮件正文构造过程,并将结果追加于给定的缓冲区中
157  * @param html {const char*} 输入的 html 格式数据
158  * @param hlen {size_t} html 的数据长度
159  * @param plain {const char*} 正文中的 TEXT 数据(非空)
160  * @param plen {size_t} plain 数据长度(>0)
161  * @param attachments {const std::vector<mail_attach*>&} 存放
162  * 与 html 中的 cid 相关的图片等附件对象
163  * @param out {string&} 以数据追加方式存储结果
164  * @return {bool} 操作是否成功
165  */
166  bool save_relative(const char* html, size_t hlen,
167  const char* plain, size_t plen,
168  const std::vector<mail_attach*>& attachments,
169  string& out) const;
170 
171  /**
172  * multipart/alternative 格式的邮件正文构造过程,并将结果追加于给定的缓冲区中
173  * @param html {const char*} 输入的 html 格式数据
174  * @param hlen {size_t} html 的数据长度
175  * @param plain {const char*} 正文中的 TEXT 数据(非空)
176  * @param plen {size_t} plain 数据长度(>0)
177  * @param out {string&} 以数据追加方式存储结果
178  * @return {bool} 操作是否成功
179  */
180  bool save_alternative(const char* html, size_t hlen,
181  const char* plain, size_t plen, string& out) const;
182 
183 private:
184  string charset_;
185  string content_type_;
186  string transfer_encoding_;
187  mime_code* coder_;
188  string boundary_;
189  http_ctype ctype_;
190  int mime_stype_;
191 
192  const char* html_;
193  size_t hlen_;
194  const char* plain_;
195  size_t plen_;
196  const std::vector<mail_attach*>* attachments_;
197 
198  bool build(const char* in, size_t len, const char* content_type,
199  const char* charset, mime_code& coder, string& out) const;
200  bool build_html(const char* in, size_t len,
201  const char* charset, string& out) const;
202  bool build_plain(const char* in, size_t len,
203  const char* charset, string& out) const;
204 
205  void set_content_type(const char* content_type);
206 };
207 
208 } // namespace acl
209 
210 #endif // !defined(ACL_MIME_DISABLE)
const std::vector< mail_attach * > * get_attachments() const
Definition: mail_body.hpp:118
const char * get_plain(size_t &len) const
Definition: mail_body.hpp:108
const http_ctype & get_ctype() const
Definition: mail_body.hpp:43
const string & get_content_type() const
Definition: mail_body.hpp:34
const char * get_html(size_t &len) const
Definition: mail_body.hpp:97
#define ACL_CPP_API