亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現郵件群發的方法

2020-05-23 14:19:15
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C++實現郵件群發的方法,較為詳細的分析了郵件發送的原理與C++相關實現技巧,非常具有實用價值,需要的朋友可以參考下

本文實例講述了C++實現郵件群發的方法。分享給大家供大家參考。具體如下:

關于生成隨機QQ郵箱不精確的問題,在之后版本打算另寫一個采集器插件進行帳號采集,所以,這個軟件只用來進行內容發送,郵箱進行隨機生成

如果你已經有采集來的QQ號,請復制到SendList.txt 替換內容即可

可以直接復制HTML代碼到郵件內容,保存即可。目前郵件內容最大設置為10000字節,如果有增大的必要,歡迎提交留言。

這是我學習后VC編程中涉及到多線程,socket,及一些WINDOWS API的宗合應用

使用說明:

一、SMTP設置

1、SMTP設置中,收件箱地址:填寫郵箱地址為帳號測試郵箱,可以填寫你自己的郵箱作為接收測試。打星號為必填。郵箱帳號及密碼,是即將用于群發的帳號和密碼

2、群發發送時間間隔,默認為零,可以選擇填寫發送間隔時間,單位為秒,防止多次快速發送相同內容被停用。

3、勾選郵件標題后插入系統時間,可以在標題上加上系統時間

4、導入群發列表,勾選后,可以點擊群發,暫停,繼續。(群發列表為程序目錄中SendList.txt)如果你有郵箱采集軟件,可以把彩集的郵箱地址按照格式,一行一個,放入其中),沒有的話,可以點擊“收件箱”頁面生成隨機QQ郵箱

二、郵件內容

1、填寫郵件標題,郵件內容可以為純文本,也可以是HTML代碼,附件目前只支持TXT文本。

2、群發前,請測試郵件內容,是否完整。附件是否正常接收。

三、收件箱

1、收件箱中順序生成QQ郵箱,請不要超過6位數QQ號,位數過大,生成時間過長,容易造成假死。

2、群發前,先生成QQ郵箱列表。如果你有采集郵箱帳號,可以按格式放入SendList.txt 中

版本更新說明:

1、可增加多個附件。

2、修復標題插入日期造成程序崩潰的BUG。

3、增加發送間隔時間選項。

4、支持HTML代碼

