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語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)字符串分割的實例
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)字符串分割的實例的相關(guān)資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
C語言中volatile關(guān)鍵字的作用與使用案例教程
這篇文章主要介紹了C語言中volatile關(guān)鍵字的作用與使用案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是本文的詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++實現(xiàn)LeetCode(53.最大子數(shù)組)
這篇文章主要介紹了C++實現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法
這篇文章主要介紹了剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析
一直以來總是對這個問題的認(rèn)識比較朦朧,我相信很多朋友也是這樣的,總是聽到內(nèi)存一會在棧上分配,一會又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來看看2022-03-03

