科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC++实现Foxmail邮件的批量导出

VC++实现Foxmail邮件的批量导出

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过对Foxmail邮件箱文件的分析而给出了一种自动将邮件箱内邮件导出为各自独立的".eml"格式的邮件文件的方法

作者:中国电波传播研究所青岛分所郎锐 来源: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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章