扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国电波传播研究所青岛分所郎锐 来源:yesky 2007年11月16日
关键字:
在弄清楚Foxmail邮件夹文件的组成结构后,对内部邮件的提取、导出就不是什么难事了,编程的中心思想是对邮件格式头的判别,并对位于其后邮件内容数据的文件导出。为此,可以对全部邮件夹文件内容搜寻ASCII码10(16进制),一旦发现该字符说明其后15个字节有可能是邮件格式头,然后继续判断其后15个字节是否满足邮件格式头,一旦某个字节不符合则表明其并非邮件格式头而不予处理,否则开始将邮件数据写入导出文件,同时关闭上一封打开过的导出文件:
//从邮件夹文件读取字符 c = fgetc(fp1); while (!feof(fp1)) { //发现有分隔特征串的开头字符, 则进入check()函数进行分析 if (c == 0x10) check(); //生成输出文件名 j++; filename.Format("%d",j); //确定待导出文件的存放路径 char exeFullPath[MAX_PATH]; CString strPath; GetModuleFileName(NULL, exeFullPath, MAX_PATH); strPath = CString(exeFullPath); strPath = strPath.Left(strPath.ReverseFind('\\')); strPath = strPath + "\\mail\\" + CString(filename) + ".eml"; strcpy(fullname, strPath); //以写方式打开导出文件,如果文件不存在则创建之 fp2 = fopen(fullname, "w"); //没有到输入文件的结尾, 又不是分隔特征串的开头字符, 则将字符写入输出文件 while (!feof(fp1) && (c = fgetc(fp1)) != 0x10) fputc(c, fp2); } |
其中,对于邮件格式头的判断是在check()函数中完成的,依次对0x10之后的15个字节进行判断,一旦发现不是邮件格式头字符,立即返回,并将其当作邮件内容数据进行处理只有在断定为邮件格式头后才将上一封导出文件关闭:
for (int i = 0; i < 6; i++) { c = fgetc(fp1); //不符合分隔特征串,则返回 if(c != 0x10) return; } for (i = 0; i < 6; i++) { c = fgetc(fp1); //不符合分隔特征串,则返回 由此可以断定邮件夹的内容 if (c != 0x11) return; } if ((c = fgetc(fp1)) == 0x53) if ((c = fgetc(fp1)) == 0x0D) if ((c = fgetc(fp1)) == 0x0A) { c = fgetc(fp1); //完全符合特征串,则当前邮件输出完毕, 关闭输出文件 fclose(fp2); } |
由于本程序的设计目的在于自动批量导出邮件,因此处理数据量一般是比较大的,为避免程序阻塞,可以将此处理过程放置于线程之中进行。经实验,由上述程序导出的eml文件可以为OutLook文件识别并打开,达到了预期目的。
小结
本文通过对Foxmail邮件夹的组成结构进行分析而最终实现了对其邮件的批量导出,极大方便了对Foxmail邮件的备份、管理等工作,而且对不同版本的Foxmail均有很好的支持(当前最新版本为4.2,本文方法适用),因此不失为一款实用的邮件辅助管理工具。本文所述代码在Windows 2000 Professional下由Microsoft Visual C++ 6.0编译通过。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者