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

Email客户端

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "findmailthread.h"
  3. #include "util.h"
  4. DWORD WINAPI ThreadFindMail(PVOID pParam);
  5. CFindMailThread::CFindMailThread(void)
  6. : m_f_stop(0)
  7. , m_f_stopped(0)
  8. , m_thread_num(0)
  9. , m_start_pos(0)
  10. , m_sleep_sec(60)
  11. {
  12. m_hThread =NULL;
  13. m_pch ="abcdefghijklmnopqrstuvwxyz0123456789";
  14. m_pch_len =(int)strlen(m_pch+1)+1;
  15. m_pdict_buf =NULL;
  16. m_dict_lines_count =0;
  17. m_max_thread_count =1;
  18. }
  19. int CFindMailThread::Init(char *domain_name, char *mx_server, char *outfile_exist, char *outfile_nonexist, int thread_num, int max_thread_count, int start_pos, char **pdict_buf, int dict_lines_count, int sleep_sec)
  20. {
  21. m_thread_num =thread_num;
  22. m_max_thread_count =max_thread_count;
  23. m_cur_pos =m_start_pos =start_pos;
  24. m_pdict_buf =pdict_buf;
  25. m_dict_lines_count =dict_lines_count;
  26. m_sleep_sec =sleep_sec;
  27. strcpy(m_smtp_client.m_domain_name, domain_name);
  28. strcpy(m_smtp_client.m_host, mx_server);
  29. strcpy(m_outfile_exist, outfile_exist);
  30. strcpy(m_outfile_nonexist, outfile_nonexist);
  31. return 0;
  32. }
  33. CFindMailThread::~CFindMailThread(void)
  34. {
  35. Stop();
  36. }
  37. int CFindMailThread::Start(void)
  38. {
  39. DWORD id;
  40. Stop();
  41. m_f_stopped =false;
  42. m_f_stop =false;
  43. if((m_hThread =CreateThread(NULL, 0, ThreadFindMail, this, 0, &id)) ==NULL)
  44. return -1;
  45. return 0;
  46. }
  47. int CFindMailThread::Stop(void)
  48. {
  49. m_f_stop =true;
  50. if(m_hThread !=NULL)
  51. {
  52. // WaitForSingleObject(...
  53. if(m_f_stopped ==false)
  54. TerminateThread(m_hThread, 0);
  55. CloseHandle(m_hThread);
  56. m_hThread =NULL;
  57. }
  58. return 0;
  59. }
  60. // fill buf
  61. int CFindMailThread::CheckRandom(char *name, int buf_pos, int pch_pos, int count)
  62. {
  63. for(int i =pch_pos; i<m_pch_len; i++)
  64. {
  65. if(m_f_stop) return 0;
  66. if(i ==1 && buf_pos>2) i =27;
  67. name[buf_pos] =m_pch[i];
  68. if(buf_pos >0)
  69. {
  70. count =CheckRandom(name, buf_pos-1, (i>0)?1:0, count);
  71. }
  72. else
  73. {
  74. if(i >0)
  75. {
  76. //int len =(int)strlen(name);
  77. if(count >= m_start_pos && (count %m_max_thread_count ==m_thread_num))
  78. {
  79. if(name[3] ==0)
  80. CheckMail(count, name);
  81. else if(name[0] <'0' || name[0] >'9')
  82. {
  83. for(i =3; i<(int)strlen(name); i++)
  84. if(name[i] >'9' || name[i] <'0') break;
  85. if(i ==(int)strlen(name))
  86. CheckMail(count, name);
  87. else Sleep(100);
  88. //WriteStat("%d : %s", m_thread_num, name);
  89. //Sleep(1000);
  90. }
  91. else Sleep(100);
  92. }
  93. //WriteLog("%d:%s,buf_pos:%d, i:%d", count, name, buf_pos, i);
  94. }
  95. //memset(name, 0, len);
  96. m_cur_pos =count;
  97. count++;
  98. }
  99. }
  100. return count;
  101. }
  102. int CFindMailThread::CheckMail(int count, char *name)
  103. {
  104. if(m_f_stop) return 0;
  105. int ret;
  106. char email_addr[100];
  107. wsprintf(email_addr, "%s@%s", name, m_smtp_client.m_domain_name);
  108. if(count%7 ==0)
  109. {
  110. Reconnect:
  111. m_smtp_client.Disconnect();
  112. while(!m_f_stop)
  113. {
  114. if((ret =m_smtp_client.ConnectHost()) >=0) break;
  115. Sleep(1000*m_sleep_sec);
  116. }
  117. if(m_f_stop) return 0;
  118. if(m_smtp_client.From(NULL) !=0) goto Reconnect;
  119. }
  120. ret =m_smtp_client.Rcpt(email_addr);
  121. if(ret <0) goto Reconnect;
  122. if(ret ==0)
  123. WriteExistEmail(m_outfile_exist, email_addr);
  124. else if(ret ==SMTP_INVALID_USER) WriteNonexistEmail(m_outfile_nonexist, email_addr);
  125. else goto Reconnect;
  126. //m_cur_pos =count-1;
  127. return 0;
  128. }
  129. DWORD WINAPI ThreadFindMail(PVOID pParam)
  130. {
  131. CFindMailThread *pfindmail =(CFindMailThread *)pParam;
  132. char name[21];
  133. while(!pfindmail->m_f_stop)
  134. {
  135. memset(name, 0, sizeof(name));
  136. if(pfindmail->m_dict_lines_count >0)
  137. pfindmail->CheckDict();
  138. pfindmail->CheckRandom(name, 19, 0, 0);
  139. }
  140. pfindmail->m_f_stopped =true;
  141. return 0;
  142. }
  143. int CFindMailThread::CheckDict(void)
  144. {
  145. for(int i =m_thread_num; i<m_dict_lines_count; i+=m_max_thread_count)
  146. if(i >=m_start_pos) CheckMail(i, m_pdict_buf[i]);
  147. return 0;
  148. }