C++實現(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注意事項
使用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++實現(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-09
C++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ù)的簡單實現(xiàn)
這篇文章主要介紹了用while判斷輸入的數(shù)字是否回文數(shù)的簡單實現(xiàn),需要的朋友可以參考下2014-02-02
C++小利器之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

