设为首页 加入收藏

TOP

VC++实现Foxmail邮件的批量导出(二)
2012-11-04 15:28:18 来源: 作者: 【 】 浏览:487
Tags:实现 Foxmail 邮件 批量 导出
  程序的设计实现

  在弄清楚Foxmail邮件夹文件的组成结构后,对内部邮件的提取、导出就不是什么难事了,编程(www.cppentry.com)的中心思想是对邮件格式头的判别,并对位于其后邮件内容数据的文件导出。为此,可以对全部邮件夹文件内容搜寻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++(www.cppentry.com) 6.0编译通过。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC6.0映射模式转换及如何消除坐标.. 下一篇基于Visual C++6.0的声音文件操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: