sina.com.cn
新浪首页|免费邮件|用户注册|网站地图

科技时代

新浪首页 > 科技时代 > 软件 > 网络工具 > 正文
软件分类教程

● 系统工具
● 网络工具
● 常用工具
● 多媒体类
● 图像处理
● 文字编辑
● 休闲娱乐
● 办公软件
● 编程语言
● 操作系统
● 其它软件
● 软件评测
● 主页制作
● 观点评论





自编小程序挽救Foxmail中的邮件

http://tech.sina.com.cn 2000/09/27  软件世界 邓富强 张海洋

  在Foxmail中存在一个问题,就是文件和目录位置的关联性很强,我借别人的计算机使用Foxmail收取完了我的邮件,然后只将含有邮件的mail文件夹拷贝到我的计算机的Foxmail中。这下却出了问题,在我的Foxmail中无论如何就是找不到邮件,我又忘了在收取邮件的计算机上Foxmail的安装目录。抱着试一试的心理,我用UltraEdit-32看了一下收件箱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"目录中。大家可根据需要对程序进行改动,使之更符合自己的需要。

  下面是源程序:

  #include
  #include
  #include

  int i,j; file://j用作邮件计数,供生成输出文件名时使用
  FILE *fp1,*fp2; file://fp1为输入文件的指针,fp2为输出文件的指针
  char c1, file://c1存放每次读取的字符
  dest[100], file://dest存放完整的输出文件名及路径
  dest1[9]; file://将j转换为字符串后,存放于dest1中

  void takeout(); file://读取分析分隔特征串
  void newfp2(); file://生成输出文件名
  void initdest(); file://将dest和dest1中的元素全部清为'\x0'
  void numtochar(); file://将j转换为字符串后,存放于dest1中

  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))
  {
  file://发现有分隔特征串的开头字符,则进入takeout()函数进行分析
  if(c1=='\x10')
  takeout();
  file://生成输出文件名
  newfp2();
  if((fp2=fopen(dest,"w"))==NULL)
  {
  printf("Can't open %s",dest);exit(1);
  }
  file://没有到输入文件的结尾,又不是分隔特征串的开头字符,则将字符写入输出文件
  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++;
  numtochar();
  strcpy(dest, "d:\\net\\1\\");
  strcat(dest, dest1);
  strcat(dest, ".eml");
  }

  void numtochar()
  file://本函数只转换到9999,如果用户的邮件太多,可对本函数进行扩充
  {
  if(j>=0&&j<10)
  dest1[0]=j+'0';
  else if(j>=10&&j<100)
  {
  dest1[0]=j/10+'0';i=j%10;
  dest1[1]=i+'0';
  }
  else if(j>=100&&j<1000)
  {
  dest1[0]=j/100+'0';i=j%100;
  dest1[1]=i/10+'0';i=i%10;
  dest1[2]=i+'0';
  }
  else if(j>=1000&&j<10000)
  {
  dest1[0]=j/1000+'0';i=j%1000;
  dest1[1]=i/100+'0';i=i%100;
  dest1[2]=i/10+'0';i=i%10;
  dest1[3]=i+'0';
  }
  }

  void takeout()
  {
  for(i=0;i<6;i++)
  {
  c1=fgetc(fp1);
  file://不符合分隔特征串,则返回
  if(c1!='\x10')
  return;
  }
  for(i=0;i<6;i++)
  {
  c1=fgetc(fp1);
  file://不符合分隔特征串,则返回
  if(c1!='\x11')
  return;
  }
  if((c1=fgetc(fp1))=='\x53')
  if((c1=fgetc(fp1))=='\x0D')
  if((c1=fgetc(fp1))=='\x0A')
  {
  c1=fgetc(fp1);
  file://完全符合特征串,则当前邮件输出完毕,关闭输出文件
  fclose(fp2);
  }
  }
  。


相关文章:

     

  【相关论坛】 【发表评论】  


网站简介 | 用户注册 | 广告服务 | 招聘信息 | 中文阅读 | Richwin | 联系方式 | 帮助信息 | 网站律师

Copyright © 1996 - 2000 SINA.com, Stone Rich Sight. All Rights Reserved

版权所有 四通利方 新浪网