SMTPClient.cpp
上传用户:feituo2008
上传日期:2013-02-02
资源大小:493k
文件大小:3k
源码类别:

Email客户端

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include <stdio.h>
  3. #include "smtpclient.h"
  4. #include "tcp.h"
  5. #include "udp.h"
  6. #include "util.h"
  7. CSMTPClient::CSMTPClient(int num)
  8. : m_sd(-1)
  9. , m_port(25)
  10. {
  11. m_client_num =num;
  12. }
  13. CSMTPClient::~CSMTPClient(void)
  14. {
  15. Disconnect();
  16. }
  17. int CSMTPClient::ConnectHost(char * host, int port)
  18. {
  19. int ret =0;
  20. 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)
  21. {
  22. tcp_close(m_sd);
  23. m_sd =-1;
  24. return -10;
  25. }
  26. if(command("RSET") !=SMTP_OK)
  27. {
  28. tcp_close(m_sd);
  29. m_sd =-1;
  30. return -1;
  31. }
  32. return m_sd;
  33. }
  34. int CSMTPClient::Login(char * user, char * password)
  35. {
  36. return 0;
  37. }
  38. int CSMTPClient::command(char * fmt, ...)
  39. {
  40. if(m_sd <0) return -1;
  41. char cmd[256];
  42. va_list args;
  43. va_start(args,fmt);
  44. vsprintf(cmd, fmt, args);
  45. va_end(args);
  46. if(cmd[strlen(cmd)-1] !='n')
  47. strcat(cmd, "rn");
  48. WriteStat("command:%s", cmd);
  49. if(tcp_send(m_sd, cmd, (int)strlen(cmd), 5) !=(int)strlen(cmd)) return -1; return GetReply();
  50. }
  51. int CSMTPClient::GetReply(void)
  52. {
  53. int len=0, len_recved =0; time_t t1, t2; int able =0, code=-1;
  54. 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, "rn") != NULL) break; } WriteStat("reply:%s", m_reply); if(sscanf(m_reply, "%d", &code) !=1) return -1; return code; }
  55. int CSMTPClient::Disconnect(void)
  56. { if(m_sd >0) { //command("QUIT"); tcp_close(m_sd); m_sd =-1; } return 0; }
  57. int CSMTPClient::Rcpt(char * email_addr)
  58. {
  59. int ret;
  60. if((ret=command("RCPT TO: <%s>", email_addr)) !=SMTP_OK)
  61. return ret;
  62. return 0;
  63. }
  64. int CSMTPClient::From(char * email_addr)
  65. {
  66. int ret;
  67. if(email_addr ==NULL || email_addr[0] ==0)  // if email_addr is null, then mail from random user
  68. {
  69. if((ret =command("MAIL FROM: <%s@%s>", m_random_name, m_random_domain)) !=SMTP_OK)
  70. return ret;
  71. }
  72. else if((ret =command("MAIL FROM: <%s>", email_addr)) !=SMTP_OK)
  73. return ret;
  74. return 0;
  75. }