C++實(shí)現(xiàn)獲取郵件中的附件
本篇記錄一下獲取郵件文件eml中的附件
我使用了一個(gè)三方庫(kù)Gmime
先下載源碼進(jìn)行編譯,官方地址:
https://gitcode.com/jstedfast/gmime/overview
1.編譯
對(duì)下載的文件進(jìn)行解壓
tar -xvf gmime-3.2.7.tar.xz
cd gmime-3.2.7
./configure
make -j8 && make install
如果在編譯過(guò)程中報(bào)錯(cuò)的話,基本都是缺少相關(guān)依賴(lài)庫(kù),下載安裝即可
2.makefile注意事項(xiàng)
使用gmime時(shí),在makefile文件中要加入兩個(gè)鏈接庫(kù),libgobject.so和libgmime.so
版本不同,在連接時(shí)也有差異,我用的是gmime3.2.7版本
在makefile中加入了-lgobject-2.0和-lgmime-3.0
這里有個(gè)注意的地方,gmime.h文件在編譯時(shí)依賴(lài)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)建一個(gè) GMimeStream
stream = g_mime_stream_file_new(fopen("/usr/local/zbs_test/eml/測(cè)試001.eml", "r"));
// 創(chuàng)建一個(gè)新的 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("------------------開(kāi)始\n");
test();
g_mime_shutdown();
return 0;
}Gmime有很多自己的使用例子,有需要的話可以看看

每個(gè)函數(shù)也都有詳細(xì)的注釋

到此這篇關(guān)于C++實(shí)現(xiàn)獲取郵件中的附件的文章就介紹到這了,更多相關(guān)C++獲取郵件附件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)字符串分割的實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10
C語(yǔ)言中volatile關(guān)鍵字的作用與使用案例教程
這篇文章主要介紹了C語(yǔ)言中volatile關(guān)鍵字的作用與使用案例教程,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是本文的詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Matlab實(shí)現(xiàn)貪吃蛇小游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C++ Dijkstra算法之求圖中任意兩頂點(diǎn)的最短路徑
這篇文章主要為大家詳細(xì)介紹了用C++經(jīng)典算法-Dijkstra算法求任意兩頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(53.最大子數(shù)組),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法
這篇文章主要介紹了剖析C++編程當(dāng)中指針作為函數(shù)參數(shù)的用法,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
C++棧實(shí)現(xiàn)逆波蘭式的應(yīng)用
逆波蘭式指的是操作符在其所控制的操作數(shù)后面的表達(dá)式。本文主要介紹了C++棧實(shí)現(xiàn)逆波蘭式的應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C++程序內(nèi)存棧區(qū)與堆區(qū)模型案例分析
一直以來(lái)總是對(duì)這個(gè)問(wèn)題的認(rèn)識(shí)比較朦朧,我相信很多朋友也是這樣的,總是聽(tīng)到內(nèi)存一會(huì)在棧上分配,一會(huì)又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來(lái)看看2022-03-03

