仿照,SMTP协议初探(一)--我的前一篇博客,结合网上的材料,利用socket,写了个Linux下c编程实现的发邮件程序。
大家可以拿自己的邮箱去做实验啦,base64是一种编码方式,网上可以找到一个网页,可以查询密码的base64编码是多少。当然也可以自己手工计算(我没试过)。
具体源码如下:
//#include<iostream> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> //using namespace std; #define EHLO "EHLO ***\r\n" //***为邮箱用户名 #define DATA "data\r\n" #define QUIT "QUIT\r\n" //#define h_addr h_addr_list[0] //FILE *fin; int sock; struct sockaddr_in server; struct hostent *hp, *gethostbyname(); char buf[BUFSIZ+1]; int len; char *host_id="smtp.126.com"; char *from_id="***@126.com"; char *to_id="60462****@qq.com"; char *sub="testmail\r\n"; char wkstr[100]="hello how r u\r\n"; /*=====Send a string to the socket=====*/ void send_socket(char *s) { write(sock,s,strlen(s)); //write(1,s,strlen(s)); //printf("Client:%s\n",s); } //=====Read a string from the socket=====*/ void read_socket() { len = read(sock,buf,BUFSIZ); write(1,buf,len); //printf("Server:%s\n",buf); } /*=====MAIN=====*/ int main(int argc, char* argv[]) { /*=====Create Socket=====*/ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock==-1) { perror("opening stream socket"); //exit(1); return 1; } else //cout << "socket created\n"; printf("socket created\n"); /*=====Verify host=====*/ server.sin_family = AF_INET; hp = gethostbyname(host_id); if (hp==(struct hostent *) 0) { fprintf(stderr, "%s: unknown host\n", host_id); //exit(2); return 2; } /*=====Connect to port 25 on remote host=====*/ memcpy((char *) &server.sin_addr, (char *) hp->h_addr, hp->h_length); server.sin_port=htons(25); /* SMTP PORT */ if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1) { perror("connecting stream socket"); //exit(1); return 1; } else //cout << "Connected\n"; printf("Connected\n"); /*=====Write some data then read some =====*/ read_socket(); /* SMTP Server logon string */ send_socket(EHLO); /* introduce ourselves */ read_socket(); /*Read reply */ /* **added by fupeng */ send_socket("AUTH LOGIN"); send_socket("\r\n"); read_socket(); send_socket("*******");//用户名的base64编码 send_socket("\r\n"); read_socket(); send_socket("******");//密码的base64编码 send_socket("\r\n"); read_socket(); send_socket("mail from <"); send_socket(from_id); send_socket(">"); send_socket("\r\n"); read_socket(); /* Sender OK */ //send_socket("VRFY "); //send_socket(from_id); //send_socket("\r\n"); //read_socket(); // Sender OK */ send_socket("rcpt to <"); /*Mail to*/ send_socket(to_id); send_socket(">"); send_socket("\r\n"); read_socket(); // Recipient OK*/ send_socket(DATA);// body to follow*/ read_socket(); //send_socket("from:***@126.com"); send_socket("subject:"); send_socket(sub); //read_socket(); // Recipient OK*/ send_socket("\r\n\r\n"); send_socket(wkstr); send_socket(".\r\n"); read_socket(); send_socket(QUIT); /* quit */ read_socket(); // log off */ //=====Close socket and finish=====*/ close(sock); //exit(0); return 0; }
具体结果如下图片所示: