- 论坛徽章:
- 0
|
能登录到邮箱,发文本内容也行,发.txt的普通文本附件也行。jpg图片附件只能看到大小,下载下来却只有5字节,搞不懂是什么原因。
发附件源码如下:
int SendAffix(const char *filename,const int length)
{
int len;
FILE *fp=NULL;
unsigned char datasrc[58],datades[100];
fp = fopen(filename,"rb" ;
if(fp==NULL)
{
printf("can not open file" ;
return -1;
}
send_data = "--zhangwei\r\n";
rt = send(s,send_data,strlen(send_data),0);
if(rt == SOCKET_ERROR)
{
printf("send error" ;
shutdown(s,SD_BOTH);
close(s);
return -1;
}
sprintf(Filename,"Content-Type: application/octet-stream;name=%s\r\n",filename);
rt = send(s,Filename,strlen(Filename),0);
if(rt == SOCKET_ERROR)
{
printf("sendfilenameerror" ;
shutdown(s,SD_BOTH);
close(s);
return -1;
}
send_data = "Content-Transfer-Encoding: base64\r\n";
rt = send(s,send_data,strlen(send_data),0);
if(rt == SOCKET_ERROR)
{
printf("sendcodemethoderror" ;
shutdown(s,SD_BOTH);
close(s);
return -1;
}
sprintf(attachname,"Content-Disposition: inline;filename=%s\r\n",filename);
rt = send(s,attachname,strlen(attachname),0);
if(rt == SOCKET_ERROR)
{
printf("sendfilenameerror" ;
shutdown(s,SD_BOTH);
close(s);
return -1;
}
send_data = "\r\n";
rt = send(s,send_data,strlen(send_data),0);
if(rt == SOCKET_ERROR)
{
shutdown(s,SD_BOTH);
close(s);
return -1;
}
len = length;
while(!feof(fp))
{
if(len>=57)
{
fread(datasrc,57,1,fp);
datasrc[57]='\0';
len -= 57;
}
else if(len>0)
{
fread(datasrc,len,1,fp);
datasrc[len]='\0';
len = 0;
}
else
break;
Base64_Code((unsigned char *)datasrc,(unsigned char *)datades);
for(int timedelay=0;timedelay<1000;timedelay++)
for(int timedelay1=0;timedelay1<1000;timedelay1++);
rt = send(s,(char *)datades,strlen((char *)datades),0);
if(rt == SOCKET_ERROR)
{
printf("sendbase64dataerror" ;
shutdown(s,SD_BOTH);
close(s);
return -1;
}
}
fclose(fp);
send_data = "\r\n";
rt = send(s,send_data,strlen(send_data),0);
if(rt == SOCKET_ERROR)
{
shutdown(s,SD_BOTH);
close(s);
return -1;
}
return 1;
}
采用的base64编码函数如下:
int Base64_Code(unsigned char *s,unsigned char *d)
{
char CharSet[64]=
{
'A','B','C','D','E','F','G','H',
'I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X',
'Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n',
'o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3',
'4','5','6','7','8','9','+','/'
};
unsigned char In[3];
unsigned char Out[4];
int cnt=0;
if(!s||!d) return 0;
for(;*s!=0
{
if(cnt+4>76)
{
*d++='\n';
cnt=0;
}
if(strlen((char*)s)>=3)
{
In[0]=*s;
In[1]=*(s+1);
In[2]=*(s+2);
Out[0]=In[0]>>2;
Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
Out[2]=(In[1]&0x0f)<<2|(In[2]&0xc0)>>6;
Out[3]=In[2]&0x3f;
*d=CharSet[Out[0]];
*(d+1)=CharSet[Out[1]];
*(d+2)=CharSet[Out[2]];
*(d+3)=CharSet[Out[3]];
s+=3;
d+=4;
}
else if(strlen((char*)s)==1)
{
In[0]=*s;
Out[0]=In[0]>>2;
Out[1]=(In[0]&0x03)<<4|0;
*d=CharSet[Out[0]];
*(d+1)=CharSet[Out[1]];
*(d+2)='=';
*(d+3)='=';
s+=1;
d+=4;
}
else if(strlen((char*)s)==2)
{
In[0]=*s;
In[1]=*(s+1);
Out[0]=In[0]>>2;
Out[1]=(In[0]&0x03)<<4|(In[1]&0xf0)>>4;
Out[2]=(In[1]&0x0f)<<2|0;
*d=CharSet[Out[0]];
*(d+1)=CharSet[Out[1]];
*(d+2)=CharSet[Out[2]];
*(d+3)='=';
s+=2;
d+=4;
}
cnt+=4;
}
*d='\0';
return 1;
} |
|