C ile SMTP ve POP3 Uygulaması

Porto üniversitesinde öğrenciyken yapmış olduğum; C programlama diliyle basit manada maillerinizi okuyup,silme ve yeni bir mail gönderme işlemlerini gerçekleştiren uygulamanın kodları aşağıdaki gibidir. Tabi böyle bir uygulamayı yapabilmek için smtp ve pop3 gibi protokollerin nasıl kullanılacağı hakkında bir takım araştırmalar yapıp bunlar ile socket üzerinden nasıl haberleşirim sorusunun cevaplarını bu kod vasıtasıyla öğrenmiştim.


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <netdb.h>
#include <strings.h>
#include <string.h>
#include <netinet/tcp.h>

//#define SERVER_PORT 110
//#define SERVER_ADDR "193.136.28.29"

int	sockfd,contBuf;
char	buf[1000],msg[40];
int 	i = 0;
int 	port = 1234;
struct	sockaddr_in serv_addr;
struct 	hostent * host;

char 	c;
char 	emailfrom[40],emailto[40], emailmsg[1000],emailno[4];
char 	hostname[40],port_char[10],userid[25],userpass[25];
int	bytes;

void talkTelnet(char msgInput[50])
{

strcpy(msg,msgInput);
strncat(msg,"\r\n",5);
printf("C:[%s]\n",msg);
write(sockfd, msg, strlen(msg));
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);

}

void pop3func()
{

getchar();

printf("Enter your user_id\n");
c = getchar();

for(i=0;c != '\n';i++)
{
userid[i] = c;
c = getchar();
}
if(i > 0)
userid[i] = '\0';

printf("Enter your user_pass\n");
c = getchar();

for(i=0;c != '\n';i++)
{
userpass[i] = c;
c = getchar();
}
if(i > 0)
userpass[i] = '\0';

//reading first msg from server
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:FIRST MSG RECEIVED [%s]\n",buf);
/*user*/
strcpy(msg,"user ");
strncat(msg,userid,strlen(userid));
talkTelnet(msg);
//password
strcpy(msg,"pass ");
strncat(msg,userpass,strlen(userpass));
talkTelnet(msg);
//stat
talkTelnet("stat");
//get mail list

while(c!='m')
{
//get mail list
talkTelnet("list");

//get Mail by number
printf("Enter the number of the mail which u wanna read\n");
c = getchar();

for(i=0;c != '\n';i++)
{
emailno[i] = c;
c = getchar();
}
if(i > 0)
emailno[i] = '\0';

strcpy(msg,"retr ");
strncat(msg,emailno,strlen(emailno));
talkTelnet(msg);

//Delete Mail or Read new one
printf("For Delete Press d\n");
printf("For new Mail enter the number\n");
printf("For Main Menu press m\n");
c=getchar();
if(c=='d')
{
strcpy(msg,"dele ");
strncat(msg,emailno,strlen(emailno));
talkTelnet(msg);

}

}

menu();

}

void sendMail(char emailfrom[40],char emailto[40],char emailmsg[1000])
{
//reading first msg from server
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:FIRST MSG RECEIVED [%s]\n",buf);

/*send a string to the server*/
strcpy(msg,"helo fe.up.pt\r\n");
printf("C:[%s]\n",msg);
write(sockfd, msg, strlen(msg));
//reading 2nd msg from server
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);
//mail from info
strcpy(msg,"MAIL FROM:<");
strncat(msg,emailfrom,strlen(emailfrom));
strncat(msg,">\r\n",3);
write(sockfd, msg, strlen(msg));
printf("C:[%s]\n",msg);
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);
//receipt to info
strcpy(msg,"RCPT TO:<");
strncat(msg,emailto,strlen(emailto));
strncat(msg,">\r\n",3);
write(sockfd, msg, strlen(msg));
printf("C:[%s]\n",msg);
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);
//data
strcpy(msg,"DATA\r\n");
write(sockfd, msg, strlen(msg));
printf("C:[%s]\n",msg);
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);
//emailmessage
strcpy(msg,emailmsg);
strcat(msg,"\r\n.\r\n");
write(sockfd, msg, strlen(msg));
printf("C:[%s]\n",msg);
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);

}

void mimeMessage(char emailmsg[1000])
{

strcpy(msg,"MIME-version: 1.0\n");
strcat(msg,"Content-type: multipart/mixed; boundary='frontier'\n");
strcat(msg,"--frontier\nContent-type: text/plain");
strcat(msg,emailmsg);
strcat(msg,"\r\n.\r\n");
write(sockfd, msg, strlen(msg));
printf("C:[%s]\n",msg);
contBuf = recv(sockfd, buf, 1000, 0);
buf[contBuf]='\0';
printf("S:[%s]\n",buf);
}

void menu()
{
char key;
do{
printf("For Sending a Mail Press 1 \n");
printf("For Reading your Mails Press 2\n");
printf("For Exit Press 3\n");
key=getchar();
switch(key){
case '1':
{

getchar();
printf("please enter your mail adress\n");
c = getchar();

for(i=0;c != '\n';i++)
{
emailfrom[i] = c;
c = getchar();
}
if(i > 0)
emailfrom[i] = '\0';

printf("please enter your friend mail adress\n");

c = getchar();
for(i=0;c != '\n';i++)
{
emailto[i] = c;
c = getchar();
}

if(i > 0)
emailto[i] = '\0';

printf("please enter your message\n");

c = getchar();
for(i=0;c != '\n';i++)
{
emailmsg[i] = c;
c = getchar();
}
if(i > 0)
emailmsg[i] = '\0';

sendMail(emailfrom,emailto,emailmsg);

}
case '2':
pop3func();
case '3':
exit(1);
}
}while(key!=3);

}
int main(int argc, char** argv){

// Girdileri Al
printf("please enter port number\n");

c = getchar();
for(i=0;c != '\n';i++)
{
port_char[i] = c;
c = getchar();
}
if(i > 0)
{
port_char[i] = '\0';
port = atoi(port_char);
}

printf("port: %d\n",port);
printf("please enter hostname name(max 40 character)\n");

c = getchar();

for(i=0;c != '\n';i++)
{
hostname[i] = c;
c = getchar();
}
if(i > 0)
hostname[i] = '\0';

printf("host: %s\n",hostname);

//// End of getting inputs
/*server address handling*/

host = gethostbyname(hostname); // host adindan server adresi cikar
serv_addr.sin_family = host->h_addrtype;
memcpy((char *) &serv_addr.sin_addr.s_addr, host->h_addr_list[0],host->h_length);
serv_addr.sin_port = htons(port);
memset(serv_addr.sin_zero,0,8);

/*open an TCP socket*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) {
perror("socket()");
exit(0);
}
/*connect to the server*/
if(connect(sockfd,
(struct sockaddr *)&serv_addr,
sizeof(serv_addr)) < 0){
perror("connect()");
exit(0);
}
printf ("C:CONNECTED TO SERVER!\n");

menu();

close(sockfd);
exit(0);
}

About this entry