5、增加干預碼

 

 
  1. #include "stdafx.h" 
  2. #include <windows.h> 
  3. #include <windowsx.h> 
  4. #include "Resource.h" 
  5. #include "TabDlg1.h" 
  6. #include "winsock2.h" 
  7. #define MAXSTRING 10000 
  8. static int flag=0; //標記是否群發 
  9. TCHAR* pTitle = NULL; //指向標題文件內容的指針 
  10. HANDLE hThread=NULL; //線程返回句柄 
  11. long i=0; //列表控件“行”計數 
  12. static long sendNum=1; //發送郵件數量 
  13. #pragma comment(lib,"WSOCK32.LIB") 
  14. extern TCHAR tcRunPath[MAX_PATH]; //程序當前路徑目錄 
  15. extern TCHAR shortPath[MAX_PATH]; //文件路徑,TAB2中的全局變量 
  16. extern TCHAR titlePath[256]; //郵件標題文件路徑 
  17. extern TCHAR mtPath[256]; //郵件內容文件路徑 
  18. extern TCHAR sendListPath[MAX_PATH]; //發送列表文件路徑 
  19. extern BOOL attach; //是否添加了附件 
  20. extern TCHAR file[MAXSTRING]; //附件部份代碼 
  21. BOOL WINAPI TAB1_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
  22. switch(uMsg) 
  23. HANDLE_MSG(hWnd, WM_INITDIALOG, TAB1_OnInitDialog); 
  24. HANDLE_MSG(hWnd, WM_COMMAND, TAB1_OnCommand); 
  25. HANDLE_MSG(hWnd,WM_CLOSE, TAB1_OnClose); 
  26. return FALSE; 
  27. BOOL TAB1_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) 
  28. InitLVColumn(hwnd); 
  29. InitComboBox(hwnd); 
  30. return TRUE; 
  31. void TAB1_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 
  32. {  
  33. IsChecked(hwnd); //判斷勾選框是否被勾選 
  34. IsRadioChecked(hwnd); //RADIO控件是否被選擇 
  35. switch(id) 
  36. case IDC_MAIL_TEST: 
  37. {  
  38. if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED && IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED) 
  39. MessageBox(hwnd,TEXT("請選擇發QQ郵箱或163信箱"),"",MB_OK); 
  40. return
  41. else 
  42. flag=0; 
  43. hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0); 
  44. break
  45. case IDC_BUTTON_START: 
  46. {  
  47. if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED && IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED) 
  48. MessageBox(hwnd,TEXT("請選擇發QQ郵箱或163信箱"),"",MB_OK); 
  49. return
  50. else 
  51. flag=1; 
  52. hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0); 
  53. break
  54. case IDC_BUTTON_PAUSE: 
  55. {  
  56. if(NULL!=hThread) 
  57. SuspendThread(hThread);  
  58. else 
  59. return
  60. break
  61. case IDC_BUTTON_RESUME: 
  62. {  
  63. if(NULL!=hThread) 
  64. ResumeThread(hThread);  
  65. else 
  66. return
  67. break
  68. default
  69. break
  70. void TAB1_OnClose(HWND hwnd) 
  71. EndDialog(hwnd, 0); 
  72. int InitLVColumn(HWND hwnd) //列表初始化設置,視圖選為報表視圖 
  73. LVCOLUMN lvColumn; 
  74. MyLVColumn MyColumn[2] = {{TEXT("編號"), 0x30, LVCFMT_CENTER},{TEXT("郵箱帳號"), 0x99, LVCFMT_CENTER}}; 
  75. lvColumn.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH|LVCF_SUBITEM; 
  76. DWORD dwStyle =ListView_GetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST)); //得到列表當前拓展風格 
  77. dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(只適用與report風格的listctrl) 
  78. dwStyle |= LVS_EX_GRIDLINES; //網格線(只適用與report風格的listctrl) 
  79. // dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件 
  80. ListView_SetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST),dwStyle); //設置列表擴展風格 
  81. for(int i = 0; i < 2; i++) 
  82. lvColumn.pszText = MyColumn[i].szColumnName; 
  83. lvColumn.cx = MyColumn[i].cx; 
  84. lvColumn.fmt = MyColumn[i].fmt; 
  85. SendDlgItemMessage(hwnd, IDC_LIST, LVM_INSERTCOLUMN, i, (LPARAM)&lvColumn); 
  86.  
  87. return 0; 
  88. int InitComboBox(HWND hwnd)//窗口控件初始化設置 
  89. HWND hwndCombo=GetDlgItem(hwnd,IDC_COMBO_SLEEPTIME); 
  90. ComboBox_InsertString(hwndCombo,-1,TEXT("0")); 
  91. ComboBox_InsertString(hwndCombo,-1,TEXT("1")); 
  92. ComboBox_InsertString(hwndCombo,-1,TEXT("2")); 
  93. ComboBox_InsertString(hwndCombo,-1,TEXT("5")); 
  94. ComboBox_InsertString(hwndCombo,-1,TEXT("10")); 
  95. ComboBox_InsertString(hwndCombo,-1,TEXT("20")); 
  96. ComboBox_SetText(hwndCombo,TEXT("0")); 
  97. SetDlgItemText(hwnd,IDC_EDIT_MAILADD,TEXT("12345678@qq.com")); 
  98. ComboBox_InsertString(GetDlgItem(hwnd,IDC_COMBO_SMTP),0,TEXT("smtp.qq.com")); 
  99. ComboBox_InsertString(GetDlgItem(hwnd,IDC_COMBO_SMTP),1,TEXT("smtp.163.com")); 
  100. ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com")); 
  101. SetDlgItemText(hwnd,IDC_EDIT_MAILPORT,TEXT("25"));  
  102. SetDlgItemText(hwnd,IDC_EDIT_USERNAME,TEXT("")); 
  103.  
  104. return 1; 
  105. int IsChecked(HWND hwnd) //checkbox未選中的設置為只讀 
  106. if(IsDlgButtonChecked(hwnd,IDC_CHECK_QUNFA)!=BST_CHECKED) 
  107. EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_START), false); 
  108. EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_RESUME), false); 
  109. EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_PAUSE), false); 
  110. return 0; 
  111. else 
  112. EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_START), true); 
  113. EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_RESUME), true); 
  114. EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_PAUSE), true); 
  115. return 1; 
  116. return 0; 
  117. int IsRadioChecked(HWND hwnd) //RADIO控件被選中,則設置相應的SMTP 地址 
  118. if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) 
  119. ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com")); 
  120. return 1; 
  121. if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) 
  122. ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.163.com")); 
  123. return 2; 
  124. return 0; 
  125. TCHAR* readText1(HWND hwnd) //讀取文件--郵件發送內容 
  126. int nLen = 0; 
  127. FILE *pF = fopen(titlePath , "r"); //打開文件 
  128. fseek(pF, 0, SEEK_END); //文件指針移到文件尾 
  129. nLen = ftell(pF); //得到當前指針位置, 即是文件的長度 
  130. rewind(pF); //文件指針恢復到文件頭位置 
  131. pTitle = (char*) malloc(sizeof(char)*nLen+1);//動態申請空間, 為保存字符串結尾標志/0, 多申請一個字符的空間 
  132. if(!pTitle) 
  133. MessageBox(hwnd,TEXT("內存不夠!"),"錯誤",MB_ICONWARNING); 
  134. exit(0); 
  135. nLen = fread(pTitle, sizeof(char), nLen, pF); 
  136. pTitle[nLen] = '/0'//添加字符串結尾標志 
  137. if(IsDlgButtonChecked(hwnd,IDC_CHECK_TITLE)==BST_CHECKED) //是否勾選在郵件標題 加入系統當前時間 
  138. SYSTEMTIME stLocal; 
  139. GetLocalTime(&stLocal); //得到系統當前時間 
  140. TCHAR strTime[256]; 
  141. ZeroMemory(strTime,sizeof(strTime)/sizeof(TCHAR)); 
  142. wsprintf(strTime,"%04u-%02u-%02u %02u:%02u:%02u",stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond); 
  143. strcat(pTitle,strTime); //在標題后加入系統時間 
  144. fclose(pF); //關閉文件 
  145. TCHAR* pText = NULL; 
  146. pF = fopen(mtPath , "r"); //打開文件 
  147. fseek(pF, 0, SEEK_END);  
  148. nLen = ftell(pF);  
  149. rewind(pF);  
  150. pText = (char*) malloc(sizeof(char)*nLen+1); //動態申請空間, 為保存字符串結尾標志/0, 多申請一個字符的空間 
  151. if(!pText) 
  152. MessageBox(hwnd,TEXT("內存不夠!"),"錯誤",MB_ICONWARNING); 
  153. exit(0); 
  154. nLen = fread(pText, sizeof(char), nLen, pF); 
  155. pText[nLen] = '/0'//添加字符串結尾標志 
  156. fclose(pF); //關閉文件 
  157. TCHAR chText[MAXSTRING];  
  158. TCHAR* encText=base64_encode(pText,strlen(pText));  
  159. strcpy(chText,encText); //BASE64加密結果 
  160. free(encText); //釋放指針 
  161. free(pText); //釋放空間 
  162. return chText; 
  163. DWORD WINAPI ThreadFunc(LPVOID lpParam)//發郵件線程 
  164. HWND hwnd=(HWND)lpParam; 
  165. TCHAR userName[256]; //用戶帳號 
  166. TCHAR userPassWord[256]; //用戶密碼 
  167. GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userName,sizeof(userName)/sizeof(TCHAR)); 
  168. GetDlgItemText(hwnd,IDC_EDIT_USERPASSWORD,userPassWord,sizeof(userPassWord)/sizeof(TCHAR)); 
  169. TCHAR *name=userName;  
  170. int i = 0;  
  171. int j = strlen(name);  
  172. TCHAR *encName = base64_encode(name, j); //給用戶名base64加密編碼  
  173. ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR));  
  174. wsprintf(userName,"%s/n", encName); //在加編碼后加入回車符 
  175. TCHAR *passWord=userPassWord;  
  176. int k = strlen(passWord);  
  177. TCHAR *encPassWord = base64_encode(passWord, k); //給用戶密碼base64加密編碼  
  178. // int len = strlen(enc);  
  179. // TCHAR *dec = base64_decode(enc, len); //反編  
  180. ZeroMemory(userPassWord,sizeof(userPassWord)/sizeof(TCHAR));  
  181. wsprintf(userPassWord,"%s/n", encPassWord); 
  182. /*ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR));  
  183. wsprintf(userName,"/ndecoded : %s", dec); 
  184. MessageBox(hwnd,userName,"",MB_OK);*/ //反編譯用戶名,如果需要,可以把用戶名密碼反編后發到指定郵箱。 
  185. free(encName); //釋放指針 
  186. free(encPassWord); 
  187. //free(dec);  
  188. if(1==flag) //全局標記,點擊群發還是測試,1為群發,0為測試 
  189. HANDLE wFile; 
  190. int szId; 
  191. TCHAR ch; 
  192. TCHAR szState[256]; 
  193. strcpy(sendListPath,tcRunPath); 
  194. strcat(sendListPath,"//SendList.txt"); //拼接全路徑及文件名 
  195. TCHAR *sFileName=sendListPath; 
  196. FILE *fp=fopen(sFileName,"r"); 
  197. if(fp==NULL) 
  198. return FALSE; //打開文件失敗,則返回,不讀取 
  199. fseek(fp, 0, SEEK_END); 
  200. int length = ftell(fp); //length為0,則是空的 
  201. rewind(fp); //把指針移回文件頭部 還可以用 fseek(fp, 0, SEEK_SET);效果一樣 
  202. if(length==0) //判斷文件如果為空,則關閉文件,返回, 
  203. fclose(fp); //要關閉打開的文件,不然退出時,無法保存 
  204. return FALSE; 
  205. while(!feof(fp)) 
  206. {  
  207. fscanf(fp,"%s/r/n",szState); 
  208. SocketQ(hwnd,userName,userPassWord,szState); 
  209. TCHAR sTime[256];  
  210. unsigned long iTime; 
  211. ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SLEEPTIME),sTime,sizeof(sTime)/sizeof(TCHAR)); 
  212. iTime=atoi(sTime); 
  213. iTime=iTime*1000; 
  214. Sleep(iTime); 
  215. }  
  216. fclose(fp); 
  217. else 
  218. Socket(hwnd,userName,userPassWord);  
  219. CloseHandle(hThread);  
  220. return 0; 
  221. void SocketQ(HWND hwnd,TCHAR userName[],TCHAR userPassWord[],TCHAR szState[])//傳入加密的用戶名跟密碼連接163 
  222. /******************************************************************* 
  223. 使用Socket的程序在使用Socket之前必須調用WSAStartup函數。 
  224. 該函數的第一個參數指明程序請求使用的Socket版本, 
  225. 其中高位字節指明副版本、低位字節指明主版本; 
  226. 操作系統利用第二個參數返回請求的Socket的版本信息。 
  227. 當一個應用程序調用WSAStartup函數時,操作系統根據請求的Socket版本來搜索相應的Socket庫, 
  228. 然后綁定找到的Socket庫到該應用程序中。 
  229. 以后應用程序就可以調用所請求的Socket庫中的其它Socket函數了。 
  230. 該函數執行成功后返回0。 
  231. *****************************************************************/ 
  232. TCHAR* pText; 
  233. pText = readText1(hwnd); 
  234. int WSA_return; 
  235. WSADATA wsaData;  
  236. WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData); //初始化Socket庫  
  237. SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//創建SOCKET 
  238. hostent* host = NULL;  
  239. SOCKADDR_IN sa; 
  240. sa.sin_family=AF_INET; //設置電線連接服務器端的端口 
  241. TCHAR cPort[100]; 
  242. GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR)); 
  243. int iPort=atoi(cPort); 
  244. sa.sin_port = htons(iPort);  
  245. //sa.sin_addr.S_un.S_addr = inet_addr("123.58.178.203");//可以寫死IP地址  
  246. HOSTENT *host_entry; //存放主機域名,如smtp.qq.com 
  247. TCHAR host_name[256]=""
  248. ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR));  
  249. ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR)); 
  250. TCHAR str_ipAdd[256]; 
  251. if(WSA_return==0) 
  252. host_entry=gethostbyname(host_name); // 要解析的域名或主機名  
  253. if(host_entry!=NULL) 
  254. wsprintf(str_ipAdd,"%d.%d.%d.%d"
  255. (host_entry->h_addr_list[0][0]&0x00ff), 
  256. (host_entry->h_addr_list[0][1]&0x00ff), 
  257. (host_entry->h_addr_list[0][2]&0x00ff), 
  258. (host_entry->h_addr_list[0][3]&0x00ff)); 
  259.  
  260. sa.sin_addr.S_un.S_addr = inet_addr(str_ipAdd); //得到域名IP地址 
  261. if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR) 
  262. ShowError(); 
  263. return
  264. TCHAR buffer[256]; //對話過程  
  265. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
  266. int iRet=recv(sock,buffer,256,0); //接收問候語  
  267. if(SOCKET_ERROR==iRet) 
  268. ShowError();  
  269. return
  270. TCHAR Hello[] = "HELO SMTP/r/n"//注意不能忘了末尾的回車  
  271. send(sock,Hello,lstrlen(Hello),0);  
  272. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  273. iRet=recv(sock,buffer,256,0); 
  274. if(SOCKET_ERROR==iRet) 
  275. ShowError();  
  276. return
  277. TCHAR Ehlo[] = "EHLO SMTP/r/n";  
  278. send(sock,Ehlo,lstrlen(Ehlo),0);  
  279. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  280. iRet=recv(sock,buffer,256,0); 
  281. if(SOCKET_ERROR==iRet) 
  282. ShowError();  
  283. return
  284. TCHAR login[] = "AUTH LOGIN/r/n"//登陸命令 
  285. send(sock,login,lstrlen(login),0);  
  286. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  287. iRet=recv(sock,buffer,256,0); 
  288. if(SOCKET_ERROR==iRet) 
  289. ShowError();  
  290. return
  291. if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) 
  292. strcat(userName,"/r/n"); 
  293. send(sock,userName,lstrlen(userName),0); //發送加密的用戶名 
  294. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  295. iRet=recv(sock,buffer,256,0); 
  296. if(SOCKET_ERROR==iRet) 
  297. ShowError();  
  298. return
  299. strcat(userPassWord,"/r/n"); 
  300. send(sock,userPassWord,lstrlen(userPassWord),0); //發送加密的密碼 
  301. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  302. iRet=recv(sock,buffer,256,0); 
  303. if(SOCKET_ERROR==iRet) 
  304. ShowError();  
  305. return
  306. if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) 
  307. send(sock,userName,lstrlen(userName),0); //發送加密的用戶名 
  308. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  309. iRet=recv(sock,buffer,256,0); 
  310. if(SOCKET_ERROR==iRet) 
  311. ShowError();  
  312. return
  313. send(sock,userPassWord,lstrlen(userPassWord),0); //發送加密的密碼 
  314. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  315. iRet=recv(sock,buffer,256,0); 
  316. if(SOCKET_ERROR==iRet) 
  317. ShowError();  
  318. return
  319. TCHAR userF[256]; 
  320. TCHAR userL[256]; 
  321. TCHAR temp[256]; 
  322. GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userF,sizeof(userF)/sizeof(TCHAR));  
  323. ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),temp,sizeof(host_name)/sizeof(TCHAR)); 
  324. strcat(userF,"@"); 
  325. strncpy(userL,temp+5,sizeof(userL)); 
  326. strcat(userF,userL); 
  327. TCHAR mailFrom[256]; 
  328. //MessageBox(hwnd,userF,"",MB_OK); 
  329. wsprintf(mailFrom,TEXT("MAIL FROM:<%s>/r/n"),userF); 
  330. send(sock,mailFrom,lstrlen(mailFrom),0); 
  331. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  332. iRet=recv(sock,buffer,256,0); 
  333. if(SOCKET_ERROR==iRet) 
  334. ShowError();  
  335. return
  336. TCHAR mailTo[256]; 
  337. wsprintf(mailTo,TEXT("RCPT TO:<%s>/r/n"),szState); 
  338. send(sock,mailTo,lstrlen(mailTo),0); 
  339. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  340. iRet=recv(sock,buffer,256,0); 
  341. if(SOCKET_ERROR==iRet) 
  342. ShowError();  
  343. return
  344. TCHAR dataCommad[]="DATA/r/n"
  345. send(sock,dataCommad,lstrlen(dataCommad),0);  
  346. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  347. iRet=recv(sock,buffer,256,0); 
  348. if(SOCKET_ERROR==iRet) 
  349. ShowError();  
  350. return
  351. //下面是發送正文及附件部份 
  352. TCHAR data[50000]; 
  353. TCHAR SetMailHead[1024]; //郵件頭部信息 
  354. wsprintf(SetMailHead,TEXT("To:%s/r/nFrom:%s/r/nSubject: %s/r/n" 
  355. "Date:2012-8-24/r/nX-Mailer:Kevin's mailer/r/nMIME-Version:1.0/r/n" 
  356. "Content-Type: multipart/mixed;/r/n" 
  357. " boundary=/"----=_NextPart_5039E410_D41071F0_120ABDFB/";/r/n" 
  358. "This is a multi-part message in MIME format./r/n/r/n" 
  359. "------=_NextPart_5039E410_D41071F0_120ABDFB/r/n" 
  360. "Content-Type: multipart/alternative;/r/n" 
  361. " boundary=/"----=_NextPart_5039E410_D41071F0_53510C95/";/r/n/r/n" 
  362. "------=_NextPart_5039E410_D41071F0_53510C95/r/n" 
  363. "Content-Type: text/plain;/r charset=/"gb2312/"/r/n" 
  364. "Content-Transfer-Encoding: base64/r/n/r/n"),szState,userF,pTitle); 
  365. strcat(SetMailHead,pText); //郵件頭部再加上正文文本內容 
  366. strcat(SetMailHead,TEXT("/r/n/r/n")); 
  367. strcpy(data,SetMailHead); 
  368. TCHAR SetMailHtml[1024]; //郵件HTML代碼部份 
  369. wsprintf(SetMailHtml,TEXT("------=_NextPart_5039E410_D41071F0_53510C95/r/n" 
  370. "Content-Type: text/html;/r/n" 
  371. " charset=/"gb2312/"/r/n" 
  372. "Content-Transfer-Encoding: base64/r/n/r/n")); 
  373. strcat(SetMailHtml,pText); //加入郵件內容 
  374. strcat(SetMailHtml,TEXT("/r/n/r/n------=_NextPart_5039E410_D41071F0_53510C95--/r/n/r/n")); 
  375. strcat(data,SetMailHtml); 
  376. if(TRUE==attach) //判斷是否添加了附件路徑 
  377. strcat(data,file); //加入附件部份代碼 
  378. strcat(data,TEXT("------=_NextPart_5039E410_D41071F0_120ABDFB--/r/n")); 
  379. send(sock,data,lstrlen(data),0); 
  380. TCHAR cN[]="/r/n./r/n"//郵件結束標志 
  381. send(sock,cN,lstrlen(cN),0); 
  382. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  383. iRet=recv(sock,buffer,256,0); 
  384. if(SOCKET_ERROR==iRet) 
  385. ShowError();  
  386. return
  387. TCHAR cQuit[] = "QUIT/r/n"//退出命令 
  388. send(sock,cQuit,lstrlen(cQuit),0);  
  389. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  390. iRet=recv(sock,buffer,256,0); 
  391. TCHAR cNum[256]; 
  392. if(SOCKET_ERROR==iRet) 
  393. ShowError();  
  394. return
  395. }  
  396. else 
  397. {  
  398. TCHAR str[256]; //輸出已發送列表 
  399. wsprintf(str,"%i",sendNum); 
  400. LVITEM lvItem; 
  401. lvItem.mask = LVIF_TEXT; 
  402. lvItem.iSubItem = 0; 
  403. int ItemCount = ListView_GetItemCount(GetDlgItem(hwnd, IDC_LIST)); 
  404. lvItem.iItem = ItemCount;  
  405. lvItem.pszText = str; 
  406. SendDlgItemMessage(hwnd, IDC_LIST, LVM_INSERTITEM, 0, (LPARAM)&lvItem);  
  407. ListView_SetItemText(GetDlgItem(hwnd, IDC_LIST), i++, 1, szState);  
  408. sendNum++; 
  409. free(pTitle); //釋放空間  
  410. closesocket(sock); //關閉SOCKET  
  411. WSACleanup(); 
  412. return
  413. void Socket(HWND hwnd,TCHAR userName[],TCHAR userPassWord[])//傳入加密的用戶名跟密碼連接163 
  414. TCHAR* pText; 
  415. pText = readText1(hwnd); 
  416. int WSA_return; 
  417. WSADATA wsaData;  
  418. WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData);//初始化Socket庫 
  419. SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
  420. hostent* host = NULL;  
  421. SOCKADDR_IN sa; 
  422. sa.sin_family=AF_INET; //設置電線連接服務器端的端口 
  423. TCHAR cPort[100]; 
  424. GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR)); 
  425. int iPort=atoi(cPort); 
  426. sa.sin_port = htons(iPort);  
  427. HOSTENT *host_entry; 
  428. TCHAR host_name[256]=""
  429. ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR));  
  430. ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR)); 
  431. TCHAR str_ipAdd[256]; 
  432. if(WSA_return==0) 
  433. {  
  434. host_entry=gethostbyname(host_name); // 即要解析的域名或主機名  
  435. if(host_entry!=NULL) 
  436. wsprintf(str_ipAdd,"%d.%d.%d.%d"
  437. (host_entry->h_addr_list[0][0]&0x00ff), 
  438. (host_entry->h_addr_list[0][1]&0x00ff), 
  439. (host_entry->h_addr_list[0][2]&0x00ff), 
  440. (host_entry->h_addr_list[0][3]&0x00ff)); 
  441.  
  442. sa.sin_addr.S_un.S_addr = inet_addr(str_ipAdd);  
  443. if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR) 
  444. ShowError(); 
  445. return;  
  446. TCHAR buffer[256]; //對話過程  
  447. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  448. int iRet=recv(sock,buffer,256,0); //接收問候語  
  449. if(SOCKET_ERROR==iRet) 
  450. ShowError();  
  451. return
  452. TCHAR Hello[] = "HELO SMTP/r/n"//注意不能忘了末尾的回車  
  453. send(sock,Hello,lstrlen(Hello),0);  
  454. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  455. iRet=recv(sock,buffer,256,0); 
  456. if(SOCKET_ERROR==iRet) 
  457. ShowError();  
  458. return
  459. TCHAR Ehlo[] = "EHLO SMTP/r/n";  
  460. send(sock,Ehlo,lstrlen(Ehlo),0);  
  461. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  462. iRet=recv(sock,buffer,256,0); 
  463. if(SOCKET_ERROR==iRet) 
  464. ShowError();  
  465. return
  466. TCHAR login[] = "AUTH LOGIN/r/n"//登陸命令 
  467. send(sock,login,lstrlen(login),0);  
  468. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  469. iRet=recv(sock,buffer,256,0); 
  470. if(SOCKET_ERROR==iRet) 
  471. ShowError();  
  472. return
  473. if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) 
  474. strcat(userName,"/r/n"); 
  475. send(sock,userName,lstrlen(userName),0); //發送加密的用戶名 
  476. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  477. iRet=recv(sock,buffer,256,0); 
  478. if(SOCKET_ERROR==iRet) 
  479. ShowError();  
  480. return
  481. strcat(userPassWord,"/r/n"); 
  482. send(sock,userPassWord,lstrlen(userPassWord),0); //發送加密的密碼 
  483. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  484. iRet=recv(sock,buffer,256,0); 
  485. if(SOCKET_ERROR==iRet) 
  486. ShowError();  
  487. return
  488. if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) 
  489. send(sock,userName,lstrlen(userName),0); //發送加密的用戶名 
  490. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  491. iRet=recv(sock,buffer,256,0); 
  492. if(SOCKET_ERROR==iRet) 
  493. ShowError();  
  494. return
  495. send(sock,userPassWord,lstrlen(userPassWord),0); //發送加密的密碼 
  496. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  497. iRet=recv(sock,buffer,256,0); 
  498. if(SOCKET_ERROR==iRet) 
  499. ShowError();  
  500. return
  501. TCHAR userF[256]; 
  502. TCHAR userL[256]; 
  503. TCHAR temp[256]; 
  504. GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userF,sizeof(userF)/sizeof(TCHAR));  
  505. ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),temp,sizeof(host_name)/sizeof(TCHAR)); 
  506. strcat(userF,"@"); 
  507. strncpy(userL,temp+5,sizeof(userL)); 
  508. strcat(userF,userL); 
  509. TCHAR mailFrom[256]; 
  510. //MessageBox(hwnd,userF,"",MB_OK); 
  511. wsprintf(mailFrom,TEXT("MAIL FROM:<%s>/r/n"),userF); 
  512. send(sock,mailFrom,lstrlen(mailFrom),0); 
  513. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  514. iRet=recv(sock,buffer,256,0); 
  515. if(SOCKET_ERROR==iRet) 
  516. ShowError();  
  517. return
  518. TCHAR mailAdd[256]; 
  519. GetDlgItemText(hwnd,IDC_EDIT_MAILADD,mailAdd,sizeof(mailAdd)/sizeof(TCHAR)); 
  520. TCHAR mailTo[256]; 
  521. wsprintf(mailTo,TEXT("RCPT TO:<%s>/r/n"),mailAdd); 
  522. send(sock,mailTo,lstrlen(mailTo),0); 
  523. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  524. iRet=recv(sock,buffer,256,0); 
  525. if(SOCKET_ERROR==iRet) 
  526. ShowError();  
  527. return
  528. TCHAR dataCommad[]="DATA/r/n"
  529. send(sock,dataCommad,lstrlen(dataCommad),0);  
  530. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  531. iRet=recv(sock,buffer,256,0); 
  532. if(SOCKET_ERROR==iRet) 
  533. ShowError();  
  534. return
  535. //下面是發送正文及附件部份 
  536. TCHAR data[50000]; 
  537. TCHAR SetMailHead[1024]; //郵件頭部信息 
  538. wsprintf(SetMailHead,TEXT("To:%s/r/nFrom:%s/r/nSubject: %s/r/n" 
  539. "Date:2012-8-24/r/nX-Mailer:Kevin's mailer/r/nMIME-Version:1.0/r/n" 
  540. "Content-Type: multipart/mixed;/r/n" 
  541. " boundary=/"----=_NextPart_5039E410_D41071F0_120ABDFB/";/r/n" 
  542. "This is a multi-part message in MIME format./r/n/r/n" 
  543. "------=_NextPart_5039E410_D41071F0_120ABDFB/r/n" 
  544. "Content-Type: multipart/alternative;/r/n" 
  545. " boundary=/"----=_NextPart_5039E410_D41071F0_53510C95/";/r/n/r/n" 
  546. "------=_NextPart_5039E410_D41071F0_53510C95/r/n" 
  547. "Content-Type: text/plain;/r charset=/"gb2312/"/r/n" 
  548. "Content-Transfer-Encoding: base64/r/n/r/n"),mailAdd,userF,pTitle); 
  549. strcat(SetMailHead,pText); //郵件頭部再加上正文文本內容 
  550. strcat(SetMailHead,TEXT("/r/n/r/n")); 
  551. strcpy(data,SetMailHead); 
  552. TCHAR SetMailHtml[1024]; //郵件HTML代碼部份 
  553. wsprintf(SetMailHtml,TEXT("------=_NextPart_5039E410_D41071F0_53510C95/r/n" 
  554. "Content-Type: text/html;/r/n" 
  555. " charset=/"gb2312/"/r/n" 
  556. "Content-Transfer-Encoding: base64/r/n/r/n")); 
  557. strcat(SetMailHtml,pText); //加入郵件內容 
  558. strcat(SetMailHtml,TEXT("/r/n/r/n------=_NextPart_5039E410_D41071F0_53510C95--/r/n/r/n")); 
  559. strcat(data,SetMailHtml); 
  560. if(TRUE==attach) //判斷是否添加了附件路徑 
  561. strcat(data,file); //加入附件部份代碼 
  562. strcat(data,TEXT("------=_NextPart_5039E410_D41071F0_120ABDFB--/r/n")); 
  563. send(sock,data,lstrlen(data),0); 
  564. TCHAR cN[]="/r/n./r/n"//郵件結束標志 
  565. send(sock,cN,lstrlen(cN),0); 
  566. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  567. iRet=recv(sock,buffer,256,0); 
  568. if(SOCKET_ERROR==iRet) 
  569. ShowError();  
  570. return
  571. TCHAR cQuit[] = "QUIT/r/n"//退出命令 
  572. send(sock,cQuit,lstrlen(cQuit),0);  
  573. ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
  574. iRet=recv(sock,buffer,256,0); 
  575. TCHAR cNum[256]; 
  576. if(SOCKET_ERROR==iRet) 
  577. ShowError();  
  578. return
  579. }  
  580. else 
  581. {  
  582. MessageBox(hwnd,TEXT("測試發送成功"),TEXT("恭喜"),MB_OK); 
  583. free(pTitle); //釋放空間 
  584. closesocket(sock); //關閉SOCK  
  585. WSACleanup(); 
  586. return
  587. void ShowError() 
  588. TCHAR* lpMsgBuf; 
  589. FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| //自動分配消息緩沖區 
  590. FORMAT_MESSAGE_FROM_SYSTEM, //從系統獲取信息 
  591. NULL,GetLastError(), //獲取錯誤信息標識 
  592. MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), //使用系統缺省語言 
  593. (LPTSTR)&lpMsgBuf, //消息緩沖區 
  594. 0, 
  595. NULL); 
  596. MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR);  

