88250 发表于 2006-9-12 09:04:07

贴个C写的邮件发送程序吧。。。。

放假的时候写的。。。。呵呵。。。。
参考资料:《HowTo.SMTP》,《SendMail》(NextFly写的),《MSDN 2005》
好了,废话就不说了。下面是源代码:


#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
const char *MailData = "From: \"88250\"<dl88250@126.com>\r\n"
                        "Subject: This is only a test mail! ^^\r\n.\r\n";
int main(int argc, char *argv[])
{
   
    WSADATA wsaData;
      WORD wVersionRequested = MAKEWORD(2, 2);
    struct hostent *pHostent = NULL;
    SOCKET server = INVALID_SOCKET;
    struct sockaddr_in service;
    int retConnect = 0;
    char Buffer = {0};
   
      if(WSAStartup(wVersionRequested, &wsaData) != 0){
                printf("Error at WSAStartup()\n");
                goto WSACleanup;
    }
   
    server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);      //Create a Socket

    if(server == INVALID_SOCKET){
                printf("Error at socket(): %ld\n", WSAGetLastError());
      goto WSACleanup;
    }
   
    pHostent = gethostbyname("smtp.126.com");            //Get the Mail Server Name
    if(pHostent == NULL){
                printf("The Host Name is Invalid...\n");
      goto WSACleanup;
    }
   
    service.sin_family = AF_INET;
    memcpy(&service.sin_addr.s_addr, pHostent->h_addr_list, 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.\n");
      goto WSACleanup;
    }
   
    printf("Connect to %s....\n", 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.\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", Buffer);
    }
   
    //Send "HELO Server....\r\n" to the Mail Server
    retConnect = send(server, "HELO Server....\r\n", strlen("HELO Server....\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send HELO to the Mail Failure.\n");
      goto WSACleanup;
    }else{
         printf("HELO Server....\n");   
    }   
   
    //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.\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", Buffer);
    }

    //Send "AUTH LOGIN\r\n" to the Mail Server
    retConnect = send(server, "AUTH LOGIN\r\n", strlen("AUTH LOGIN\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send \"AUTH LOGIN\" to Mail Failure.\n");
      goto WSACleanup;
    }else{
                printf("AUTH LOGIN\n");   
    }      

    //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.\n");   
      goto WSACleanup;      
    }else{
                printf("%s\n", Buffer);
    }
   
    //Send UserName to the Mail Server. The UserName is Encoded by Base64.
    retConnect = send(server, "bGJleW9uZDRrb21h==\r\n", strlen("bGJleW9uZDRrb21h==\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send UserName to the Mail Failure.\n");
      goto WSACleanup;
    }else{
                printf("UserName\n");   
    }      
         
    //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.\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", Buffer);
    }

    //Send Password to the Mail Server The Password is Encoded by Base64.
    retConnect = send(server, "bGJleW9uZDRrb21h=\r\n", strlen("bGJleW9uZDRrb21h=\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send Password to Mail Failure.\n");
      goto WSACleanup;
    }else{
                printf("Password\n");   
    }   
   
    //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.\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", Buffer);
    }

    //Send "Mail From: " File to the Mail Server, sender's Mail Address
    retConnect = send(server, "MAIL FROM: <lbeyond4koma@126.com>\r\n", strlen("MAIL FROM: <lbeyond4koma@126.com>\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send \"Mail From: \" to Mail Failure.\n");
      goto WSACleanup;
    }else{
                printf("MAIL FROM: <lbeyond4koma@126.com>\n");   
    }   
   
    //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.\n");   
      goto WSACleanup;      
    }else{
                Buffer = ' ';
      printf("%s\n", Buffer);
    }

    //Send "RCPT TO: " File to the Mail Server, receiver 's Mail Address
    retConnect = send(server, "RCPT TO: <dl88250@gmail.com>\r\n", strlen("RCPT TO: <dl88250@gmail.com>\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send \"RCPT TO: \" to Mail Failure.\n");
      goto WSACleanup;
    }else{
                printf("RCPT TO: <dl88250@gmail.com>\n");   
    }   
   
    //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.\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", Buffer);
    }

    //Send "Data" Fiele to the Mail Server, start to Send mail
    retConnect = send(server, "Data\r\n", strlen("Data\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send \"Data\" Field to Mail Failure...\n");
      goto WSACleanup;
    }else{
                printf("Data\n");   
    }   

    //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...\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", 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...\n");
      goto WSACleanup;
    }else{
                printf("%s\n", 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...\n");   
      goto WSACleanup;      
    }else{
      printf("%s\n", Buffer);
    }

    //Send "QUIT" Context to the Mail Server
    retConnect = send(server, "QUIT\r\n", strlen("QUIT\r\n"), 0);
    if(retConnect == SOCKET_ERROR){
                printf("Send \"Quit\" to Mail Failure...\n");
      goto WSACleanup;
    }else{
                printf("Quit\n");   
    }   
   
    printf("Send Mail Successful!\n");
               
      WSACleanup:{
                if(server != INVALID_SOCKET){
                        closesocket(server);
      }
      WSACleanup();         
      }
    system("pause");
      return 0;
}

其中需要注意的是寄件人地址与邮件内容里的邮件地址的关系:

寄件人的地址必须和你用的连接帐号一致。帐号和密码是使用Base64编码的(关于什么是Base64编码请到http://www.ynutx.net/blog/user1/Myth/archives/2006/1682.html下面看看,它的C实现代码在下面)。。。。

而在邮件内容里的地址只是一个告诉邮件服务器这封信是谁发的。可以和你所使用的发送帐号不一致!也就是说你可以伪造别人的地址进行邮件发送。。。。

哎,不要干什么干事哟^_^! 看邮件头是可以看出原始地址的哦:10:

雨夜心情 发表于 2006-9-12 09:05:04

有没有下载地址~~咳咳~~弄下来玩玩

88250 发表于 2006-9-12 09:55:52

原帖由 雨夜心情 于 2006-9-12 09:05 发表
有没有下载地址~~咳咳~~弄下来玩玩
下载地址?
我写的。。。。这个是。。。。
你要.exe文件吗?

地狱幻想 发表于 2006-9-12 10:14:43

哈哈,楼主好厉害哦

雨夜心情 发表于 2006-9-12 10:56:14

肯定的嘛,要程序来干嘛~~我们是实用主义~~只喜欢用~~我帮你测试一下,给你些意见~~

88250 发表于 2006-9-12 16:18:23

这个是可执行文件。。。。

雨夜心情 发表于 2006-9-12 18:26:13

下载了~~3Q~~~

88250 发表于 2006-9-12 21:23:19

- -!
页: [1]
查看完整版本: 贴个C写的邮件发送程序吧。。。。