メールクライアントプログラミング(popとsmtp)
17488 ワード
環境:xpシステム、vc 6.0、c言語
ここではコードの下書きですが、もともと設計された構造は今の構造とは大きく違います.
実装された部分: smtpプロトコルは、最も簡単なメールフォーマットの送信を完了することができ、受信者は正常に を受信することができる. base 64符号化は、任意の長さの文字列に対するbase 64符号化 を完了することができる. base 64の復号は、単一バイトの復号 が完了しただけである. popプロトコルは、基本的なサーバインタラクション命令を完了するだけであり、data部分の受信に対して は実現する.
私の考えは模索段階のコードは必ずc++を使用しないで、統合の最適化を行う時c++パッケージを使用することを考慮します
また見ているとコードが乱れているような気がするかもしれませんが、よろしければアドバイスしてください
ここではコードの下書きですが、もともと設計された構造は今の構造とは大きく違います.
実装された部分:
私の考えは模索段階のコードは必ずc++を使用しないで、統合の最適化を行う時c++パッケージを使用することを考慮します
また見ているとコードが乱れているような気がするかもしれませんが、よろしければアドバイスしてください
#include <Winsock2.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define PORTPOP 110
#define PORTSMTP 25
#define BUFF_BASE64 1024*1024*4 // 4M base64 ,2M ,2M
char *buff_begin;//
unsigned long num_now;//
char *point_now;//
struct base64{
char result;//base64
char residue;//
int number;//
};
char base64_char[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','+','/',};
int chartonumber(base64 *data); // :
int transformtobase64(base64 *data); // :
int transformstring(char *strings); // :
//
int condition_pop3=0;
int tcp_pop(SOCKET pop,sockaddr_in saddr,char *r_buffer,char *s_buffer);
int tcp_smtp(char *r_buffer,char *s_buffer);
char *name="servertss"; //
char *pasw="12345zxcvb";//
char *capa="CAPA";
char *user="USER";//
char *pass="PASS";//
char *apop="APOP";// MD5
char *stat="STAT";//
char *uidl="UIDL";//
char *list="LIST";//
char *retr="RETR";//
char *dele="DELE";//
char *rset="RSET";// , DELE
char *top="TOP";// n ,n
char *noop="NOOP";//
char *quit="QUIT";//
char *ok="+OK";//
char crlf[2]={'\r','
'};//
char *ehlo="EHLO";// SMTP
char *auth="AUTH";
char *login="LOGIN";
char *mail="MAIL";//
char *from="FROM";//
char *rcpt="RCPT";//
char *data="DATA";//
char *vrfy="VRFY";// /
char *expn="EXPN";// , ,
char *help="HELP";//
int senddata(char *begin);
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);
int err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
printf("WSAStartup
");
return 0;
}
buff_begin=(char *)malloc(BUFF_BASE64);
if(!buff_begin)
return 0;
num_now=0;
point_now=buff_begin;
char request[512];//
char respond[512];//
//memset(request,'\0',512);
//memset(respond,'\0',512);
sockaddr_in saddr_pop;
saddr_pop.sin_family=AF_INET;
saddr_pop.sin_port=htons(PORTPOP);
saddr_pop.sin_addr.s_addr= inet_addr("123.125.50.29");
SOCKET client_pop;
client_pop=socket(AF_INET,SOCK_STREAM,0);
/*
char *s=" ";
transformstring(s);
for(int i=0;i<num_now;i++)
{
printf("%c",*(buff_begin+i));
}
printf("
");
*/
int n=10;
while(n)
{
tcp_smtp(request,respond);
Sleep(30000);
n--;
}
/*
int ii=senddata(buff_begin);
printf("%d",ii);
for(int i=0;i<ii;i++)
{
printf("%c",*(buff_begin+i));
}
*/
/*
tcp_pop(client_pop,saddr_pop,request,respond);
bool brk=1;
while(brk)//
{
Sleep(5000);
}
*/
WSACleanup();
return 1;
}
//POP
int tcp_pop(SOCKET pop,sockaddr_in saddr,char *r_buffer,char *s_buffer)
{
int con=connect(pop,(struct sockaddr *)&saddr,sizeof(saddr));
if(con==0)
printf("TCP
");
else
return 0;
//TCP
memset(r_buffer,'\0',512);
int rec=recv(pop,r_buffer,512,0);
printf("%s
",r_buffer);
//CAPA
memset(s_buffer,'\0',512);
memcpy(s_buffer,capa,4);
memcpy(s_buffer+4,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,6,0);
//CAPA
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
//USER
memset(s_buffer,'\0',512);
memcpy(s_buffer,user,4);
*(s_buffer+4)=' ';
memcpy(s_buffer+5,name,9);
memcpy(s_buffer+14,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,16,0);
//USER
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
//PASS
memset(s_buffer,'\0',512);
memcpy(s_buffer,pass,4);
*(s_buffer+4)=' ';
memcpy(s_buffer+5,pasw,10);
memcpy(s_buffer+15,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,17,0);
//PASS ,
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
//STAT
memset(s_buffer,'\0',512);
memcpy(s_buffer,stat,4);
memcpy(s_buffer+4,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,6,0);
//STAT ,
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
//UIDL
memset(s_buffer,'\0',512);
memcpy(s_buffer,uidl,4);
memcpy(s_buffer+4,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,6,0);
//UIDL ,
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
//LIST
memset(s_buffer,'\0',512);
memcpy(s_buffer,list,4);
memcpy(s_buffer+4,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,6,0);
//LIST ,
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
//QUIT
memset(s_buffer,'\0',512);
memcpy(s_buffer,quit,4);
memcpy(s_buffer+4,crlf,2);
printf("%s
",s_buffer);
send(pop,s_buffer,6,0);
//QUIT ,
memset(r_buffer,'\0',512);
rec=recv(pop,r_buffer,512,0);
printf("%s",r_buffer);
return 1;
}
//SMTP
int tcp_smtp(char *r_buffer,char *s_buffer)
{
sockaddr_in saddr_smtp;
saddr_smtp.sin_family=AF_INET;
saddr_smtp.sin_port=htons(PORTSMTP);
saddr_smtp.sin_addr.s_addr= inet_addr("123.125.50.134");
SOCKET smtp;
smtp=socket(AF_INET,SOCK_STREAM,0);
int con=connect(smtp,(struct sockaddr *)&saddr_smtp,sizeof(saddr_smtp));
if(con==0)
printf("TCP
");
else
{
return 0;
}
//TCP
memset(r_buffer,'\0',512);
int rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//EHLO
memset(s_buffer,'\0',512);
memcpy(s_buffer,ehlo,4);
memcpy(s_buffer+5,name,9);
memcpy(s_buffer+14,crlf,2);
printf("%s",s_buffer);
send(smtp,s_buffer,16,0);
//EHLO
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//AUTH
memset(s_buffer,'\0',512);
memcpy(s_buffer,auth,4);
*(s_buffer+4)=' ';
memcpy(s_buffer+5,login,5);
memcpy(s_buffer+10,crlf,2);
printf("%s",s_buffer);
send(smtp,s_buffer,12,0);
//AUTH
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//USER
memset(s_buffer,'\0',512);
memcpy(s_buffer,"c2VydmVydHNz",12);
memcpy(s_buffer+12,crlf,2);
printf("%s",s_buffer);
send(smtp,s_buffer,14,0);
//USER
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//PASS
memset(s_buffer,'\0',512);
memcpy(s_buffer,"MTIzNDV6eGN2Yg==",16);
memcpy(s_buffer+16,crlf,2);
printf("%s",s_buffer);
send(smtp,s_buffer,18,0);
//PASS
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//MAIL
memset(s_buffer,'\0',512);
memcpy(s_buffer,mail,4);
*(s_buffer+4)=' ';
memcpy(s_buffer+5,"FROM: <);
memcpy(s_buffer+30,crlf,2);
printf("%s
",s_buffer);
send(smtp,s_buffer,32,0);
//MAIL
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//RCPT
memset(s_buffer,'\0',512);
memcpy(s_buffer,rcpt,4);
*(s_buffer+4)=' ';
memcpy(s_buffer+5,"TO: <);
memcpy(s_buffer+28,crlf,2);
printf("%s",s_buffer);
send(smtp,s_buffer,30,0);
//RCPT
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//DATA
memset(s_buffer,'\0',512);
memcpy(s_buffer,data,4);
memcpy(s_buffer+4,crlf,2);
printf("%s",s_buffer);
send(smtp,s_buffer,6,0);
//DATA
int ii=senddata(buff_begin);
send(smtp,buff_begin,ii,0);
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
//QUIT
memset(s_buffer,'\0',512);
memcpy(s_buffer,quit,4);
memcpy(s_buffer+4,crlf,2);
printf("%s
",s_buffer);
send(smtp,s_buffer,6,0);
//QUIT ,
memset(r_buffer,'\0',512);
rec=recv(smtp,r_buffer,512,0);
printf("%s",r_buffer);
closesocket(smtp);
return 1;
}
// 2M
int senddata(char *begin)
{
int num=0;
memcpy(begin,"Date: Sat,8 Mar 2014 22:36:04 +0800 (CST)",41);
memcpy(begin+41,crlf,2);
num+=43;
memcpy(begin+num,"From: \"" <);
memcpy(begin+num+45,crlf,2);
num+=45+2;
memcpy(begin+num,"To: servertss <);
memcpy(begin+num+33,crlf,2);
num+=33+2;
memcpy(begin+num,"Subject: =?GB2312?B?YysrtcTEx7G+yunE47fF1NrExMDvwcs=?=",54);
memcpy(begin+num+54,crlf,2);
num+=54+2;
memcpy(begin+num,"Mime-Version: 1.0",17);
memcpy(begin+num+17,crlf,2);
num+=17+2;
memcpy(begin+num,"Message-ID: <);
memcpy(begin+num+43,crlf,2);
num+=43+2;
memcpy(begin+num,"Content-Type: multipart/alternative;",36);
*(begin+num+36)='
';
*(begin+num+37)='\t';
memcpy(begin+num+36+2,"boundary=\"----=_001_NextPart674370231387_=----\"",48);
memcpy(begin+num+36+2+48,crlf,2);
num+=36+2+48+2;
memcpy(begin+num,crlf,2);
num+=2;
memcpy(begin+num,"------=_001_NextPart674370231387_=----",38);
memcpy(begin+num+38,crlf,2);
num+=38+2;
memcpy(begin+num,"Content-Type: text/plain;",25);
*(begin+num+25)='
';
*(begin+num+26)='\t';
memcpy(begin+num+25+2,"charset=\"GB2312\"",16);
memcpy(begin+num+25+2+16,crlf,2);
num+=25+2+16+2;
memcpy(begin+num,"Content-Transfer-Encoding: base64",33);
memcpy(begin+num+33,crlf,2);
*(begin+num+33+2)='
';
num+=33+2+1;
memcpy(begin+num,"CgoKYysrtcTEx7G+yunE47fF1NrExMDvwcsKy9m2yLjmy9/O0goK",52);
num+=52;
memcpy(begin+num,crlf,2);
num+=2;
memcpy(begin+num,"------=_001_NextPart674370231387_=----",38);
memcpy(begin+num+38,crlf,2);
num+=38+2;
memcpy(begin+num,crlf,2);
*(begin+num+2)='.';
memcpy(begin+num+2+1,crlf,2);
num+=2+1+2;
return num;
}
// , “+OK” ,
/*
int check_id(char *buff)
{
char id[4];
char characters[500];
memset(id,'\0',4);
memset(characters,'\0',500);
int i=0;
for(i=0;i<4;i++)
{
id[i]=*(buff+i);
i++;
}
switch(id)
{
case "+OK":
break;
}
return 1;
}
*/
// base64
int transformstring(char *strings)
{
int num=0; //
int buf=0; //
base64 buf_transfer; //base64
memset(&buf_transfer,'\0',sizeof(buf_transfer));
buf_transfer.result=*strings;
buf_transfer.number=0;
while(buf_transfer.result!='\0')// ,
{
if((0<=buf)&&(buf<6))
{
buf=transformtobase64(&buf_transfer);
memcpy(point_now,&(buf_transfer.result),1);
num++;
buf_transfer.result=*(strings+num);
}
else
{
if(buf==6)
{
*point_now=base64_char[(unsigned int)buf_transfer.residue];
buf_transfer.number=0;
buf_transfer.residue='\0';
buf=0;
}
else
return buf;
}
point_now=point_now+1;
num_now++;
}
if(buf_transfer.residue)
{
*point_now=base64_char[(unsigned int)(buf_transfer.residue<<(6-buf_transfer.number))];
point_now++;
num_now++;
}
buf=num%3;
switch(buf)
{
case 0:
break;
case 1:
memset(point_now,'=',2);
point_now=point_now+2;
num_now=num_now+2;
break;
case 2:
*point_now='=';
point_now++;
num_now++;
break;
}
return num;
}
int transformtobase64(base64 *data)// base64
{
if(data->number<0)
return -1;
if(data->number>6)
return 8;
char buf='\0',back='\0';
buf=data->residue<<(6-data->number);
back=data->result>>(2+data->number);
buf=back^buf;
buf&=63;
back='\0';
back=data->result<<(6-data->number);
data->residue=back>>(6-data->number);
data->result=base64_char[(unsigned int)buf];
data->residue&=63;
data->number=2+data->number;
return data->number;
}
// base64
int transformbase64(char *strings)
{
return 1;
}
int base64totransform(base64 *data)// base64
{
if(data->number<0)
return -1;
if(data->number>6)
return 8;
if(!chartonumber(data))// 6
return 0;
char buf='0',back='0';
buf=data->residue<<(8-data->number);
if(data->number<3)
{
back=data->result;
data->number+=6;
}
else{
if(data->number<9)
{
back=data->result>>(data->number-2);
data->result=data->result<<(10-data->number);
data->residue=data->result>>(10-data->number);
data->number=data->number-2;
data->result=buf^back;
}
}
data->residue=back^buf;
if(data->number>7)
{
data->result=data->residue;
data->residue='0';
data->number=0;
}
return data->number;
}
int chartonumber(base64 *data)
{
//65-90:A-Z
//97-122:a-z
//48-57:0-9
//43,47:+,/
int cod=0;
if(64<(int)(data->result)&&91>(int)(data->result))
{
cod=1;
data->result=char((int)(data->result)-65);
}
if(96<(int)(data->result)&&123>(int)(data->result))
{
cod=1;
data->result=char((int)(data->result)-97+26);
}
if(47<(int)(data->result)&&58>(int)(data->result))
{
cod=1;
data->result=char((int)(data->result)-48+52);
}
if(43==(int)(data->result))
{
cod=1;
data->result=0x2B;
}
if(47==(int)(data->result))
{
cod=1;
data->result=0x2F;
}
if(cod)
return 1;
else
return 0;
}