char *trans_date(long int lt) { struct tm *newtime; char s[40]; char *tk=NULL,*t[5]; int i; newtime=localtime(<); //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類型組裝