組裝eml格式檔案

來源:互聯網
上載者:User
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類型組裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.