/*mail.h -- mail.h is a free header file which includes two functions to send an email via an SMTP Server. sendmail() Function usage : This Function has 6 Parameters : » first param : SMTP Server hostname;eg. "mx4.mail.yahoo.com" » Second param : name of the person who sends the EMail;eg. "Amir A" » Third param : sender's EMail address;eg. "Sender@Somewhere.com" » Fourth param : receiver's EMail address;eg. "Receiver@Somewhere.com" » fifth param : EMail Subject;eg. "Hi Dear Friend!" » sixth param : EMail Passage;eg. "I miss you!" Needed Header files : stdlib.h , winsock2.h and time.h. Return value : returns true on success and returns false on failure.for a better error handling Please use WSAGetLastError() function right after the function call. Author : coded by Mobin Yazarlou.Secure_krnl «atsign» Yahoo «dot» com */ bool sendmail(char *,char *,char *,char *,char *,char *); void dateheader(char *); #define BUFFSIZE 256 #define CR 13 #define LF 10 bool sendmail(char *smtphost,char *fromname,char *frommail,char *tomail,char *subject,char *message) { int result,bytes_sent,bytes_recv; char *buff,dheader[27]; SOCKET mailsocket; WSADATA wsd; struct hostent *smtp; struct sockaddr_in smtpaddr; if(WSAStartup(MAKEWORD(2,0),&wsd) != 0) return false; smtp = gethostbyname(smtphost); if(!smtp) return false; mailsocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(mailsocket == INVALID_SOCKET) return false; smtpaddr.sin_family = AF_INET; smtpaddr.sin_addr.s_addr = *(unsigned long *)smtp->h_addr; smtpaddr.sin_port = htons(25); result = connect(mailsocket,(struct sockaddr *)&smtpaddr,sizeof(struct sockaddr)); if(result == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } buff = (char *) malloc(BUFFSIZE); // Recv Mail Server Welcome Message bytes_recv = recv(mailsocket,buff,BUFFSIZE,0); if(bytes_recv == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send HELO Command sprintf(buff,"HELO yahoo.com%c%c",CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Recv Server Response bytes_recv = recv(mailsocket,buff,BUFFSIZE,0); if(bytes_recv == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send MAIL FROM: Command sprintf(buff,"MAIL FROM: <%s>%c%c",frommail,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Recv Server Response bytes_recv = recv(mailsocket,buff,BUFFSIZE,0); if(bytes_recv == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send RCPT TO: Command sprintf(buff,"RCPT TO: <%s>%c%c",tomail,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Recv Server Response bytes_recv = recv(mailsocket,buff,BUFFSIZE,0); if(bytes_recv == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send DATA Command sprintf(buff,"DATA%c%c",CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Recv Server Response bytes_recv = recv(mailsocket,buff,BUFFSIZE,0); if(bytes_recv == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send From Header sprintf(buff,"From: %s <%s>%c%c",fromname,frommail,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send Subject Header sprintf(buff,"Subject: %s%c%c",subject,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send MIME-Version Header sprintf(buff,"MIME-Version: 1.0%c%c",CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send Content-Type Header sprintf(buff,"Content-Type: text/plain; charset=\"utf-8\"%c%c",CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send Content-Transfer-Encoding Header sprintf(buff,"Content-Transfer-Encoding: 8bit%c%c",CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Send Date Header dateheader(dheader); sprintf(buff,"Date: %s%c%c",dheader,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // End of Headers sprintf(buff,"%c%c%c%c",CR,LF,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Now Send The Message buff = (char *) realloc(buff,strlen(message)+6); sprintf(buff,"%s%c%c.%c%c",message,CR,LF,CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',sizeof(buff)); // Recv Server Response buff = (char *) realloc(buff,BUFFSIZE); bytes_recv = recv(mailsocket,buff,BUFFSIZE,0); if(bytes_recv == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); // Quit From Mail Server sprintf(buff,"QUIT%c%c",CR,LF); bytes_sent = send(mailsocket,buff,strlen(buff),0); if(bytes_sent == SOCKET_ERROR) { closesocket(mailsocket); WSACleanup(); return false; } memset(buff,'\0',BUFFSIZE); closesocket(mailsocket); WSACleanup(); return true; } void dateheader(char *header) { char mon[4]; time_t timeinsec; struct tm *currentdt; timeinsec = time(NULL); currentdt = localtime(&timeinsec); switch(currentdt->tm_mon) { case 0 : strncpy(mon,"Jan\0",4); break; case 1 : strncpy(mon,"Feb\0",4); break; case 2 : strncpy(mon,"Mar\0",4); break; case 3 : strncpy(mon,"Apr\0",4); break; case 4 : strncpy(mon,"May\0",4); break; case 5 : strncpy(mon,"Jun\0",4); break; case 6 : strncpy(mon,"Jul\0",4); break; case 7 : strncpy(mon,"Aug\0",4); break; case 8 : strncpy(mon,"Sep\0",4); break; case 9 : strncpy(mon,"Oct\0",4); break; case 10 : strncpy(mon,"Nov\0",4); break; case 11 : strncpy(mon,"Dec\0",4); break; } sprintf(header,"%d %s %d %02d:%02d:%02d +0330",currentdt->tm_mday, mon,currentdt->tm_year+1900,currentdt->tm_hour,currentdt->tm_min, currentdt->tm_sec); }