D 的个人博客

但行好事莫问前程

  menu
417 文章
3446695 浏览
11 当前访客
ღゝ◡╹)ノ❤️

C语言实现SMTP协议发送邮件

 

/* 
*  文件名:SendMail.c
*  用途:基于SMTP协议的邮件发送程序
*  编程环境:WinXP SP2,Visual Studio 2005 Pro
*  参考资料:《HowTo.SMTP》,《SendMail》(NextFly写的),《MSDN 2005》
*  完成日期: 2006.8   Ver 0.01
*  作者: 88250
*  联系方式: E-mail: [email protected]  QQ:845765
*/

#include 
<stdio.h> 

#include 
<stdlib.h>

#include 
<winsock2.h> 



#pragma comment(lib, "ws2_32.lib") 



const char *MailData = "From: "dl88250"<[email protected]> " 

                        
"Subject: It's a test 

mail
! . "





int main(int argc, char *argv[]) 



   

    WSADATA wsaData;

    WORD wVersionRequested 
= MAKEWORD(22);

    
struct hostent *pHostent = NULL; 

    SOCKET server 
= INVALID_SOCKET; 

    
struct sockaddr_in service; 

    
int retConnect = 0

    
char Buffer[1024= {0}; 

     

    
if(WSAStartup(wVersionRequested, &wsaData) != 0){ 

        printf(
"Error at WSAStartup() "); 

        
goto WSACleanup; 

    } 

     

    server 
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);        //Create a Socket



    
if(server == INVALID_SOCKET){ 

        printf(
"Error at socket(): %ld ", WSAGetLastError()); 

        
goto WSACleanup; 

    } 

     

    pHostent 
= gethostbyname("smtp.126.com");              //Get the Mail Server 

Name 

    
if(pHostent == NULL){ 

        printf(
"The Host Name is Invalid... "); 

        
goto WSACleanup; 

    } 

     

    service.sin_family 
= AF_INET; 

    memcpy(
&service.sin_addr.s_addr, pHostent->h_addr_list[0], 

pHostent
->h_length);

    service.sin_port 
= htons(25);

 

    
//Connect to the remote Mail Server 

    retConnect 
= connect(server, (struct sockaddr*)&service, sizeof(service)); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Failed to connect. "); 

        
goto WSACleanup; 

    } 

     

    printf(
"Connect to %s.... ", inet_ntoa(service.sin_addr)); 

     

    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Failed to connect. ");     

        
goto WSACleanup;      

    }
else

        printf(
"%s ", Buffer); 

    } 

     

    
//Send "HELO Server.... " to the Mail Server 

    retConnect 
= send(server, "HELO Server.... ", strlen("HELO 

Server....
"), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send HELO to the Mail Failure. "); 

        
goto WSACleanup; 

    }
else

       printf(
"HELO Server.... ");    

    }   

     

    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Failed to connect. ");     

        
goto WSACleanup;      

    }
else

        printf(
"%s ", Buffer); 

    } 



    
//Send "AUTH LOGIN " to the Mail Server 

    retConnect 
= send(server, "AUTH LOGIN ", strlen("AUTH LOGIN "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send "AUTH LOGIN" to Mail Failure. "); 

        
goto WSACleanup; 

    }
else

        printf(
"AUTH LOGIN ");    

    }       



    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From Mail Server Failure. ");     

        
goto WSACleanup;      

    }
else{  

        printf(
"%s ", Buffer); 

    } 

   

    
//Send UserName to the Mail Server. The UserName is Encoded by Base64. 

    retConnect 
= send(server, "bGJleW9uZDRrb21h "

strlen(
"bGJleW9uZDRrb21h "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send UserName to the Mail Failure. "); 

        
goto WSACleanup; 

    }
else

        printf(
"UserName ");    

    }       

         

    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From the Mail Server Failure. ");     

        
goto WSACleanup;      

    }
else{

        printf(
"%s ", Buffer); 

    } 



    
//Send Password to the Mail Server The Password is Encoded by Base64. 

    retConnect 
= send(server, "bGJleW9uZDRrb21h "

strlen(
"bGJleW9uZDRrb21h "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send Password to Mail Failure. "); 

        
goto WSACleanup; 

    }
else

        printf(
"Password ");    

    }   

     

    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From the Mail Server Failure. ");     

        
goto WSACleanup;      

    }
else{

        printf(
"%s ", Buffer); 

    } 



    
//Send "Mail From: " File to the Mail Server, sender's Mail Address 

    retConnect 
= send(server, "MAIL FROM: <[email protected]> "

strlen(
"MAIL FROM: <[email protected]> "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send "Mail From: " to Mail Failure. "); 

        
goto WSACleanup; 

    }
else

        printf(
"MAIL FROM: <[email protected]> ");    

    }   

     

    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From Mail Server Failure. ");     

        
goto WSACleanup;      

    }
else

        Buffer[retConnect] 
= ' '

        printf(
"%s ", Buffer); 

    } 



    
//Send "RCPT TO: " File to the Mail Server, receiver 's Mail Address 

    retConnect 
= send(server, "RCPT TO: <[email protected]> ", strlen("RCPT 

TO: 
<[email protected]> "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send "RCPT TO: " to Mail Failure. "); 

        
goto WSACleanup; 

    }
else

        printf(
"RCPT TO: <[email protected]> ");    

    }   

     

    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From the Mail Server Failure. ");     

        
goto WSACleanup;      

    }
else

        printf(
"%s ", Buffer); 

    } 



    
//Send "Data" Fiele to the Mail Server, start to Send mail 

    retConnect 
= send(server, "Data ", strlen("Data "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send "Data" Field to Mail Failure... "); 

        
goto WSACleanup; 

    }
else

        printf(
"Data ");    

    }   



    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From Mail Server Failure... ");     

        
goto WSACleanup;      

    }
else{

        printf(
"%s ", Buffer); 

    } 



    
//Send Mail data to the the Mail Server 

    retConnect 
= send(server, MailData, strlen(MailData), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send Context Of Mail to Mail Failure... "); 

        
goto WSACleanup; 

    }
else

        printf(
"%s ", MailData); 

    } 



    
//Receive Data From the Mail Server 

    ZeroMemory(Buffer, 
sizeof(Buffer)); 

    retConnect 
= recv(server, Buffer, sizeof(Buffer), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Receive Data From Mail Server Failure... ");     

        
goto WSACleanup;      

    }
else

        printf(
"%s ", Buffer); 

    } 



    
//Send "QUIT" Context to the Mail Server 

    retConnect 
= send(server, "QUIT ", strlen("QUIT "), 0); 

    
if(retConnect == SOCKET_ERROR){ 

        printf(
"Send "Quit" to Mail Failure... "); 

        
goto WSACleanup; 

    }
else

        printf(
"Quit ");    

    }   

    

    printf(
"Send Mail Successful! "); 

               

    WSACleanup:{ 

        
if(server != INVALID_SOCKET){

            closesocket(server);

        } 

        WSACleanup();         

    }

    system(
"pause");

    
return 0