本篇记录一下获取邮件文件eml中的附件
我使用了一个三方库Gmime
先下载源码进行编译,官方地址:
https://github.com/jstedfast/gmimehttps://github.com/jstedfast/gmimeIndex of /sources/gmime/
https://download.gnome.org/sources/gmime/1.编译
对下载的文件进行解压
tar -xvf gmime-3.2.7.tar.xz
cd gmime-3.2.7
./configure
make -j8 && make install
如果在编译过程中报错的话,基本都是缺少相关依赖库,下载安装即可
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;
// 从文件中创建一个 GMimeStream
stream = g_mime_stream_file_new(fopen("/usr/local/zbs_test/eml/测试001.eml", "r"));
// 创建一个新的 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("-------------------------------------结束 \n");
sleep(5);
}
int main()
{
g_mime_init();
printf("------------------开始\n");
test();
g_mime_shutdown();
return 0;
}
Gmime有很多自己的使用例子,有需要的话可以看看
每个函数也都有详细的注释