希望本文所述對大家的C++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品高清视频| 国产精品av网站| 亚洲国产私拍精品国模在线观看| 2019中文在线观看| 久久久精品日本| 精品国产91久久久久久| 综合网日日天干夜夜久久| 久久国产视频网站| 国产精品免费在线免费| 日韩的一区二区| 亚洲精品网站在线播放gif| 欧美激情喷水视频| 欧美色videos| 国产亚洲美女精品久久久| 亚洲人成网在线播放| 国产日韩欧美电影在线观看| 中文字幕国内精品| 疯狂做受xxxx欧美肥白少妇| 久久久99久久精品女同性| 91视频8mav| yellow中文字幕久久| 国产精品视频永久免费播放| 欧美激情国产日韩精品一区18| 国产精品福利网| 国产亚洲欧洲黄色| 久久亚洲精品视频| 91亚洲精品一区二区| 欧洲一区二区视频| 欧美国产视频一区二区| 最近2019中文字幕一页二页| 国产一区二区三区高清在线观看| 亚洲成av人片在线观看香蕉| 国产精品视频不卡| 成人网在线观看| 久久精品国产一区二区电影| 欧美日韩国产色| 欧美裸体男粗大视频在线观看| 欧美一区二区视频97| 国产性色av一区二区| 韩国v欧美v日本v亚洲| 国产精品久久久久久av下载红粉| …久久精品99久久香蕉国产| 欧美www视频在线观看| 国产亚洲欧美aaaa| 最近2019年手机中文字幕| 亚洲www在线观看| 精品日本美女福利在线观看| 日韩精品在线第一页| 色婷婷成人综合| 亚洲女在线观看| 91色在线视频| 久久亚洲精品小早川怜子66| 91久久嫩草影院一区二区| 国产精品情侣自拍| 国产精品看片资源| 亚洲香蕉在线观看| 日韩av在线高清| 亚洲一区二区日本| 久久久国产影院| 亚洲天堂视频在线观看| 色哟哟网站入口亚洲精品| 久久视频免费在线播放| 亚洲欧美国产日韩中文字幕| 在线观看日韩专区| 欧美日韩高清在线观看| 国产成人极品视频| 欧美一级高清免费播放| 亚洲国产精品成人精品| 在线性视频日韩欧美| 欧美激情久久久久| 91影视免费在线观看| 亚洲第一视频网| 97涩涩爰在线观看亚洲| 日韩免费看的电影电视剧大全| 亚洲精品福利免费在线观看| 日本久久久久久久久久久| 日韩在线视频二区| 亚洲欧美日韩一区二区在线| 日韩成人av在线| 中文字幕亚洲二区| 免费91麻豆精品国产自产在线观看| 久久综合九色九九| 黄色成人在线播放| 欧美性xxxxhd| 亚洲欧洲一区二区三区在线观看| 日韩高清电影免费观看完整| 热久久视久久精品18亚洲精品| 国产香蕉精品视频一区二区三区| 亚洲黄色www| 久久久久中文字幕| 国产美女精品视频免费观看| 成人性生交大片免费观看嘿嘿视频| 亚洲欧洲成视频免费观看| 成人激情视频小说免费下载| 国产精品夫妻激情| 91久久精品国产| 国产精品视频永久免费播放| 激情成人在线视频| 日韩有码在线电影| 91精品国产综合久久男男| 久久免费高清视频| 亚洲激情小视频| 九九热精品视频| 国产91网红主播在线观看| 韩国三级日本三级少妇99| 欧美电影在线观看高清| 亚洲自拍偷拍第一页| 久久久久久久久久久成人| 日韩av影院在线观看| 2019中文在线观看| 国产日韩换脸av一区在线观看| 国产日韩精品电影| 欧美激情一区二区三区在线视频观看| 日韩成人在线播放| 国产免费一区视频观看免费| 欧美又大又硬又粗bbbbb| 一区二区三欧美| 日本三级韩国三级久久| 91久久精品国产| 中文欧美在线视频| 亚州精品天堂中文字幕| 色www亚洲国产张柏芝| 欧美精品中文字幕一区| 久久伊人精品天天| 97视频在线观看视频免费视频| 亚洲国产成人爱av在线播放| 国产精彩精品视频| 国产精品视频中文字幕91| 91精品国产自产在线| 欧美亚洲激情视频| 久久视频在线视频| 韩剧1988免费观看全集| 日韩在线观看视频免费| 97在线精品国自产拍中文| 亚洲色图美腿丝袜| 亚洲精品第一页| 国产精品高潮呻吟久久av无限| 日韩欧美在线中文字幕| 日本在线精品视频| 国产区亚洲区欧美区| 欧美电影电视剧在线观看| 亚洲色图欧美制服丝袜另类第一页| 在线亚洲午夜片av大片| 最近2019中文字幕一页二页| 亚洲人成网站999久久久综合| 日韩av理论片| 日韩欧美在线视频| 欧美激情一二区| 亚洲欧美999| 亚洲视频综合网| 国产精品成人免费电影| 久久精品视频99| 91国内免费在线视频| 久久九九全国免费精品观看| 国产精品777| 国色天香2019中文字幕在线观看| 精品av在线播放| 亚洲三级av在线| 国产一区二区日韩| 91久久久久久国产精品| 日本久久中文字幕| 欧美日韩国产限制| 综合欧美国产视频二区| 亚洲永久免费观看|