// 将邮件正文内容保存在磁盘上 // 将邮件正文内容保存在缓冲区中 // 采用管道流模式将邮件正文内容进行字符集转换,且保存在磁盘上 // 将邮件中的附件保存在磁盘上 // 将解析后的邮件再重新组合并保存在磁盘上 static void mime_test1(acl::mime& mime, const char* path, bool htmlFirst) { mime.reset(); acl::string buf; acl::ofstream fp_out; acl::mime_body* pBody = NULL; printf("\r\n>>> %s: path: %s\n", __FUNCTION__, path); ACL_METER_TIME("---------------parse begin --------------------"); if (mime.parse(path) == false) { printf("mime parse %s error\n", path); return; } ACL_METER_TIME("---------------parse end --------------------"); pBody = mime.get_body_node(htmlFirst, true, "iso-2022-jp"); ////////////////////////////////////////////////////////////////////// // 将邮件正文内容保存在磁盘上 printf("\r\n"); ACL_METER_TIME("---------------save_body begin--------------------"); header_out(&mime); mime.mime_debug("./var"); printf(">>>ctype: %s, stype: %s\r\n", mime.get_ctype(), mime.get_stype()); buf = "./var/"; buf += path; mime.save_as(buf.c_str()); if (pBody) pBody->save_body("./var/body_gb.txt"); ACL_METER_TIME("---------------save_body end --------------------"); ////////////////////////////////////////////////////////////////////// // 将邮件正文内容保存在缓冲区中 if (pBody) { acl::string buf1; pBody->save_body(buf1); if (fp_out.open_write("./var/body_string.txt")) { fp_out.write(buf1.c_str(), buf1.length()); fp_out.close(); } } ////////////////////////////////////////////////////////////////////// // 将邮件正文内容以 utf-8 存在磁盘上 if (pBody) { printf("\r\n"); ACL_METER_TIME("---------------save_body begin--------------------"); acl::charset_conv jp2utf8; jp2utf8.update_begin("iso-2022-jp", "utf-8"); acl::pipe_string pipe_out; pipeline_string pipeline; acl::pipe_manager manager; manager.push_front(&pipe_out); manager.push_front(&jp2utf8); manager.push_front(&pipeline); pBody->save(manager); ACL_METER_TIME("---------------save_body end1 --------------------"); acl::string& sbuf = pipe_out.get_buf(); fp_out.close(); if (fp_out.open_write("./var/body_utf8.txt")) { fp_out.write(sbuf.c_str(), sbuf.length()); fp_out.close(); } ACL_METER_TIME("---------------save_body end2 --------------------"); } ////////////////////////////////////////////////////////////////////// // 采用管道流模式将邮件正文内容进行字符集转换,且保存在磁盘上 if (pBody) { printf("\r\n"); ACL_METER_TIME("---------------save_body begin--------------------"); acl::charset_conv utf8ToGb, gbToBig5; utf8ToGb.update_begin("utf-8", "gbk"); gbToBig5.update_begin("gbk", "big5"); acl::pipe_string pipe_out; acl::pipe_manager manager; manager.push_front(&pipe_out); manager.push_front(&gbToBig5); manager.push_front(&utf8ToGb); pBody->save(manager); ACL_METER_TIME("---------------save_body end1 --------------------"); acl::string& sbuf = pipe_out.get_buf(); fp_out.close(); if (fp_out.open_write("./var/body_big5.txt")) { fp_out.write(sbuf.c_str(), sbuf.length()); fp_out.close(); } ACL_METER_TIME("---------------save_body end2 --------------------"); } ////////////////////////////////////////////////////////////////////// // 将邮件中的附件保存在磁盘上 printf("---------------------------------------------------------\r\n"); printf(">>>> saving attach file now ...\r\n"); const std::list<acl::mime_attach*>& attaches = mime.get_attachments(); std::list<acl::mime_attach*>::const_iterator cit = attaches.begin(); for (; cit != attaches.end(); cit++) { buf = "./var/"; buf << (*cit)->get_filename(); acl::string attach_name; acl::rfc2047 rfc2047; rfc2047.reset(true); rfc2047.decode_update(buf, (int) buf.length()); rfc2047.decode_finish("utf-8", &attach_name); printf(">>> attach file: |%s|, len: %d\n", attach_name.c_str(), (int) attach_name.length()); (*cit)->save(attach_name.c_str()); } printf(">>>> saved attach file ok ...\r\n"); ////////////////////////////////////////////////////////////////////// // 将解析后的邮件再重新组合并保存在磁盘上 mime.save_mail("./var", "test.html"); }
// 将邮件正文内容保存在磁盘上 // 将邮件正文内容保存在缓冲区中 // 采用管道流模式将邮件正文内容进行字符集转换,且保存在磁盘上 // 将邮件中的附件保存在磁盘上 // 将解析后的邮件再重新组合并保存在磁盘上 static void mime_test1(acl::mime& mime, const char* path, bool htmlFirst) { mime.reset(); acl::string buf; acl::ofstream fp_out; acl::mime_body* pBody = NULL; printf("\r\n>>> %s: path: %s\n", __FUNCTION__, path); ACL_METER_TIME("---------------parse begin --------------------"); if (mime.parse(path) == false) { printf("mime parse %s error\n", path); return; } ACL_METER_TIME("---------------parse end --------------------"); const char* ctype = mime.get_ctype(); bool is_text; if (!strcasecmp(ctype, "multipart") || !strcasecmp(ctype, "text")) is_text = true; else is_text = false; if (is_text) pBody = mime.get_body_node(htmlFirst, true, "iso-2022-jp"); else pBody = mime.get_body_node(htmlFirst, false, NULL); ////////////////////////////////////////////////////////////////////// // 将邮件正文内容保存在磁盘上 printf("\r\n"); ACL_METER_TIME("---------------save_body begin--------------------"); header_out(&mime); mime.mime_debug("./var"); printf(">>>ctype: %s, stype: %s\r\n", mime.get_ctype(), mime.get_stype()); buf = "./var/"; buf += path; mime.save_as(buf.c_str()); if (pBody) pBody->save_body("./var/body_gb.txt"); ACL_METER_TIME("---------------save_body end --------------------"); ////////////////////////////////////////////////////////////////////// // 将邮件正文内容保存在缓冲区中 if (pBody) { acl::string buf1; pBody->save_body(buf1); if (fp_out.open_write("./var/body_string.txt")) { fp_out.write(buf1.c_str(), buf1.length()); fp_out.close(); } } ////////////////////////////////////////////////////////////////////// // 将邮件正文内容以 utf-8 存在磁盘上 if (pBody && is_text) { printf("\r\n"); ACL_METER_TIME("---------------save_body begin--------------------"); acl::charset_conv jp2utf8; jp2utf8.update_begin("iso-2022-jp", "utf-8"); acl::pipe_string pipe_out; pipeline_string pipeline; acl::pipe_manager manager; manager.push_front(&pipe_out); manager.push_front(&jp2utf8); manager.push_front(&pipeline); pBody->save(manager); ACL_METER_TIME("---------------save_body end1 --------------------"); acl::string& sbuf = pipe_out.get_buf(); fp_out.close(); if (fp_out.open_write("./var/body_utf8.txt")) { fp_out.write(sbuf.c_str(), sbuf.length()); fp_out.close(); } ACL_METER_TIME("---------------save_body end2 --------------------"); } ////////////////////////////////////////////////////////////////////// // 采用管道流模式将邮件正文内容进行字符集转换,且保存在磁盘上 if (pBody) { printf("\r\n"); ACL_METER_TIME("---------------save_body begin--------------------"); acl::charset_conv utf8ToGb, gbToBig5; utf8ToGb.update_begin("utf-8", "gbk"); gbToBig5.update_begin("gbk", "big5"); acl::pipe_string pipe_out; acl::pipe_manager manager; manager.push_front(&pipe_out); manager.push_front(&gbToBig5); manager.push_front(&utf8ToGb); pBody->save(manager); ACL_METER_TIME("---------------save_body end1 --------------------"); acl::string& sbuf = pipe_out.get_buf(); fp_out.close(); if (fp_out.open_write("./var/body_big5.txt")) { fp_out.write(sbuf.c_str(), sbuf.length()); fp_out.close(); } ACL_METER_TIME("---------------save_body end2 --------------------"); } ////////////////////////////////////////////////////////////////////// // 将邮件中的附件保存在磁盘上 printf("---------------------------------------------------------\r\n"); printf(">>>> saving attach file now ...\r\n"); const std::list<acl::mime_attach*>& attaches = mime.get_attachments(); std::list<acl::mime_attach*>::const_iterator cit = attaches.begin(); for (; cit != attaches.end(); cit++) { buf = "./var/"; const char* filename = (*cit)->get_filename(); if (filename != NULL) buf << filename; else { filename = (*cit)->header_value("Content-ID"); if (filename == NULL || *filename == 0) continue; acl::string tmp(filename); tmp.strip("<>", true); buf << tmp; } acl::string attach_name; acl::rfc2047 rfc2047; rfc2047.reset(true); rfc2047.decode_update(buf, (int) buf.length()); rfc2047.decode_finish("utf-8", &attach_name); printf(">>> attach file: |%s|, len: %d\n", attach_name.c_str(), (int) attach_name.length()); (*cit)->save(attach_name.c_str()); } printf(">>>> saved attach file ok ...\r\n"); ////////////////////////////////////////////////////////////////////// // 遍历所有节点 printf("------------------------------------------------------\r\n"); acl::string tmp; int i = 0; const std::list<acl::mime_node*>& nodes = mime.get_mime_nodes(); for (std::list<acl::mime_node*>::const_iterator cit2 = nodes.begin(); cit2 != nodes.end(); ++cit2) { printf("ctype: %s, stype: %s, begin: %ld, end: %ld\r\n", (*cit2)->get_ctype_s(), (*cit2)->get_stype_s(), (long) (*cit2)->get_bodyBegin(), (long) (*cit2)->get_bodyEnd()); tmp.format("var/node-%d-body.txt", i++); (*cit2)->save(tmp); printf(">>>save to file: %s\r\n", tmp.c_str()); } printf("------------------------------------------------------\r\n"); ////////////////////////////////////////////////////////////////////// // 将解析后的邮件再重新组合并保存在磁盘上 mime.save_mail("./var", "test.html"); }