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类型组装