组装eml格式文件

char *trans_date(long int lt) 
{
  struct tm *newtime;
  char s[40];
  char *tk=NULL,*t[5];
  int i;
  newtime=localtime(&lt);  //1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为日历时间
  strcpy(s,asctime(newtime));
  //printf("[%s]",s);//[Mon Jul 18 11:00:11 2011\n]
  i=0;
  tk=strtok(s," \n");
  while (tk!=NULL && i<5) 
  {
    t[i]=tk;
    tk=strtok(NULL," \n");
    i++;
  }
  sprintf(tmp,"%s, %s %s %s %s +0800",t[0],t[2],t[1],t[4],t[3]);
  return tmp;
}

long int getFileLength(const char *filePath)  
{
  FILE *fp;  
  fp = fopen(filePath,"rb");  
  if (!fp)
  {  
    printf("Could not load  file '%s'.  Exiting.\n", filePath);  
    exit(1);  
  }  
  fseek(fp,0L,SEEK_END);  
  long int ret =ftell(fp);
  //printf("%ld\n",ret);
  fclose(fp);  
  return ret;  
} 
   
long int getFileStr(const char *filePath, char * back)
{  
  FILE *fp; 
  int result;    
  char temp;  
  fp = fopen(filePath, "rb");  
  if (!fp) 
  {  
    printf("Could not load  file '%s'.  Exiting.\n", filePath);  
    exit(1);  
  }  
  fseek(fp, 0, SEEK_END);  
  long int fileLength = ftell(fp);  
  fseek(fp, 0, SEEK_SET);
  //printf("file size:%ld",fileLength);  
  long int j = 0;  
  while((result = fread(&temp, 1, 1, fp))==1)
  {  
    back[j++]=temp;   
  }  
  if(j!=fileLength)
  {  
    printf("read file error");  
    exit(-1);  
  }  
  back[j]=0;  
  fclose(fp);  
  return fileLength;  
}  

void fileconvert(char *from,const char *to)     
{     
  FILE *out;  
  char *dest=NULL;  
  long int len = getFileLength(from);  
  out=fopen(to,"a+");  
  if(!out)
  {  
    printf("error write %s",to);  
    exit(-1);  
  }
  dest =(char*)malloc (len+1);        
  if(!dest)
  {  
    printf("malloc error :%ld",len+1);  
    exit(-1);  
  }  
  char * ret=(char*)malloc(len*2);  
  if(!ret)
  {  
    printf("malloc error :%ld",len*2);  
    exit(-1);  
  }  
  getFileStr(from,dest);  
  base64encode(dest,len,ret);   
  long int newlen = strlen(ret);
  char *free_ret;
  free_ret=ret;
  int linenumber=newlen/76;
  int leavenumber=newlen-(linenumber*76);
  int k=1;
  //printf("line=%d",linenumber);
  if(linenumber!=0)
  {
    
    for(k;k<=linenumber;k++)
    {
      fwrite(ret,76,1,out);   //控制每个编码行不超过76 字符
      fwrite("\n",1,1,out);
      ret=ret+76; 
    }
    fwrite(ret,leavenumber,1,out);
    
  }
  else
  {
    fwrite(ret,newlen,1,out);
    
  }
  free(free_ret);
  free (dest);
  free_ret=NULL;
  dest=NULL;
  
}   


