Foxmail存在一个问题,就是文件和目录位置的关联性很强,我借别人的计算机使用Foxmail收取完了我的邮件,然后只将含有邮件的Mail文件夹拷贝到我的计算机的Foxmail中。这下却出了问题,在我的Foxmail中无论如何就是找不到邮件,我又忘了在收取邮件的计算机上Foxmail的安装目录。抱着试一试的心理,我用UltraEdit看了一下收件箱in.box内容,由于邮箱没有被压缩,我终于发现了in.box中的一个特征,就是每封邮件都以16进制串“10
10 10 10 10 10 10 11 11 11 11 11 11 53 0D 0A”进行分隔。根据这个特征,我用c语言编写了一个小程序,把in.box中的邮件都读取出来了,并保存为Outlook
Express的eml格式。
由于在Foxmail中导出邮件的功能并不是很强,尤其是批量导出,不能保存为eml格式,这就使得要想用Outlook Express来阅读邮件,在Foxmail中必须一封一封进行导出,如果邮件数量太多,有上千封的话,那就太繁琐太浪费时间了,本程序对于in.box中的上千封邮件可以在几秒钟内导出完毕,能节省大量的时间。
为了使这个程序适合于各种C编译器,我按照ANSI C的标准使用各种函数,经过测试,这个程序在Turbo C 2.0、Borland
C++ 3.1、Visual C++ 6.0下都能编译通过,正常运行。为了简化代码,本程序要求in.box放在“D:\net”目录中,如果放邮件的文件不是in.box,需要首先改名为in.box,导出的邮件放在“D:\net\1”目录中(D:\net\1目录必须存在)。大家可根据需要对程序进行改动,使之更符合自己的需要。
下面是源程序:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int i,j; /*邮件计数,供生成输出文件名使用 */
FILE *fp1,*fp2; /* fp1为输入文件的指针*/
/*fp2为输出文件的指针 */
char c1, /*c1存放每次读取的字符 */
dest[100], /*dest存放完整的输出文件名 */
dest1[9]; /*将j转换字符串存放于dest1中 */
void takeout(); /* 读取分析分隔特征串 */
void newfp2(); /* 生成输出文件名 */
void initdest();
/*将dest和dest1中的元素全部清0 */
main()
{
i=0,j=0;
if((fp1=fopen("d:\\net\\in.box","r"))==NULL)
{
printf("Can't open d:\\net\\in.box");
exit(1);
}
c1=fgetc(fp1);
while(!feof(fp1))
{/*发现有分隔特征串的开头字符,则进*/
/* 入takeout()函数进行分析 */
if(c1=='\x10')
takeout();
newfp2(); /* 生成输出文件名 */
if((fp2=fopen(dest,"w"))==NULL)
{
printf("Can't open %s",dest);
exit(1);
}
/* 没有到输入文件的结尾,又不是分隔特征串 */
/* 的开头字符,则将字符写入输出文件 */
while(!feof(fp1)&&((c1=fgetc(fp1))!='\x10'))
fputc(c1,fp2);
}
return 0;
}
void initdest()
{
for(i=0;i<9;i++)
dest1[i]='\x0';
for(i=0;i<100;i++)
dest[i]='\x0';
}
void newfp2()
{
j++;
itoa(j,dest1,10);
/*生成相应的1.eml,2.eml...*/
strcpy(dest, "d:\\net\\1\\");
strcat(dest, dest1);
strcat(dest, ".eml");
}
void takeout()
{
for(i=0;i<6;i++)
{
c1=fgetc(fp1);
if(c1!='\x10')
return; /* 不符合分隔特征串,则返回 */
}
for(i=0;i<6;i++)
{
c1=fgetc(fp1);
if(c1!='\x11')
return; /*不符合分隔特征串,则返回 */
}
if((c1=fgetc(fp1))=='\x53')
if((c1=fgetc(fp1))=='\x0D')
if((c1=fgetc(fp1))=='\x0A')
{
c1=fgetc(fp1);
fclose(fp2); /* 完全符合特征串,则当前邮件 */
/* 输出完毕,关闭输出文件 */
}
}