乐者为王

Do one thing, and do it well.

使用Win32备份Foxmail的邮件

Foxmail是一个非常不错的邮件客户端,可惜在备份邮箱内的邮件上做的不是很好,只能手工一封一封地导出,在邮件比较少的时候这样做还可以应付,但假如有成百上千封邮件时还要这样处理就显然相当郁闷。所以写了个小应用,可以自动将某个邮箱内所有邮件导出为单独的eml格式(该格式可以被OutLook邮件程序识别并打开)的邮件文件。

在Foxmail的安装目录下有一个mail文件夹,该文件夹中的每个子目录分别对应着一个邮件账号。进入某个帐号对应的文件夹,可以发现文件夹中有以in.BOX、out.BOX、send.BOX、spam.BOX和trash.BOX等文件,它们分别对应于收件箱、发件箱、已发送邮件箱、垃圾邮件箱和废件箱。根据VC++实现Foxmail邮件的批量导出一文可以知道每个邮件头以下面的16个字符开始:

1
2
3
0x10 0x10 0x10 0x10 0x10 0x10 0x10
0x11 0x11 0x11 0x11 0x11 0x11
0x53 0x0D 0x0A

知道邮箱所对应的存储文件的格式后,以下的事情就变的很简单。

  1. 获取要备份的文件夹路径;
  2. 遍历该文件夹,找出以BOX为后缀名的邮箱存储文件;
  3. 分析存储文件,将邮件导出为eml格式的邮件文本。

下面是需要用到的一些Win32 API函数:

创建非模态对话框

  • CreateDialog

获取目录信息

  • BROWSEINFO
  • LPITEMIDLIST
  • SHBrowseForFolder
  • SHGetPathFromIDList

遍历某个目录下的文件

  • SetCurrentDirectory
  • FindFileFirst
  • FindNextFile
  • FindClose

备份邮件

  • CreateDirectory
  • CreateFile
  • ReadFile
  • WriteFile
  • CloseHandle

还有,如果在对话框模版里用到了不一般的控件(比如说进度条),那么还需要

  1. 引用头文件commctrl.h;
  2. 并链接comctl32.lib;
  3. 在WinMain中创建对话框前调用InitCommonControls()方法。

代码下载

Comments