#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h rel='nofollow' onclick='return false;'>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<netdb.h>
#include<termios.h>
#include<errno.h>
#define SIZE 9999
#define PASS_MAXLEN 125
#define BACKSPACE 8
#define MAX 512
#define MAXDATA 5000
#define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)
int sock;
char buffer4[SIZE];
char buffer5[SIZE];
char buffer6[SIZE];
char buffer7[SIZE];
char statbuffer[SIZE];
char retrbuffer[SIZE];
char savebuffer[SIZE];
int list(); //邮件列表函数
int stat(); //邮件状态函数
int retr(); //查看邮件内容函数
int save(); //下载邮件函数
int sear(); //搜索关键字函数
int quit(); //退出函数
int judge=1,pass=1;
char *pop3name;
char User[SIZE];
char Pass[SIZE];
char input1[SIZE];
char input2[SIZE];
char domainbuffer[SIZE];
char namebuffer[SIZE];
char passbuffer[SIZE];
char choice;
struct sockaddr_in pop3addr;
struct hostent *pop3;
int sock, numbytes;
struct sockaddr_in it_addr;
char destination[MAX]={'\0'};
struct hostent * aimpop3;
main()
{
printf("Please input the pop3 domain:\n");
printf(">>");
gets(destination); //输入POP3域名,例如pop.163.com
if((aimpop3=gethostbyname(destination))==NULL) //gethostbyname()返回对应于给定主机名的包含主机名和地址信息的hostent指针
{
herror("gethostbyname");
exit(1);
}
if((sock=socket(AF_INET,SOCK_STREAM,0))==-1) //创建套接字
{
perror("socket");
exit(1);
}
it_addr.sin_family=AF_INET;
it_addr.sin_port=htons(110);
it_addr.sin_addr=*((struct in_addr*) aimpop3->h_addr);
memset(&(it_addr.sin_zero),'\0',8);
if(connect(sock,(struct sockaddr *)&it_addr,sizeof(struct sockaddr))<0) //连接服务器
{
perror("connect");
exit(1);
}
recv(sock,domainbuffer,SIZE,0); //接受域名返回信息
if((domainbuffer[0]=='+')&&(domainbuffer[1]=='O')&&(domainbuffer[2]=='K')){ //如果域名正确,服务器会返回+OK信息
printf("Please input username:\n");
printf(">>");
}
else printf("ACK error\n");
while(pass){
memset(User,'\0',strlen(User));
char User[SIZE]="USER ";
scanf("%s",input1); //输入用户名
getchar();
strcat(User,input1);
strcat(User,"\r\n");
send(sock,User,strlen(User),0);
recv(sock,namebuffer,SIZE,0); //接收用户名的反馈信息
////////////////////////////////////// 取消密码回显
int set_disp_mode(int fd,int option){
int err;
struct termios term;
if(tcgetattr(fd,&term)==-1){
perror("Cannot get the attribution of the terminal");
return 1;
}
if(option)
term.c_lflag|=ECHOFLAGS;
else
term.c_lflag &=~ECHOFLAGS;
err=tcsetattr(fd,TCSAFLUSH,&term);
if(err==-1 && err==EINTR){
perror("Cannot set the attribution of the terminal");
return 1;
}
return 0;
}
///////////////////////////////////////
if((namebuffer[0]=='+')&&(namebuffer[1]=='O')&&(namebuffer[2]=='K')){
set_disp_mode(STDIN_FILENO,0);
printf("Please input password:\n");
printf(">>");
}
else printf("Username error\n");
scanf("%s",input2); //输入密码
char c;
char passwd[25];
int i = 0;
do{
c=getchar();
if (c != '\n'|c!='\r')
passwd[i++] = c;
}while(c != '\n' && c !='\r' && i < (strlen(passwd) - 1));
passwd[i-1]='\0';
set_disp_mode(STDIN_FILENO,1);
printf("\n");
memset(Pass,'\0',strlen(Pass));
char Pass[SIZE]="PASS ";
strcat(Pass,input2);
strcat(Pass,"\r\n");
printf("%s\n",Pass);
if(send(sock,Pass,strlen(Pass),0)!=strlen(Pass))
printf("Password sending error\n");
if(recv(sock,passbuffer,SIZE,0)!=strlen(passbuffer)){ //密码是否正确的反馈信息
printf("PASS error\n");
printf("Input password again(Ctrl+C to quit)\n");
printf(">>");
judge=0;
}
else{
if((passbuffer[0]=='+')&&(passbuffer[1]=='O')&&(passbuffer[2]=='K')){ //密码正确,在passbuffer中返回+OK
printf("%s\n",passbuffer);
system("clear");
pass=0;
}
else{
printf("USERNAME OR PASS error\n");
printf("Input username again(Ctrl+C to quit)\n");
printf(">>");
}
}
} //while() ends
while(judge)
{
printf("***********************************************************************\n");
printf("1.Get a list of messages and sizes\n");
printf("2.Get mail status\n");
printf("3.Display mail in detail\n");
printf("4.Download the mail and delete in the remote service\n");
printf("5.Search text in all mails\n");
printf("6.Quit\n");
printf("***********************************************************************\n");
printf("Please choose number:\n");
printf(">>");
scanf("%c",&choice);
getchar();
switch(choice)
{
case '1': judge=list();break;
case '2': judge=stat();break;
case '3': judge=retr();break;
case '4': judge=save();break;
case '5': judge=sear();break;
case '6': judge=quit();break;
default: printf("Error\n");
}
} //while() end
} //main() end
int list()
{
int choice1;
char *command="LIST\r\n";
send(sock,command,strlen(command),0); //向服务器发送LIST指令
recv(sock,buffer4,SIZE,0);
if((buffer4[0]=='+')&&(buffer4[1]=='O')&&(buffer4[2]=='K')) //读取LIST的返回信息,如果+OK表示指令正确
{
printf("%s\n",buffer4);
printf("Press 1 to return to main interface\n");
printf("Press 2 to return to quit\n");
printf(">>");
scanf("%d",&choice1);
getchar();
system("clear");
if(choice1==1) return(1); //输入1时,list函数向主函数返回1
else return(0);
}
else{
printf("LIST failed\n");
return(0);
}
}
int stat()
{
int choice2;
if(send(sock,"STAT\r\n",6,0)!=6)
printf("STAT failed\n");
if(recv(sock,buffer5,SIZE,0)!=strlen(buffer5))
printf("STAT failed\n");
else{
if((buffer5[0]=='+')&&(buffer5[1]=='O')&&(buffer5[2]=='K'))
{
printf("%s\n",buffer5);
printf("Press 1 to return to main interface\n");
printf("Press 2 to return to quit\n");
printf(">>");
scanf("%d",&choice2);
getchar();
system("clear");
if(choice2==1)
return(1);
else
return(0);
}
else{
printf("STAT failed\n");
return(0);
}
} // outside else ends
}
int retr()
{
int iteration=1;
int choice3;
char num[SIZE];
char data[99999];
char command[SIZE]="RETR ";
printf("Input email number to view in detail\n");
printf(">>");
scanf("%s",num);
getchar();
strcat(command,num);
strcat(command,"\r\n");
send(sock,command,strlen(command),0);
memset(data,'\0',strlen(data));
memset(buffer6,'\0',strlen(buffer6));
while(iteration){
recv(sock,buffer6,SIZE,0);
strcat(data,buffer6);
int length=strlen(data);
if((data[length-1]=='\n')&&(data[length-2]=='\r')&&(data[length-3]=='.')&&(data[length-4]=='\n')&&(data[length-5]=='\r'))
{
printf("%s",data);
printf("Press 1 to return to main interface\n");
printf("Press 2 to return to quit\n");
printf(">>");
scanf("%d",&choice3);
getchar();
system("clear");
if(choice3==1) return 1;
else return 0;
}
else
printf("%c\n",data[length-3]);
memset(buffer6,'\0',strlen(buffer6));
} //while ends
}
int save()
{
int choice4;
char tmp[MAX],filename[MAX],num[SIZE];
char command1[SIZE]="RETR ";
char command2[SIZE]="DELE ";
char buffer[MAXDATA];
char data[99999];
int iteration=1;
FILE *fp;
int len;
printf("Please input the ID number: \n")