C++實(shí)現(xiàn)獲取郵件中的附件
本篇記錄一下獲取郵件文件eml中的附件
我使用了一個三方庫Gmime
先下載源碼進(jìn)行編譯,官方地址:
https://gitcode.com/jstedfast/gmime/overview
1.編譯
對下載的文件進(jìn)行解壓
tar -xvf gmime-3.2.7.tar.xz
cd gmime-3.2.7
./configure
make -j8 && make install
如果在編譯過程中報錯的話,基本都是缺少相關(guān)依賴庫,下載安裝即可
2.makefile注意事項(xiàng)
使用gmime時,在makefile文件中要加入兩個鏈接庫,libgobject.so和libgmime.so
版本不同,在連接時也有差異,我用的是gmime3.2.7版本
在makefile中加入了-lgobject-2.0和-lgmime-3.0
這里有個注意的地方,gmime.h文件在編譯時依賴glib.h,所以還需要在makefile中加入
glib的路徑
3.完整代碼
#include <iostream> #include <gmime/gmime.h> using namespace std; void test() { int i = 0; sleep(10); printf("666666666666666666666666666666666\n"); while (i <= 10) { i++; GMimeStream *stream; GMimeParser *parser; GMimeMessage *message; GMimePart *part; GMimeDataWrapper *wrapper; const char *filename; // 從文件中創(chuàng)建一個 GMimeStream stream = g_mime_stream_file_new(fopen("/usr/local/zbs_test/eml/測試001.eml", "r")); // 創(chuàng)建一個新的 GMimeParser parser = g_mime_parser_new_with_stream(stream); // 從郵件中解析消息 message = g_mime_parser_construct_message(parser, NULL); GMimePartIter *iter = g_mime_part_iter_new((GMimeObject *)message); while (g_mime_part_iter_next(iter)) { string path = "/usr/local/zbs_test/target/"; GMimeObject *current = g_mime_part_iter_get_current(iter); GMimeObject *parent = g_mime_part_iter_get_parent(iter); if (GMIME_IS_MULTIPART(parent) && GMIME_IS_PART(current)) { GMimePart *part = (GMimePart *)current; if (g_mime_part_is_attachment(part)) { // 獲取附件的文件名 filename = g_mime_part_get_filename(part); path = path + to_string(i) +filename; printf("名字:%s \n", path.c_str()); // 保存附件到文件 if (filename) { wrapper = g_mime_part_get_content(part); GMimeStream *save_stream = g_mime_stream_file_new(fopen(path.c_str(), "w")); g_mime_data_wrapper_write_to_stream(wrapper, save_stream); g_object_unref(save_stream); } } } } // 釋放資源 g_mime_part_iter_free (iter); g_object_unref(GMIME_OBJECT(message)); g_object_unref(parser); g_object_unref(stream); sleep(3); } printf("-------------------------------------結(jié)束 \n"); sleep(5); } int main() { g_mime_init(); printf("------------------開始\n"); test(); g_mime_shutdown(); return 0; }
Gmime有很多自己的使用例子,有需要的話可以看看
每個函數(shù)也都有詳細(xì)的注釋
到此這篇關(guān)于C++實(shí)現(xiàn)獲取郵件中的附件的文章就介紹到這了,更多相關(guān)C++獲取郵件附件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++中CJSON的使用(創(chuàng)建與解析JSON數(shù)據(jù))
cJSON是一個超輕巧的JSON解析器,本文主要介紹了C/C++中CJSON的使用(創(chuàng)建與解析JSON數(shù)據(jù)),具有一定的參考價值,感興趣的可以了解一下2021-09-09C++11?std::transform函數(shù)使用小結(jié)
std::transform是C++標(biāo)準(zhǔn)庫中的一個算法,它用于對輸入范圍內(nèi)的元素進(jìn)行操作,并將結(jié)果存儲在輸出范圍內(nèi),本文就介紹了std::transform函數(shù)的具體使用,感興趣的可以了解一下2023-09-09用while判斷輸入的數(shù)字是否回文數(shù)的簡單實(shí)現(xiàn)
這篇文章主要介紹了用while判斷輸入的數(shù)字是否回文數(shù)的簡單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02C++小利器之std::bind參數(shù)綁定包裝器的使用詳解
從 C++11 開始,標(biāo)準(zhǔn)庫提供了 std::bind 用于綁定函數(shù) f 和調(diào)用參數(shù),返回一個新可調(diào)用函數(shù)對象 fn,下面就跟隨小編一起深入了解一下std::bind的具體使用吧2023-12-12