這個程序目前126的郵箱經測試成功發送,新浪的雖然顯示發送成功可是總也收不到,有空再慢慢實驗吧,其餘郵箱還未測試。web

程序以下:編程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <ctype.h>服務器

// Function prototype
void StreamClient(char *szServer, short nPort, char *szMessage);
// Helper macro for displaying errorssession

////////////////////////////////////////////////////////////app

int main(int argc, char **argv)
{
char hostname[255];
int nRet;
short nPort;
nPort =25;
StreamClient("smtp.126.com", nPort, "AUTH LOGIN\r\n");
return 0;
}socket

////////////////////////////////////////////////////////////tcp

void StreamClient(char *szServer, short nPort, char *szMessage)
{ide

int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;

if((host=gethostbyname(szServer))==NULL)/*取得主機IP地址*/
{
fprintf(stderr,"Gethostname error, %s\n", strerror(errno));
exit(1);
}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)/*創建SOCKET鏈接*/
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}

/* 客戶程序填充服務端的資料 */
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(nPort);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);

/* 客戶程序發起鏈接請求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)/*鏈接網站*/
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}

printf("\nStream Client connecting to server: %s on port: %d",szServer, nPort);

char szBuf[1024];
memset(szBuf,0,1024);
int nRet;
// strcpy(szBuf, "From the Client");
char buf[350]="0";
char server[250];
gethostname(server,250);
strcpy(buf, "HELO ");

strcat(buf, szServer);
strcat(buf, " \r\n");
printf("%s:::%d",buf,strlen(buf));

//
// Wait for a reply
//
nRet = recv(sockfd,szBuf,sizeof(szBuf)+1,0);  printf("\nData received OVER DATA: %s", szBuf);

nRet = send(sockfd, buf, strlen(buf), 0);printf("\nsend %s",buf);
nRet = recv(sockfd, szBuf, sizeof(szBuf), 0); printf("\nData received2: %s", szBuf);

//發送準備登錄信息
nRet = send(sockfd, "AUTH LOGIN\r\n", strlen("AUTH LOGIN\r\n"), 0);
nRet = recv(sockfd, szBuf, sizeof(szBuf), 0); printf("\nData received LOGIN: %s", szBuf);

//發送用戶名和密碼,這裏的用戶名和密碼必須用base64進行轉碼,發送轉碼之後的字符串,對於126郵箱來講用戶名是@前面的字符串
nRet = send(sockfd,"轉碼後的用戶名\r\n", strlen("轉碼後的用戶名\r\n"),0);printf("\nData Send USERNAME");
nRet = recv(sockfd, szBuf, sizeof(szBuf),0);printf("\nData received USERNAME: %s", szBuf);printf("\nData Send PASS");

//發送用戶密碼
nRet = send(sockfd,"轉碼後的密碼\r\n", strlen("轉碼後的密碼\r\n"), 0);
//printf("\nData Send PASS");
nRet = recv(sockfd, szBuf, sizeof(szBuf),0); printf("\nData received USERPASSWORD: %s", szBuf);

//發送[發送郵件]的信箱(改爲你的郵箱!),該郵箱要與用戶名一致,不然發送不成功
send(sockfd,"MAIL FROM: <server_ip_alert@126.com>\r\n",strlen("MAIL FROM: <server_ip_alert@126.com>\r\n"),0);printf("\nsend MAIL FROM\n");
nRet = recv(sockfd, szBuf, sizeof(szBuf), 0);printf("\nData received MAILFROM: %s", szBuf);

//發送[接收郵件]的郵箱
nRet= send(sockfd,"RCPT TO: <tootoogo@hotmail.com>\r\n",strlen("RCPT TO: <tootoogo@hotmail.com>\r\n"),0);printf("\nsend RCPT TO\r\n");
nRet = recv(sockfd, szBuf, sizeof(szBuf), 0);   printf("\nData received TO MAIL: %s", szBuf);
/*
nRet= send(sockfd,"RCPT TO: <server_ip_alert@hotmail.com>\r\n",strlen("RCPT TO: <server_ip_alert@hotmail.com>\r\n"),0);printf("\nsend RCPT TO\r\n");
nRet = recv(sockfd, szBuf, sizeof(szBuf), 0);   printf("\nData received TO MAIL: %s", szBuf);
*/
char MailData[] ="From: \"server_ip_alert@sina.com\"<server_ip_alert@sina.com>\r\nTo: tootoogo@hotmail.com\r\nSubject: IP Address\r\n\r\n"; //主題能夠改爲別的

//各訴郵件服務器,準備發送郵件內容

send(sockfd,"DATA\r\n", strlen("DATA\r\n"),0);printf("\nsend DATA\n");
//  nRet = recv(sockfd, szBuf, sizeof(szBuf)+1, 0); printf("\nData receivedSEND DATA: %s", szBuf);
//發送郵件標題
send(sockfd,MailData, strlen(MailData),0);
//發送郵件內容
send(sockfd,"test!!!!\r\n", strlen("abcdefg\r\n"),0);//我隨便寫了幾個字符進行測試
//發送郵件結束
send(sockfd,"\r\n.\r\n", strlen("\r\n.\r\n"),0);
//接收郵件服務器返回信息
nRet = recv(sockfd,szBuf,sizeof(szBuf),0);  printf("\nData received OVER DATA: %s", szBuf);
send(sockfd,"QUIT\r\n", strlen("QUIT\r\n"),0);
nRet = recv(sockfd,szBuf,sizeof(szBuf),0);  printf("\nData received QUIT: %s", szBuf);

//
// Display the received data
//
//printf("\nData received3: %s", szBuf);

close(sockfd);
return;
}