乐者为王

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