#ifdef WIN32
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "WS2_32.lib")
#else 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif#define DEBUG
#define MAX_LEN 100
#define INPUT_LEN 255
int smtpsock;
WSADATA wsa;//连接SMTP服务器,端口port = 25
int conn_smtp_serv(char *hostname, char *ipaddr, int *sock, int port);//与SMTP服务器断开,停止传输
int discn_smtp_serv(int *sock);//把用户的输入信息组织成符合SMTP协议的命令字符串,然后发送给SMTP服务器
int send_msg(int *sock, int order, char *msg);//接收来自SMTP服务器的字符串
int recv_msg(int *sock, char *msg);//连接SMTP服务器,端口port = 25
int conn_smtp_serv(char *hostname, char *ipaddr, int *sock, int port)
{
struct sockaddr_in saddr;

if (WSAStartup(MAKEWORD(2, 2), &wsa))
{
return 0;
}
*sock = socket(AF_INET, SOCK_STREAM, 0);
if (*sock == INVALID_SOCKET)
{
return 0;
}
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr(ipaddr);
saddr.sin_port = htons((u_short)port);
if (connect(*sock, (struct sockaddr *)&saddr, sizeof(saddr)) == SOCKET_ERROR)
{
return 0;
}
if (!send_msg(sock, 0, hostname))
{
return 0;
}
return 1;
}//与SMTP服务器断开,停止传输
int discn_smtp_serv(int *sock)
{
//断开SMTP传输通道
if (!send_msg(sock, 1, NULL))
{
return 0;
}
//关闭套接字
closesocket(*sock);
WSACleanup();
return 1;
}//把用户的输入信息组织成符合SMTP协议的命令字符串,然后发送给SMTP服务器
int send_msg(int *sock, int order, char *msg)
{
char buf[INPUT_LEN];
char recvbuf[MAX_LEN]; switch (order)
{
case 0: //HELLO host
sprintf(buf, "HELLO %s\r", msg);
break;
case 1: //QUIT
sprintf(buf, "QUIT\r", msg);
break;
case 2: //MAIL FROM:
sprintf(buf, "MAIL FROM:<%s>\r", msg);
break;
case 3: //RCPT TO:
sprintf(buf, "RCPT TO:<%s>\r", msg);
break;
case 4: //DATA
break;
case 5: //RESET
break;
case 6: //NOOP
sprintf(buf, "NOOP\r", msg);
;
}
#ifdef DEBUG
printf("\nDEBUG: %s", buf);
#endif
send(*sock, buf, sizeof(buf), 0);
recv_msg(sock, recvbuf);
#ifdef DEBUG
printf("\nDEBUG: %s", recvbuf);
#endif
if (order == 0)
{
if (!((recvbuf[0] == '2') && (recvbuf[2] == '0')))
{
return 0;
}
}
else if (order == 1)
{
if (!((recvbuf[0] == '2') && (recvbuf[2] == '1')))
{
return 0;
}
}
return 1;
}//接收来自SMTP服务器的字符串
int recv_msg(int *sock, char *msg)
{
recv(*sock, msg, MAX_LEN, 0);
return 1;
}int main(int argc, char* argv[])
{
char input[INPUT_LEN]; //连接SMTP服务
printf("\nconnecting to SMTP server...\t\t");
if (conn_smtp_serv("xf", "192.168.3.24", &smtpsock, 25))
{
printf("[OK]\n");
}
else
{
printf("[FAILED]\n");
} send_msg(&smtpsock, 6, "NOOP"); printf("\nnow begin input the mail information:\n");
printf("mail from: ");
scanf("%s", input);
send_msg(&smtpsock, 2, input);
printf("rcpt to: ");
scanf("%s", input); //断开SMTP服务
printf("\ndisconnecting from SMTP server...\t\t");
if (discn_smtp_serv(&smtpsock))
{
printf("[OK]\n");
}
else
{
printf("[FAILED]\n");
}
#ifdef WIN32
system("PAUSE");
#else
scanf("%c", &input);
#endif
return 1;
}