#include<sys/types.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<sys/ioctl.h>
#include<stdio.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
//time header
#include <time.h>
#include <pthread.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/stat.h>
#define SIZE 1024
//define mail commands
#define R_EHLO 0
#define R_AUTH 1
#define R_USER 2
#define R_PASS 3
#define R_MAIL 4
#define R_RCPT 5
#define R_DATA 6
#define R_CONT 7
#define R_QUIT 8
int main()
{
int server_sockfd, client_sockfd;
int client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
int result,i,numbytes,j;
char *msg[9]={""};
char *n_return[9]={""}; //return number
char username[512]="";//mail username
char passwd[512]=""; //mail passwd
char receiver[512]="";//receiver
char buff[512]="",tmp[5]="",str[SIZE],fname[SIZE],*fpath,mailname[20],mailpass[20],chr[10];
FILE *fp;
time_t nowtime;
struct tm *timeinfo;
time( &nowtime );
timeinfo = localtime( &nowtime );
int year, month, day;
year = timeinfo->tm_year + 1900;
month = timeinfo->tm_mon + 1;
day = timeinfo->tm_mday;
msg[R_EHLO]="250 EHLO has been received.\n";
msg[R_AUTH]="334 AUTH has been received.\n";
msg[R_USER]="334 USER has been received.\n";
msg[R_PASS]="235 PASS has been received.\n";
msg[R_MAIL]="250 MAIL has been received.\n";
msg[R_RCPT]="250 RCPT has been received.\n";
msg[R_DATA]="354 DATA has been received.\n";
msg[R_CONT]="250 CONT has been received.\n";//QUIT
msg[R_QUIT]="250 QUIT has been received.\n";//QUIT
n_return[R_EHLO]="EHLO";
n_return[R_AUTH]="AUTH";
n_return[R_USER]="USER";
n_return[R_PASS]="PASS";
n_return[R_MAIL]="MAIL";
n_return[R_RCPT]="RCPT";
n_return[R_DATA]="DATA";
n_return[R_CONT]="CONT";
n_return[R_QUIT]="QUIT";
//create socket for tcp
printf("SMTP Server is starting...\n");
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
server_address.sin_family = AF_INET;
//get localhost ip
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(19734);
client_len = sizeof(client_address);
//bindation
bind(server_sockfd, (struct sockaddr *) &server_address, sizeof (server_address));
//jianting
listen(server_sockfd, 5);
sleep(2);
printf("SMTP Server is ready.\n");
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);//&client_len);
if(send(client_sockfd,"220 Connection has been created successfully\n",60,0)==-1)
{
perror("send");
}
printf("Connect successfully!\n");
if((numbytes=recv(client_sockfd,buff,SIZE,0))==-1)
{
perror("recv error");
return(0);
}
strncpy(chr,buff,10);
printf("chr:%s\n",chr);
printf("BUFF:%s\n",buff);
memset(buff,0,512);
if(send(client_sockfd,"ok service choose successfully\n",50,0)==-1)
{
perror("send");
}
if(strncmp(chr,"login",5)==0)
{ i=R_EHLO;
while(i<=R_QUIT)
{
//for(j=0;j<512;j++)
//buff[j]="";
memset(buff,0,512);
if((numbytes=recv(client_sockfd,buff,SIZE,0))==-1)
{
perror("recv error");
break;
}
strncpy(tmp,buff,4);
printf("current i:%d\n",i);
printf("command:%s",msg[i]);
if(i==R_MAIL)
printf("return buff:%s client %s\n",buff,username);
else
printf("return buff:%s\n",buff);
if(i==R_USER)
{
for(j=0;j<(strlen(buff)-4);j++)
username[j]=buff[j+4];
printf("FIRST return username:%s\n",username);
sprintf(fpath,"/thrill/network/%s",username);
//fpath="/thrill/network/";
//strncat(fpath,username,strlen(username));
//strncat(fpath,".file",5);
printf("FPATH:%s\n",fpath);
if(mkdir(fpath,0777) ==0)
{
printf("The user is not available!\n");
if(rmdir(fpath)==0)
printf("Directory was successfully removed\n ");
else
printf("Problem removing directory \n " );
return(0);
}
else
{
printf("The user is available!\n");
}
//if((fp=fopen(fpath,"w"))==NULL)
//{
//puts("cannot open the file !");
//return(0);
//}
}
if(i==R_PASS)
{
for(j=0;j<(strlen(buff)-4);j++)
passwd[j]=buff[j+4];
printf("FIRST return passwd:%s\n",passwd);
sprintf(fname,"/thrill/network/%s/%s.txt",username, username);
printf("Current fname is:%s\n",fname);
if((fp=fopen(fname,"r"))==NULL)
{
puts("cannot open the file !");
return(0);
}
//fp=fopen(str,"w");
//fgets(str,strlen(passwd),fp);
fscanf(fp,"%s",str);
printf("Current str is:%s\n",str);
fclose(fp);
printf("Current str is:%s\n",str);
if(strncmp(str,passwd,3)==0)
{
printf("Login successfully\n");
}
else
{
printf("Badly login\n");
return(0);
}
}
if(i==R_RCPT)
{
for(j=0;j<(strlen(buff)-4);j++)
receiver[j]=buff[j+4];
printf("return receiver:%s\n",receiver);
sprintf(fpath,"/thrill/network/%s",receiver);
printf("FPATH:%s\n",fpath);
if(mkdir(fpath,0777) ==0)
{
printf("The receiver is not available!\n");
if(rmdir(fpath)==0)
printf("Directory was successfully removed\n ");
else
printf("Problem removing directory \n " );
return(0);
}
else
{
printf("The receiver is available!\n");
}
}
if(i==R_DATA)
{ for(j=0;j<(strlen(buff)-4);j++)
str[j]=buff[j+4];
printf("FIRST return str:%s\n",str);
sprintf(fname,"/thrill/network/%s/%s@%d-%d-%d.txt",receiver,username,year, month, day);
if((fp=fopen(fname,"w"))==NULL)
{
puts("cannot open the file !");
return(0);
}
//fp=fopen(str,"w");
fputs(str,fp);
memset(str,0,512);
fclose(fp);
/*if((fp=fopen("/thrill/network/file.txt","w"))==NULL)
{
puts("cannot open the file !");
//CreateFile("file.txt");
//return(0);
}
fputs(str,fp);
fclose(fp);*/
}
if(i==R_CONT)
{
strncpy(tmp,"CONT",4);
/*for(j=0;j<(strlen(buff)-4);j++)
str[j]=buff[j+4];
for(j=0;j<strlen(str);j++)
{ if(str[j]=='*')
break;
chr[j]=str[j];
}*/
/*for(j=0;j<strlen(buff);j++)
{ if(buff[j]=='*')
break;
str[j]=buff[j];
}*/
if(buff[0]=='*')
printf("This mail does not include accessories.");
else
{ for(j=0;j<strlen(buff);j++)
{ if(buff[j]=='*')
break;
str[j]=buff[j];
}
//sprintf(fname,"/thrill/network/%s/%s_accessories@%d-%d-%d.txt",receiver,username,year, month, day);
sprintf(fpath,"/thrill/network/%s/%s_accessories@%d-%d-%d",receiver,username,year, month, day);
printf("FPATH:%s\n",fpath);
if(mkdir(fpath,0777) !=0)
{
return(0);
}
sprintf(fname,"/thrill/network/%s/%s_accessories@%d-%d-%d/%s",receiver,username,year, month, day,str);
if((fp=fopen(fname,"w"))==NULL)
{
puts("cannot open the file !");
return(0);
}
//fp=fopen(str,"w");
fputs(&buff[j+1],fp);
fclose(fp);
memset(str,0,512);
}
}
//printf("SECOND return str:%s\n",fname);
//printf("return tmp:%s\n",tmp);
printf("should return:%s\n",n_return[i]);
if((numbytes=send(client_sockfd,msg[i],strlen(msg[i]),0))==-1)
{
printf("stop there....");
perror("send error");
break;
}
//printf("stop here....");
if(strcmp(tmp,n_return[i])==0)
{
i++;
}
else
{