www.pudn.com > FindMail.zip > SMTPClient.cpp
#include "StdAfx.h" #include#include "smtpclient.h" #include "tcp.h" #include "udp.h" #include "util.h" CSMTPClient::CSMTPClient(int num) : m_sd(-1) , m_port(25) { m_client_num =num; } CSMTPClient::~CSMTPClient(void) { Disconnect(); } int CSMTPClient::ConnectHost(char * host, int port) { int ret =0; if(port !=25) m_port =port; if(host !=NULL) strcpy(m_host, host); Sleep(100*((m_client_num+1)%10)); if((m_sd =tcp_connect(m_host, m_port, 15, false)) <0) return -1; if(GetReply() !=SMTP_WELCOME) { tcp_close(m_sd); m_sd =-1; return -10; } int r; srand((unsigned int)time(NULL)+m_client_num); for(int i =0; i<9; i++) { r =rand()%(int)('z'-'a'); m_random_name[i] ='a' +r; } m_random_name[i] =0; for(i=0; i<4; i++) { r =rand()%(int)('z'-'d'); m_random_domain[i] ='d' +r; } m_random_domain[i] =0; strcat(m_random_domain, ".com"); if((ret =command("HELO %s", m_random_name)) != SMTP_OK) { tcp_close(m_sd); m_sd =-1; return -10; } if(command("RSET") !=SMTP_OK) { tcp_close(m_sd); m_sd =-1; return -1; } return m_sd; } int CSMTPClient::Login(char * user, char * password) { return 0; } int CSMTPClient::command(char * fmt, ...) { if(m_sd <0) return -1; char cmd[256]; va_list args; va_start(args,fmt); vsprintf(cmd, fmt, args); va_end(args); if(cmd[strlen(cmd)-1] !='\n') strcat(cmd, "\r\n"); WriteStat("command:%s", cmd); if(tcp_send(m_sd, cmd, (int)strlen(cmd), 5) !=(int)strlen(cmd)) return -1; return GetReply(); } int CSMTPClient::GetReply(void) { int len=0, len_recved =0; time_t t1, t2; int able =0, code=-1; m_reply[0] =0; time(&t1); while(1) { time(&t2); if(difftime(t2, t1) >60) { WriteStat("timeout ..."); break; // max wait time: 15 seconds } len =tcp_recv(m_sd, &m_reply[len_recved], 1, 1); //len =recv(m_sd, &m_reply[len_recved], 1, 0); if (len ==SOCKET_ERROR) { if(WSAGetLastError() ==WSAEWOULDBLOCK) { Sleep(100); continue; } WriteStat("error=%d", WSAGetLastError()); m_reply[len_recved] = 0; return -1; } if(len ==0) { WriteStat("len ==0, err=%d", WSAGetLastError()); break; } len_recved ++; m_reply[len_recved] =0; if(strstr(m_reply, "\r\n") != NULL) break; } WriteStat("reply:%s", m_reply); if(sscanf(m_reply, "%d", &code) !=1) return -1; return code; } int CSMTPClient::Disconnect(void) { if(m_sd >0) { //command("QUIT"); tcp_close(m_sd); m_sd =-1; } return 0; } int CSMTPClient::Rcpt(char * email_addr) { int ret; if((ret=command("RCPT TO: <%s>", email_addr)) !=SMTP_OK) return ret; return 0; } int CSMTPClient::From(char * email_addr) { int ret; if(email_addr ==NULL || email_addr[0] ==0) // if email_addr is null, then mail from random user { if((ret =command("MAIL FROM: <%s@%s>", m_random_name, m_random_domain)) !=SMTP_OK) return ret; } else if((ret =command("MAIL FROM: <%s>", email_addr)) !=SMTP_OK) return ret; return 0; }