void base64encode(const char *src,long int src_len, char *dst)//base64编码  
{    
  long int i = 0, j = 0;  
  char base64_map[65] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  
  for (; i < src_len - src_len % 3; i += 3)
  {   
    dst[j++] = base64_map[(src[i] >> 2) & 0x3F];  
    dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)]; 
    dst[j++] = base64_map[((src[i + 1] << 2) & 0x3C) + ((src[i + 2] >> 6) &  0x3)];  
    dst[j++] = base64_map[src[i + 2] & 0x3F];   
  }  
  if (src_len % 3 == 1)
  {  
    dst[j++] = base64_map[(src[i] >> 2) & 0x3F];  
    dst[j++] = base64_map[(src[i] << 4) & 0x30];  
    dst[j++] = '=';  
    dst[j++] = '=';  
  }  

  else if (src_len % 3 == 2) 
  {  
    dst[j++] = base64_map[(src[i] >> 2) & 0x3F];  
    dst[j++] = base64_map[((src[i] << 4) & 0x30) + ((src[i + 1] >> 4) & 0xF)];  
    dst[j++] = base64_map[(src[i + 1] << 2) & 0x3C];  
    dst[j++] = '=';  
  }  
  dst[j] = '\0';  
}   




void eml(FILE *fp, long int date, char *from,char *to,char *cc,char *bcc,char *subject,char *content,char *att_name,char *att_path)//写成eml文件
{
  char filename1[1000]="";//生成eml文件的路径,如果想由用户自己输入路径可以加以控制
  char filename2[100]=".eml";
  char date1[]="Date: ";  
  //trans_date(date);
  //printf("======%s\n",trans_date(date));//Mon, 18 Jul 2011 11:09:02 +0800 
  
  char from1[]   = "\nFrom: ";
  char to1[]     = "\nTo: ";
  char cc1[]     = "\nCc: ";
  char bcc1[]    = "\nBcc: ";
  char subject1[]= "\nSubject: =?gb2312?B?";
       //printf("%s",from);
       
  
  char subject2[]     = "?=";
  char a[]            = "\nMIME-Version: 1.0";
  char type1[]        = "\nContent-Type: multipart/mixed;";
  char boundary1[]    = "\n\n--=====_NextPart000A";//注释boundary1
  char boundary3[]    = "\n--=====_NextPart000A";
  char eml_boundary1[]= "\n  boundary=\"=====_NextPart000A\"";
  char eml_shuom[]    = "\n\nThis is a multi-part message in MIME format.";
  char type2[]        = "\nContent-Type: multipart/alternative;";
  char boundary2[]    = "\n\n--=====_NextPart000B";    //注释boundary2
  char eml_boundary2[]= "\n  boundary=\"=====_NextPart000B\"";
  char type3[]        = "\nContent-Type: text/plain;";                         
  char eml_charset[]  = "\n  charset=\"gb2312\"";
  char eml_encoding[] = "\nContent-Transfer-Encoding: base64\n\n";
  

  char type4[]    = "\nContent-Type: text/html;";
  char type5[]    = "\nContent-Type: application/octet-stream;";
  char att_name1[]= "\n  name=\"=?gbk?B?";

  char name2[]      = "?=\"";
  char eml_content[]= "\nContent-Disposition: attachment;";
  char file_name[]  = " filename=\"=?gbk?B?";
  if(subject)
  {
    strcat(filename1,subject);
    strcat(filename1,filename2);   //生成的eml文件是以主题命名的
  }
  else
  {
    strcat(filename1,"无主题");   //如果主题为空,文件名显示"无主题"
    strcat(filename1,filename2);
  }
  //printf("%s",filename1);
  fp=fopen(filename1,"w"); //w是可写,打开以主题命名的文件并写入
  if(fp==NULL) //打开失败
  {
    printf("error!");
  }
  else
  {
    fputs(date1,fp);//写入文件
    if(date)
    {
      fputs(trans_date(date),fp);//时间
    }
    fputs(from1,fp);//邮件地址
    if(from)
    {
      fputs(from,fp);
    }
    
    fputs(to1,fp);
    if(to)
    {
      fputs(to,fp);
    }
    
    fputs(cc1,fp);
    if(cc)
    {
      fputs(cc,fp);
    }
    fputs(bcc1,fp);
    if(bcc)
    {
      fputs(bcc,fp);
    }
  
    
    if(subject)
    {
      fputs(subject1,fp);//主题
      int len1 =strlen(subject);
      char *ret1=(char*)malloc(len1*2);
      if(!ret1)
      {  
        printf("malloc error :%d",len1*2);  
        exit(-1);  
      }
      base64encode(subject,len1,ret1);
      fputs(ret1,fp);
      free(ret1);
      ret1=NULL;
      fputs(subject2,fp);
    }
    
    fputs(a,fp);
    fputs(type1,fp);
    fputs(eml_boundary1,fp);
    fputs(eml_shuom,fp);
    fputs(boundary1,fp);

    fputs(type2,fp);
    fputs(eml_boundary2,fp);
    fputs(boundary2,fp);

    fputs(type3,fp);
    fputs(eml_charset,fp);
    fputs(eml_encoding,fp);
    
    if(content)
    {
      int len2=strlen(content);
      char *ret2 =(char*)malloc (len2*2); 
      if(!ret2)
      {  
        printf("malloc error :%d",len2*2);  
        exit(-1);  
      }  
      base64encode(content,len2,ret2);
      fputs(ret2,fp);
      free(ret2);
      ret2=NULL;
    }                                       //正文
    fputs(boundary2,fp);
    fputs(type4,fp);
    fputs(eml_charset,fp);                          //正文格式
    fputs(eml_encoding,fp);
    if(content)
    {
      int len4=strlen(content);
      char *ret4 =(char*)malloc (len4*2); 
      if(!ret4)
      {  
        printf("malloc error :%d",len4*2);  
        exit(-1);  
      }  
      base64encode(content,len4,ret4);
      fputs(ret4,fp);
      free(ret4);
      ret4=NULL;
    } 
    
    
    fputs(boundary2,fp);
  
    fputs("--",fp);
    fputs(boundary1,fp);
    
    
    if(att_name&&att_path)
    {
      char *name_t[100];
      int name_i=0;
      //printf("%s\n",att_name);
      char input_name[10000];
      strcpy(input_name,att_name);
      char *name_tk=strtok(input_name,",");
      //printf("%s\n",name_tk);
      while (name_tk!=NULL && name_i<100) 
      {
        name_t[name_i]=name_tk;
        name_tk=strtok(NULL,",");
        name_i++;
      }
  
      char input_path[10000];
      strcpy(input_path,att_path);
  
      char *path_tk,*path_t[100];
      int path_i=0;
      path_tk=strtok(input_path,",");
      while (path_tk!=NULL&&path_i<100) 
      {
        path_t[path_i]=path_tk;
        path_tk=strtok(NULL,",");
        path_i++;
      }
      //printf("%d",path_i);
      //printf("%s %s",path_t[0],path_t[1]);
      int j;
      for(j=0;j<name_i;)
      {
        fputs(type5,fp);
        fputs(eml_charset,fp);
        fputs(name_t[j],fp);
        int len3 =strlen(name_t[j]);
        char *ret3=(char*)malloc(len3*2); 
        if(!ret3)
        {  
          printf("malloc error :%d",len3*2);  
          exit(-1);  
        }  
        base64encode(name_t[j],len3,ret3);
        fputs(ret3,fp);                                          //附件
        fputs(name2,fp);
        fputs(eml_content,fp);
        fputs(file_name,fp);
        fputs(ret3,fp);
        fputs(name2,fp);
        fputs(eml_encoding,fp);
        fclose(fp);
        fileconvert(path_t[j],filename1);
        fputs(boundary1,fp);
        j=j+1;
        free (ret3);
        ret3=NULL;
      }
    
    }
    else if(att_name&&(att_path==NULL))
    {
      printf("Error:缺少附件路径\n");
      exit(0);
    }
    else if((att_name==NULL)&&att_path)
    {
      printf("Error:缺少附件名称\n");
      exit(0);
    }
    else
    {
      
    };
    
  fputs("--",fp);
  fclose(fp);//关闭
  printf("successful!!\n");
  }
}

通过base64编码 和mime类型组装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值