c++ 获取邮件文件eml中的附件

本文详细介绍了如何使用Gmime库处理EML邮件,包括下载源码编译、解决依赖问题、配置makefile以及提取并保存邮件附件的过程。
摘要由CSDN通过智能技术生成

本篇记录一下获取邮件文件eml中的附件

我使用了一个三方库Gmime

先下载源码进行编译,官方地址:

https://github.com/jstedfast/gmimeicon-default.png?t=N7T8https://github.com/jstedfast/gmimeIndex of /sources/gmime/icon-default.png?t=N7T8https://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有很多自己的使用例子,有需要的话可以看看

每个函数也都有详细的注释

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值