acl  3.5.3.0
mail_message.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/string.hpp"
4 #include "../stdlib/noncopyable.hpp"
5 #include <vector>
6 
7 #if !defined(ACL_MIME_DISABLE)
8 
9 namespace acl {
10 
11 class dbuf_pool;
12 struct rfc822_addr;
13 class mail_attach;
14 class mail_body;
15 class ofstream;
16 
17 /**
18  * 邮件数据构造类,此类可以生成一封完整的邮件,同时还用于构建 SMTP 发送过程
19  * 的邮件信封信息
20  */
22 {
23 public:
24  /**
25  * 构造函数
26  * @param charset {const char*} 字符集
27  */
28  mail_message(const char* charset = "utf-8");
29  ~mail_message();
30 
31  /**
32  * 设置 SMTP 发送过程的身份验证信息
33  * @param user {const char*} 邮箱账号
34  * @param pass {const char*} 邮箱密码
35  * @return {mail_message&}
36  */
37  mail_message& set_auth(const char* user, const char* pass);
38 
39  /**
40  * 设置邮件的发送都邮箱,此字段可用于 SMTP 发送过程的 MAIL FROM 命令,
41  * 同时又可作为邮件头中的 From 字段值
42  * @param from {const char*} 发件人邮件地址
43  * @param name {const char*} 发件人名称
44  * @return {mail_message&}
45  */
46  mail_message& set_from(const char* from, const char* name = NULL);
47 
48  mail_message& set_sender(const char* sender, const char* name = NULL);
49 
50  /**
51  * 设置邮件头中的 Reply-To 字段值
52  * @param reply_to {const char*} Reply-To 邮箱字段值
53  * @param name {const char*} Reply-To 对应的人员名称
54  * @return {mail_message&}
55  */
56  mail_message& set_reply_to(const char* reply_to, const char* name = NULL);
57 
58  /**
59  * 设置邮件头中的 Return-Path 字段值
60  * @param return_path {const char*} Return-Path 邮箱字段值
61  * @return {mail_message&}
62  */
63  mail_message& set_return_path(const char* return_path);
64 
65  /**
66  * 设置邮件头中的 Delivered-To 字段值
67  * @param delivered_to {const char*} Delivered-To 邮箱字段值
68  * @return {mail_message&}
69  */
70  mail_message& set_delivered_to(const char* delivered_to);
71 
72  /**
73  * 添加收件人地址,该地址仅出现在信封中,不出现在邮件头中
74  * @param recipients {const char*} 收件人集合,遵守 RFC822 格式
75  * @return {mail_message&}
76  */
77  mail_message& add_recipients(const char* recipients);
78 
79  /**
80  * 设置邮件头中的 To 字段值,同时该收件人地址集合被用于信封中作为收件人
81  * @param to {const char*} 收件人邮箱地址集合,遵守 RFC822 格式
82  * @return {mail_message&}
83  */
84  mail_message& add_to(const char* to);
85 
86  /**
87  * 设置邮件头中的 Cc 字段值,同时该收件人地址集合被用于信封中作为收件人
88  * @param cc {const char*} 收件人邮箱地址集合,遵守 RFC822 格式
89  * @return {mail_message&}
90  */
91  mail_message& add_cc(const char* cc);
92 
93  /**
94  * 设置邮件发送的暗送地址集合,该地址集合不会出现在邮件头中
95  * @param bcc {const char*} 暗送邮箱地址集合,遵守 RFC822 格式
96  * @return {mail_message&}
97  */
98  mail_message& add_bcc(const char* bcc);
99 
100  /**
101  * 设置邮件头中的主题,该主题将采用 rfc2047 编码且采用类构造函数
102  * 设置的字符集
103  * @param subject {const char*} 邮件头主题字段值
104  * @return {mail_message&}
105  */
106  mail_message& set_subject(const char* subject);
107 
108  /**
109  * 用户可以调用此函数添加邮件头中的头部扩展字段值
110  * @param name {const char*} 字段名
111  * @param value {const char*} 字段值
112  * @return {mail_message&}
113  */
114  mail_message& add_header(const char* name, const char* value);
115 
116  /**
117  * 设置邮件的正文对象
118  * @param body {const mail_body&} 邮件正文对象
119  * @return {mail_message&}
120  */
121  mail_message& set_body(const mail_body& body);
122 
123  /**
124  * 给一封邮件添加一个附件
125  * @param filepath {const char*} 附件全路径(非空)
126  * @param content_type {const char*} 附件类型(非空)
127  * @return {mail_message&}
128  */
129  mail_message& add_attachment(const char* filepath,
130  const char* content_type);
131 
132  /**
133  * 构造一封完整的邮件,并将邮件内容存储于给定磁盘文件中,如果该文件
134  * 存在则首先会清空,否则会创建新的文件
135  * @param filepath {const char*} 目标文件
136  * @return {bool} 操作是否成功
137  */
138  bool save_to(const char* filepath);
139 
140  /**
141  * 可以单独调用本函数用来生成邮件头数据
142  * @param out {string&} 创建的邮件头数据将追加于该缓冲区中
143  * @return {bool} 操作是否成功
144  */
145  bool build_header(string& out);
146 
147  /**
148  * 获得所创建的邮件在磁盘上的全路径,该函数必须在调用 save_to 成功后调用
149  * @return {const char*}
150  */
151  const char* get_email() const
152  {
153  return filepath_;
154  }
155 
156  /**
157  * 获得用于 SMTP 身份验证时的邮箱账号
158  * @return {const char*}
159  */
160  const char* get_auth_user() const
161  {
162  return auth_user_;
163  }
164 
165  /**
166  * 获得用于 SMTP 身份验证时的邮箱账号密码
167  * @return {const char*}
168  */
169  const char* get_auth_pass() const
170  {
171  return auth_pass_;
172  }
173 
174  /**
175  * 获得由 set_from 设置的邮箱地址对象
176  * @return {const rfc822_addr*}
177  */
178  const rfc822_addr* get_from() const
179  {
180  return from_;
181  }
182 
183  /**
184  * 获得由 set_sender 设置的邮箱地址对象
185  * @return {const rfc822_addr*}
186  */
187  const rfc822_addr* get_sender() const
188  {
189  return sender_;
190  }
191 
192  /**
193  * 获得由 set_reply_to 设置的邮箱地址对象
194  * @return {const rfc822_addr*}
195  */
196  const rfc822_addr* get_reply_to() const
197  {
198  return reply_to_;
199  }
200 
201  /**
202  * 获得由 set_return_path 设置的邮箱地址对象
203  * @return {const rfc822_addr*}
204  */
206  {
207  return return_path_;
208  }
209 
210  /**
211  * 获得由 set_delivered_to 设置的邮箱地址对象
212  * @return {const rfc822_addr*}
213  */
215  {
216  return delivered_to_;
217  }
218 
219  const std::vector<rfc822_addr*>& get_to() const
220  {
221  return to_list_;
222  }
223 
224  /**
225  * 获得由 set_cc 设置的邮箱地址对象集合
226  * @return {const std::vector<rfc822_addr*>&}
227  */
228  const std::vector<rfc822_addr*>& get_cc() const
229  {
230  return cc_list_;
231  }
232 
233  /**
234  * 获得由 set_bcc 设置的邮箱地址对象集合
235  * @return {const std::vector<rfc822_addr*>&}
236  */
237  const std::vector<rfc822_addr*>& get_bcc() const
238  {
239  return bcc_list_;
240  }
241 
242  /**
243  * 获得所有邮件接收者的地址集合
244  * @return {const std::vector<rfc822_addr*>&}
245  */
246  const std::vector<rfc822_addr*>& get_recipients() const
247  {
248  return recipients_;
249  }
250 
251  /**
252  * 获得用户设置的邮件头扩展字段值
253  * @param name {const char*} 字段名
254  * @return {const char*}
255  */
256  const char* get_header_value(const char* name) const;
257 
258  /**
259  * 为 MIME 数据创建唯一的分隔符
260  * @param id {const char*} 调用者填写的 ID 标识
261  * @param out {string&} 存储结果
262  */
263  static void create_boundary(const char* id, string& out);
264 
265 private:
266  dbuf_pool* dbuf_;
267  char* charset_;
268  char* transfer_encoding_;
269 
270  char* auth_user_;
271  char* auth_pass_;
272  rfc822_addr* from_;
273  rfc822_addr* sender_;
274  rfc822_addr* reply_to_;
275  rfc822_addr* return_path_;
276  rfc822_addr* delivered_to_;
277  std::vector<rfc822_addr*> to_list_;
278  std::vector<rfc822_addr*> cc_list_;
279  std::vector<rfc822_addr*> bcc_list_;
280  std::vector<rfc822_addr*> recipients_;
281  char* subject_;
282  std::vector<std::pair<char*, char*> > headers_;
283  std::vector<mail_attach*> attachments_;
284  const mail_body* body_;
285  size_t body_len_;
286  char* filepath_;
287 
288  void add_addrs(const char* in, std::vector<rfc822_addr*>& out);
289  bool append_addr(const rfc822_addr& addr, string& out);
290  bool append_addr(const char* name, const rfc822_addr& addr,
291  string& out);
292  bool append_addrs(const char* name,
293  const std::vector<rfc822_addr*>& addrs, string& out);
294  bool append_message_id(string& out);
295  bool append_subject(const char* subject, string& out);
296  bool append_date(string& out);
297  bool append_header(ofstream& fp);
298  bool append_multipart(ofstream& fp);
299 };
300 
301 } // namespace acl
302 
303 #endif // !defined(ACL_MIME_DISABLE)
const char * get_auth_user() const
const rfc822_addr * get_reply_to() const
HTTP_API void const char * name
Definition: lib_http.h:620
const std::vector< rfc822_addr * > & get_recipients() const
const std::vector< rfc822_addr * > & get_bcc() const
const std::vector< rfc822_addr * > & get_to() const
const rfc822_addr * get_return_path() const
const rfc822_addr * get_delivered_to() const
const rfc822_addr * get_sender() const
const char * get_email() const
const rfc822_addr * get_from() const
#define ACL_CPP_API
const char * get_auth_pass() const
const std::vector< rfc822_addr * > & get_cc() const