您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > Linux安装使用GMIME解析邮件-含源码
Linux(Ubuntu14.04)邮件格式解析与附件提取基于GMIME2.6.11NEWPLAN2015.12.12目录邮件格式介绍................................................................3GMIME2.6.11库的基本介绍:.....................................4Project的基本框架........................................................6源码部分......................................................................10附录(源码包下载)..................................................29邮件格式介绍邮件格式(EML)一般分为两部分,一部分是邮件头,一部分是邮件体。邮件头中包含的有邮件的一些基本信息,比如发送者,接受者,抄送,暗送等人的信息,还有messageID等基本的信息。邮件体部分包含的是邮件的正文,以及邮件的附件信息等。一封标准的邮件如下图所示。从上图中可以看出,一封邮件中分为清晰的两个部分,但是也有奇怪的是,基本的邮件传送编码选用的是base64,base64使用的是6位编码方式,将字符信息转换成可见字符编码,比如3字节的Unicode/utf8/gb2312编码转换成四个base64码,采用这种方式在网上进行传输,在进行邮件的解析的时候,需要将base64编码转换成邮件体指定的编码(如gb18030,gbk等)这时候显示的还是一个乱码的问题,因为Linux默认的编码使用的是utf-8,这里可以提供两种思路,一种是使用系统采用的iconv(src,destination)函数进行转换,这里有一个缺点是SRC指定的是源编码,destination指的是需要转换到的目的编码格式。另一种方式是使用gmime的滤波器,将数据流进行过滤。本程序可以实现以下简单地功能:邮件体的解码,以及各种编码的转换正确恢复附件实验测试不同类型的邮件解析GMIME2.6.11库的基本介绍:Gmime库是一套非常强大MIME(MultipurposeInternetMailExtension)工具库,用来创建、编辑、分解MIME消息和结构。Gmime本身基于Glib2.0的Gobject,具有良好的扩展性。GMIME遵循GPL许可,源代码公开。需要指出,GMIME安装比较麻烦,需要细心安装,同时还要注意版本,否则不能使用,我的是2.6.11下面简单介绍一下GMIME的几个比较重要的模块:GMIME的思想是将所有的EML文件导入倒是内存中的数据流,然后对这些数据进行操作,比如过滤,写和存取等。以下这部分便是数据流的object,常见数据流有文件,内存map,pipe流等,同时可以将数据从一个流导出到另一个流中。Streamfilter是一个数据流的过滤器,我们可以定义一些基本的filter进行数据流的滤波设置,常见的滤波如字符的过滤,转码的过滤,加密的过滤等等DataWrapper是每一个object的对象流,这里存取的包括有编码后的流,以及编码格式,具体了解不是很深入。Project的基本框架Analyse.c/h分析邮件格式Basicinfo.c/h处理邮件头信息messageB.c/h处理邮件消息体main.c主程序入口。MAKEFILE是Linux下的自动编译脚本。此外,在gmime库中,编译和链接需要分开,否则可能会出错。Makefile如图所示。这一部分展示了加入滤波的模块,获取系统被数据流的编码,然后加入滤波转换。make一下的效果在运行直接进行base解码会出现以下乱码现象。加入滤波器进行字符转码过滤后,可以实现字符的正常显示。解码恢复出HTML格式源码部分/**************************all.h****************************/#ifndef__ALL_H__TEST__#define__ALL_H__TEST__#includeinits.h#includeheads.h#includemessageB.h#includebasicInfo.h//#includeanalyze.h#includeEnableSwitch.h#includemessageParser.h#endif/**************************basicInfo.c*******************************/#includebasicInfo.hvoidGetBasicInfo(GMimeMessage*pMessage){printf(sender:%s\n,g_mime_message_get_sender(pMessage));/*getsender*/printf(Reply-to:%s\n,g_mime_message_get_reply_to(pMessage));/*getreplyto*///printf(allrecipients:%s\n,internet_address_list_to_string(g_mime_message_get_all_recipients(pMessage),TRUE));/*allreceiver*/printf(To:%s\n,internet_address_list_to_string(g_mime_message_get_recipients(pMessage,GMIME_RECIPIENT_TYPE_TO),FALSE));/*getthetoreceiver*/printf(subject:%s\n,g_mime_message_get_subject(pMessage));/*getsubject*/printf(messageID:%s\n,g_mime_message_get_message_id(pMessage));/*getmessageID*/printf(date:%s\n,g_mime_message_get_date_as_string(pMessage));/*getdateofe-mail*//*code*/}/**************************basicInfo.h*******************************/#ifndef__BASICINFO_H__TEST__#define__BASICINFO_H__TEST__#includegmime/gmime.hvoidGetBasicInfo(GMimeMessage*pMessage);#endif/**************************EnableSwitch.h*******************************/#ifndef__ENABLESWITCH_H__TEST__#define__ENABLESWITCH_H__TEST__/*初始化LOG开关*/#defineENABLE_INITS_LOG0#defineENABLE_MESSAGE_LOG0#defineENABLE_HEADERS_LOG0#endif/**************************heads.c*******************************/#includeheads.hvoidGetHeader(GMimeMessage*pMessage){GMimeHeaderList*list=NULL;GMimeHeaderIteriter;constchar*name,*value;if(NULL==(list=g_mime_object_get_header_list(GMIME_OBJECT(pMessage))))printf([log]:\tfailedtogetheaderlist\n);if(!g_mime_header_list_get_iter(list,&iter))printf([log]:\tfailedtogetheaderlistiter!\n);#ifENABLE_HEADERS_LOGprintf(\n[log]\tOutputHeaders=====\n\n);#endiffor(;;){name=g_mime_header_iter_get_name(&iter);value=g_mime_header_iter_get_value(&iter);printf(%s:\t%s\n,name,value);if(!g_mime_header_iter_next(&iter)){break;/*code*/}}}/**************************inits.h*******************************/#ifndef__INITS_H__TEST__#define__INITS_H__TEST__#includegmime/gmime.h#includestdio.hGMimeMessage*AllInits(intargc,char**argv);voidAllFree(GMimeMessage*);#endif/**************************heads.h*******************************/#ifndef__HEADS_H__TEST__#define__HEADS_H__TEST__#includegmime/gmime.hvoidGetHeader(GMimeMessage*pMessage);#endif/**************************inits.c*******************************/#includeinits.h#includeall.h#includeEnableSwitch.hGMimeMessage*AllInits(intargc,char**argv){g_mime_init(0);if(argc2){printf([log]:\terroropenfiletoparser.hellofile\n);return0;}#ifENABLE_INITS_LOGprintf([log]:\thello,gmime!please\n);#endifFILE*fp=fopen(argv[1],rb);/*createanewstream...*/GMimeStream*pStream=g_mime_stream_file_new(fp);#ifENABLE_INITS_LOGprintf([log]:\t[main]g_mime_stream_file_newsuccess!\n);#endif/*setthefilter*创建一个CRLF过滤器,过滤器介绍见前述。一般而言,MTA之间的通信每行都是以\n结尾的,但因为我们要处理以CRLF结尾的邮件体,所以必须附加一个CRLF过滤器来处理\r\n.*/GMimeFilter*pCrlfFilter=g_mime_filter_crlf_new(FALSE,TRUE);#ifENABLE_INITS_LOGprintf([log]:\t[main]newcrlffiltersuccess!\n);#endif/*根据初始文件流和过滤器创建一个具备过滤功能的流对象*/GMimeStream*pFilterStream=g_mime_stream_filter_new(pStream);#ifENABLE_INITS_LOGprintf([log]:\t[main]createfilterstrea
本文标题:Linux安装使用GMIME解析邮件-含源码
链接地址:https://www.777doc.com/doc-4649155 .html