C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++获取邮件附件

C++实现获取邮件中的附件

作者:风也换了脾气

这篇文章主要为大家详细介绍了如何通过C++实现获取邮件文件中的附件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

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

我使用了一个三方库Gmime

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

https://gitcode.com/jstedfast/gmime/overview

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有很多自己的使用例子,有需要的话可以看看

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

到此这篇关于C++实现获取邮件中的附件的文章就介绍到这了,更多相关C++获取邮件附件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文