C++實現(xiàn)郵件群發(fā)的方法
本文實例講述了C++實現(xiàn)郵件群發(fā)的方法。分享給大家供大家參考。具體如下:
關(guān)于生成隨機QQ郵箱不精確的問題,在之后版本打算另寫一個采集器插件進行帳號采集,所以,這個軟件只用來進行內(nèi)容發(fā)送,郵箱進行隨機生成
如果你已經(jīng)有采集來的QQ號,請復(fù)制到SendList.txt 替換內(nèi)容即可
可以直接復(fù)制HTML代碼到郵件內(nèi)容,保存即可。目前郵件內(nèi)容最大設(shè)置為10000字節(jié),如果有增大的必要,歡迎提交留言。
這是我學(xué)習(xí)后VC編程中涉及到多線程,socket,及一些WINDOWS API的宗合應(yīng)用
使用說明:
一、SMTP設(shè)置
1、SMTP設(shè)置中,收件箱地址:填寫郵箱地址為帳號測試郵箱,可以填寫你自己的郵箱作為接收測試。打星號為必填。郵箱帳號及密碼,是即將用于群發(fā)的帳號和密碼
2、群發(fā)發(fā)送時間間隔,默認為零,可以選擇填寫發(fā)送間隔時間,單位為秒,防止多次快速發(fā)送相同內(nèi)容被停用。
3、勾選郵件標(biāo)題后插入系統(tǒng)時間,可以在標(biāo)題上加上系統(tǒng)時間
4、導(dǎo)入群發(fā)列表,勾選后,可以點擊群發(fā),暫停,繼續(xù)。(群發(fā)列表為程序目錄中SendList.txt)如果你有郵箱采集軟件,可以把彩集的郵箱地址按照格式,一行一個,放入其中),沒有的話,可以點擊“收件箱”頁面生成隨機QQ郵箱
二、郵件內(nèi)容
1、填寫郵件標(biāo)題,郵件內(nèi)容可以為純文本,也可以是HTML代碼,附件目前只支持TXT文本。
2、群發(fā)前,請測試郵件內(nèi)容,是否完整。附件是否正常接收。
三、收件箱
1、收件箱中順序生成QQ郵箱,請不要超過6位數(shù)QQ號,位數(shù)過大,生成時間過長,容易造成假死。
2、群發(fā)前,先生成QQ郵箱列表。如果你有采集郵箱帳號,可以按格式放入SendList.txt 中
版本更新說明:
1、可增加多個附件。
2、修復(fù)標(biāo)題插入日期造成程序崩潰的BUG。
3、增加發(fā)送間隔時間選項。
4、支持HTML代碼
5、增加干預(yù)碼
#include "stdafx.h" #include <windows.h> #include <windowsx.h> #include "Resource.h" #include "TabDlg1.h" #include "winsock2.h" #define MAXSTRING 10000 static int flag=0; //標(biāo)記是否群發(fā) TCHAR* pTitle = NULL; //指向標(biāo)題文件內(nèi)容的指針 HANDLE hThread=NULL; //線程返回句柄 long i=0; //列表控件“行”計數(shù) static long sendNum=1; //發(fā)送郵件數(shù)量 #pragma comment(lib,"WSOCK32.LIB") extern TCHAR tcRunPath[MAX_PATH]; //程序當(dāng)前路徑目錄 extern TCHAR shortPath[MAX_PATH]; //文件路徑,TAB2中的全局變量 extern TCHAR titlePath[256]; //郵件標(biāo)題文件路徑 extern TCHAR mtPath[256]; //郵件內(nèi)容文件路徑 extern TCHAR sendListPath[MAX_PATH]; //發(fā)送列表文件路徑 extern BOOL attach; //是否添加了附件 extern TCHAR file[MAXSTRING]; //附件部份代碼 BOOL WINAPI TAB1_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_INITDIALOG, TAB1_OnInitDialog); HANDLE_MSG(hWnd, WM_COMMAND, TAB1_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE, TAB1_OnClose); } return FALSE; } BOOL TAB1_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { InitLVColumn(hwnd); InitComboBox(hwnd); return TRUE; } void TAB1_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { IsChecked(hwnd); //判斷勾選框是否被勾選 IsRadioChecked(hwnd); //RADIO控件是否被選擇 switch(id) { case IDC_MAIL_TEST: { if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED && IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED) { MessageBox(hwnd,TEXT("請選擇發(fā)QQ郵箱或163信箱"),"",MB_OK); return; } else { flag=0; hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0); } } break; case IDC_BUTTON_START: { if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED && IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED) { MessageBox(hwnd,TEXT("請選擇發(fā)QQ郵箱或163信箱"),"",MB_OK); return; } else { flag=1; hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0); } } break; case IDC_BUTTON_PAUSE: { if(NULL!=hThread) { SuspendThread(hThread); } else { return; } } break; case IDC_BUTTON_RESUME: { if(NULL!=hThread) { ResumeThread(hThread); } else { return; } } break; default: break; } } void TAB1_OnClose(HWND hwnd) { EndDialog(hwnd, 0); } int InitLVColumn(HWND hwnd) //列表初始化設(shè)置,視圖選為報表視圖 { LVCOLUMN lvColumn; MyLVColumn MyColumn[2] = {{TEXT("編號"), 0x30, LVCFMT_CENTER},{TEXT("郵箱帳號"), 0x99, LVCFMT_CENTER}}; lvColumn.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH|LVCF_SUBITEM; DWORD dwStyle =ListView_GetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST)); //得到列表當(dāng)前拓展風(fēng)格 dwStyle |= LVS_EX_FULLROWSELECT; //選中某行使整行高亮(只適用與report風(fēng)格的listctrl) dwStyle |= LVS_EX_GRIDLINES; //網(wǎng)格線(只適用與report風(fēng)格的listctrl) // dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件 ListView_SetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST),dwStyle); //設(shè)置列表擴展風(fēng)格 for(int i = 0; i < 2; i++) { lvColumn.pszText = MyColumn[i].szColumnName; lvColumn.cx = MyColumn[i].cx; lvColumn.fmt = MyColumn[i].fmt; SendDlgItemMessage(hwnd, IDC_LIST, LVM_INSERTCOLUMN, i, (LPARAM)&lvColumn); } return 0; } int InitComboBox(HWND hwnd)//窗口控件初始化設(shè)置 { HWND hwndCombo=GetDlgItem(hwnd,IDC_COMBO_SLEEPTIME); ComboBox_InsertString(hwndCombo,-1,TEXT("0")); ComboBox_InsertString(hwndCombo,-1,TEXT("1")); ComboBox_InsertString(hwndCombo,-1,TEXT("2")); ComboBox_InsertString(hwndCombo,-1,TEXT("5")); ComboBox_InsertString(hwndCombo,-1,TEXT("10")); ComboBox_InsertString(hwndCombo,-1,TEXT("20")); ComboBox_SetText(hwndCombo,TEXT("0")); SetDlgItemText(hwnd,IDC_EDIT_MAILADD,TEXT("12345678@qq.com")); ComboBox_InsertString(GetDlgItem(hwnd,IDC_COMBO_SMTP),0,TEXT("smtp.qq.com")); ComboBox_InsertString(GetDlgItem(hwnd,IDC_COMBO_SMTP),1,TEXT("smtp.163.com")); ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com")); SetDlgItemText(hwnd,IDC_EDIT_MAILPORT,TEXT("25")); SetDlgItemText(hwnd,IDC_EDIT_USERNAME,TEXT("")); return 1; } int IsChecked(HWND hwnd) //checkbox未選中的設(shè)置為只讀 { if(IsDlgButtonChecked(hwnd,IDC_CHECK_QUNFA)!=BST_CHECKED) { EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_START), false); EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_RESUME), false); EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_PAUSE), false); return 0; } else { EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_START), true); EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_RESUME), true); EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_PAUSE), true); return 1; } return 0; } int IsRadioChecked(HWND hwnd) //RADIO控件被選中,則設(shè)置相應(yīng)的SMTP 地址 { if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) { ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com")); return 1; } if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) { ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.163.com")); return 2; } return 0; } TCHAR* readText1(HWND hwnd) //讀取文件--郵件發(fā)送內(nèi)容 { int nLen = 0; FILE *pF = fopen(titlePath , "r"); //打開文件 fseek(pF, 0, SEEK_END); //文件指針移到文件尾 nLen = ftell(pF); //得到當(dāng)前指針位置, 即是文件的長度 rewind(pF); //文件指針恢復(fù)到文件頭位置 pTitle = (char*) malloc(sizeof(char)*nLen+1);//動態(tài)申請空間, 為保存字符串結(jié)尾標(biāo)志\0, 多申請一個字符的空間 if(!pTitle) { MessageBox(hwnd,TEXT("內(nèi)存不夠!"),"錯誤",MB_ICONWARNING); exit(0); } nLen = fread(pTitle, sizeof(char), nLen, pF); pTitle[nLen] = '\0'; //添加字符串結(jié)尾標(biāo)志 if(IsDlgButtonChecked(hwnd,IDC_CHECK_TITLE)==BST_CHECKED) //是否勾選在郵件標(biāo)題 加入系統(tǒng)當(dāng)前時間 { SYSTEMTIME stLocal; GetLocalTime(&stLocal); //得到系統(tǒng)當(dāng)前時間 TCHAR strTime[256]; ZeroMemory(strTime,sizeof(strTime)/sizeof(TCHAR)); wsprintf(strTime,"%04u-%02u-%02u %02u:%02u:%02u",stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond); strcat(pTitle,strTime); //在標(biāo)題后加入系統(tǒng)時間 } fclose(pF); //關(guān)閉文件 TCHAR* pText = NULL; pF = fopen(mtPath , "r"); //打開文件 fseek(pF, 0, SEEK_END); nLen = ftell(pF); rewind(pF); pText = (char*) malloc(sizeof(char)*nLen+1); //動態(tài)申請空間, 為保存字符串結(jié)尾標(biāo)志\0, 多申請一個字符的空間 if(!pText) { MessageBox(hwnd,TEXT("內(nèi)存不夠!"),"錯誤",MB_ICONWARNING); exit(0); } nLen = fread(pText, sizeof(char), nLen, pF); pText[nLen] = '\0'; //添加字符串結(jié)尾標(biāo)志 fclose(pF); //關(guān)閉文件 TCHAR chText[MAXSTRING]; TCHAR* encText=base64_encode(pText,strlen(pText)); strcpy(chText,encText); //BASE64加密結(jié)果 free(encText); //釋放指針 free(pText); //釋放空間 return chText; } DWORD WINAPI ThreadFunc(LPVOID lpParam)//發(fā)郵件線程 { HWND hwnd=(HWND)lpParam; TCHAR userName[256]; //用戶帳號 TCHAR userPassWord[256]; //用戶密碼 GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userName,sizeof(userName)/sizeof(TCHAR)); GetDlgItemText(hwnd,IDC_EDIT_USERPASSWORD,userPassWord,sizeof(userPassWord)/sizeof(TCHAR)); TCHAR *name=userName; int i = 0; int j = strlen(name); TCHAR *encName = base64_encode(name, j); //給用戶名base64加密編碼 ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR)); wsprintf(userName,"%s\n", encName); //在加編碼后加入回車符 TCHAR *passWord=userPassWord; int k = strlen(passWord); TCHAR *encPassWord = base64_encode(passWord, k); //給用戶密碼base64加密編碼 // int len = strlen(enc); // TCHAR *dec = base64_decode(enc, len); //反編 ZeroMemory(userPassWord,sizeof(userPassWord)/sizeof(TCHAR)); wsprintf(userPassWord,"%s\n", encPassWord); /*ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR)); wsprintf(userName,"\ndecoded : %s", dec); MessageBox(hwnd,userName,"",MB_OK);*/ //反編譯用戶名,如果需要,可以把用戶名密碼反編后發(fā)到指定郵箱。 free(encName); //釋放指針 free(encPassWord); //free(dec); if(1==flag) //全局標(biāo)記,點擊群發(fā)還是測試,1為群發(fā),0為測試 { HANDLE wFile; int szId; TCHAR ch; TCHAR szState[256]; strcpy(sendListPath,tcRunPath); strcat(sendListPath,"\\SendList.txt"); //拼接全路徑及文件名 TCHAR *sFileName=sendListPath; FILE *fp=fopen(sFileName,"r"); if(fp==NULL) { return FALSE; //打開文件失敗,則返回,不讀取 } fseek(fp, 0, SEEK_END); int length = ftell(fp); //length為0,則是空的 rewind(fp); //把指針移回文件頭部 還可以用 fseek(fp, 0, SEEK_SET);效果一樣 if(length==0) //判斷文件如果為空,則關(guān)閉文件,返回, { fclose(fp); //要關(guān)閉打開的文件,不然退出時,無法保存 return FALSE; } while(!feof(fp)) { fscanf(fp,"%s\r\n",szState); SocketQ(hwnd,userName,userPassWord,szState); TCHAR sTime[256]; unsigned long iTime; ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SLEEPTIME),sTime,sizeof(sTime)/sizeof(TCHAR)); iTime=atoi(sTime); iTime=iTime*1000; Sleep(iTime); } fclose(fp); } else { Socket(hwnd,userName,userPassWord); } CloseHandle(hThread); return 0; } void SocketQ(HWND hwnd,TCHAR userName[],TCHAR userPassWord[],TCHAR szState[])//傳入加密的用戶名跟密碼連接163 { /******************************************************************* 使用Socket的程序在使用Socket之前必須調(diào)用WSAStartup函數(shù)。 該函數(shù)的第一個參數(shù)指明程序請求使用的Socket版本, 其中高位字節(jié)指明副版本、低位字節(jié)指明主版本; 操作系統(tǒng)利用第二個參數(shù)返回請求的Socket的版本信息。 當(dāng)一個應(yīng)用程序調(diào)用WSAStartup函數(shù)時,操作系統(tǒng)根據(jù)請求的Socket版本來搜索相應(yīng)的Socket庫, 然后綁定找到的Socket庫到該應(yīng)用程序中。 以后應(yīng)用程序就可以調(diào)用所請求的Socket庫中的其它Socket函數(shù)了。 該函數(shù)執(zhí)行成功后返回0。 *****************************************************************/ TCHAR* pText; pText = readText1(hwnd); int WSA_return; WSADATA wsaData; WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData); //初始化Socket庫 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//創(chuàng)建SOCKET hostent* host = NULL; SOCKADDR_IN sa; sa.sin_family=AF_INET; //設(shè)置電線連接服務(wù)器端的端口 TCHAR cPort[100]; GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR)); int iPort=atoi(cPort); sa.sin_port = htons(iPort); //sa.sin_addr.S_un.S_addr = inet_addr("123.58.178.203");//可以寫死IP地址 HOSTENT *host_entry; //存放主機域名,如smtp.qq.com TCHAR host_name[256]=""; ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR)); ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR)); TCHAR str_ipAdd[256]; if(WSA_return==0) { host_entry=gethostbyname(host_name); // 要解析的域名或主機名 if(host_entry!=NULL) { wsprintf(str_ipAdd,"%d.%d.%d.%d", (host_entry->h_addr_list[0][0]&0x00ff), (host_entry->h_addr_list[0][1]&0x00ff), (host_entry->h_addr_list[0][2]&0x00ff), (host_entry->h_addr_list[0][3]&0x00ff)); } } sa.sin_addr.S_un.S_addr = inet_addr(str_ipAdd); //得到域名IP地址 if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR) { ShowError(); return; } TCHAR buffer[256]; //對話過程 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); int iRet=recv(sock,buffer,256,0); //接收問候語 if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR Hello[] = "HELO SMTP\r\n"; //注意不能忘了末尾的回車 send(sock,Hello,lstrlen(Hello),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR Ehlo[] = "EHLO SMTP\r\n"; send(sock,Ehlo,lstrlen(Ehlo),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR login[] = "AUTH LOGIN\r\n"; //登陸命令 send(sock,login,lstrlen(login),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) { strcat(userName,"\r\n"); send(sock,userName,lstrlen(userName),0); //發(fā)送加密的用戶名 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } strcat(userPassWord,"\r\n"); send(sock,userPassWord,lstrlen(userPassWord),0); //發(fā)送加密的密碼 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } } if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) { send(sock,userName,lstrlen(userName),0); //發(fā)送加密的用戶名 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } send(sock,userPassWord,lstrlen(userPassWord),0); //發(fā)送加密的密碼 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } } TCHAR userF[256]; TCHAR userL[256]; TCHAR temp[256]; GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userF,sizeof(userF)/sizeof(TCHAR)); ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),temp,sizeof(host_name)/sizeof(TCHAR)); strcat(userF,"@"); strncpy(userL,temp+5,sizeof(userL)); strcat(userF,userL); TCHAR mailFrom[256]; //MessageBox(hwnd,userF,"",MB_OK); wsprintf(mailFrom,TEXT("MAIL FROM:<%s>\r\n"),userF); send(sock,mailFrom,lstrlen(mailFrom),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR mailTo[256]; wsprintf(mailTo,TEXT("RCPT TO:<%s>\r\n"),szState); send(sock,mailTo,lstrlen(mailTo),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR dataCommad[]="DATA\r\n"; send(sock,dataCommad,lstrlen(dataCommad),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } //下面是發(fā)送正文及附件部份 TCHAR data[50000]; TCHAR SetMailHead[1024]; //郵件頭部信息 wsprintf(SetMailHead,TEXT("To:%s\r\nFrom:%s\r\nSubject: %s\r\n" "Date:2012-8-24\r\nX-Mailer:Kevin's mailer\r\nMIME-Version:1.0\r\n" "Content-Type: multipart/mixed;\r\n" " boundary=\"----=_NextPart_5039E410_D41071F0_120ABDFB\";\r\n" "This is a multi-part message in MIME format.\r\n\r\n" "------=_NextPart_5039E410_D41071F0_120ABDFB\r\n" "Content-Type: multipart/alternative;\r\n" " boundary=\"----=_NextPart_5039E410_D41071F0_53510C95\";\r\n\r\n" "------=_NextPart_5039E410_D41071F0_53510C95\r\n" "Content-Type: text/plain;\r charset=\"gb2312\"\r\n" "Content-Transfer-Encoding: base64\r\n\r\n"),szState,userF,pTitle); strcat(SetMailHead,pText); //郵件頭部再加上正文文本內(nèi)容 strcat(SetMailHead,TEXT("\r\n\r\n")); strcpy(data,SetMailHead); TCHAR SetMailHtml[1024]; //郵件HTML代碼部份 wsprintf(SetMailHtml,TEXT("------=_NextPart_5039E410_D41071F0_53510C95\r\n" "Content-Type: text/html;\r\n" " charset=\"gb2312\"\r\n" "Content-Transfer-Encoding: base64\r\n\r\n")); strcat(SetMailHtml,pText); //加入郵件內(nèi)容 strcat(SetMailHtml,TEXT("\r\n\r\n------=_NextPart_5039E410_D41071F0_53510C95--\r\n\r\n")); strcat(data,SetMailHtml); if(TRUE==attach) //判斷是否添加了附件路徑 { strcat(data,file); //加入附件部份代碼 strcat(data,TEXT("------=_NextPart_5039E410_D41071F0_120ABDFB--\r\n")); } send(sock,data,lstrlen(data),0); TCHAR cN[]="\r\n.\r\n"; //郵件結(jié)束標(biāo)志 send(sock,cN,lstrlen(cN),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR cQuit[] = "QUIT\r\n"; //退出命令 send(sock,cQuit,lstrlen(cQuit),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); TCHAR cNum[256]; if(SOCKET_ERROR==iRet) { ShowError(); return; } else { TCHAR str[256]; //輸出已發(fā)送列表 wsprintf(str,"%i",sendNum); LVITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.iSubItem = 0; int ItemCount = ListView_GetItemCount(GetDlgItem(hwnd, IDC_LIST)); lvItem.iItem = ItemCount; lvItem.pszText = str; SendDlgItemMessage(hwnd, IDC_LIST, LVM_INSERTITEM, 0, (LPARAM)&lvItem); ListView_SetItemText(GetDlgItem(hwnd, IDC_LIST), i++, 1, szState); sendNum++; } free(pTitle); //釋放空間 closesocket(sock); //關(guān)閉SOCKET WSACleanup(); return; } void Socket(HWND hwnd,TCHAR userName[],TCHAR userPassWord[])//傳入加密的用戶名跟密碼連接163 { TCHAR* pText; pText = readText1(hwnd); int WSA_return; WSADATA wsaData; WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData);//初始化Socket庫 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); hostent* host = NULL; SOCKADDR_IN sa; sa.sin_family=AF_INET; //設(shè)置電線連接服務(wù)器端的端口 TCHAR cPort[100]; GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR)); int iPort=atoi(cPort); sa.sin_port = htons(iPort); HOSTENT *host_entry; TCHAR host_name[256]=""; ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR)); ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR)); TCHAR str_ipAdd[256]; if(WSA_return==0) { host_entry=gethostbyname(host_name); // 即要解析的域名或主機名 if(host_entry!=NULL) { wsprintf(str_ipAdd,"%d.%d.%d.%d", (host_entry->h_addr_list[0][0]&0x00ff), (host_entry->h_addr_list[0][1]&0x00ff), (host_entry->h_addr_list[0][2]&0x00ff), (host_entry->h_addr_list[0][3]&0x00ff)); } } sa.sin_addr.S_un.S_addr = inet_addr(str_ipAdd); if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR) { ShowError(); return; } TCHAR buffer[256]; //對話過程 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); int iRet=recv(sock,buffer,256,0); //接收問候語 if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR Hello[] = "HELO SMTP\r\n"; //注意不能忘了末尾的回車 send(sock,Hello,lstrlen(Hello),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR Ehlo[] = "EHLO SMTP\r\n"; send(sock,Ehlo,lstrlen(Ehlo),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR login[] = "AUTH LOGIN\r\n"; //登陸命令 send(sock,login,lstrlen(login),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) { strcat(userName,"\r\n"); send(sock,userName,lstrlen(userName),0); //發(fā)送加密的用戶名 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } strcat(userPassWord,"\r\n"); send(sock,userPassWord,lstrlen(userPassWord),0); //發(fā)送加密的密碼 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } } if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) { send(sock,userName,lstrlen(userName),0); //發(fā)送加密的用戶名 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } send(sock,userPassWord,lstrlen(userPassWord),0); //發(fā)送加密的密碼 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } } TCHAR userF[256]; TCHAR userL[256]; TCHAR temp[256]; GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userF,sizeof(userF)/sizeof(TCHAR)); ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),temp,sizeof(host_name)/sizeof(TCHAR)); strcat(userF,"@"); strncpy(userL,temp+5,sizeof(userL)); strcat(userF,userL); TCHAR mailFrom[256]; //MessageBox(hwnd,userF,"",MB_OK); wsprintf(mailFrom,TEXT("MAIL FROM:<%s>\r\n"),userF); send(sock,mailFrom,lstrlen(mailFrom),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR mailAdd[256]; GetDlgItemText(hwnd,IDC_EDIT_MAILADD,mailAdd,sizeof(mailAdd)/sizeof(TCHAR)); TCHAR mailTo[256]; wsprintf(mailTo,TEXT("RCPT TO:<%s>\r\n"),mailAdd); send(sock,mailTo,lstrlen(mailTo),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR dataCommad[]="DATA\r\n"; send(sock,dataCommad,lstrlen(dataCommad),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } //下面是發(fā)送正文及附件部份 TCHAR data[50000]; TCHAR SetMailHead[1024]; //郵件頭部信息 wsprintf(SetMailHead,TEXT("To:%s\r\nFrom:%s\r\nSubject: %s\r\n" "Date:2012-8-24\r\nX-Mailer:Kevin's mailer\r\nMIME-Version:1.0\r\n" "Content-Type: multipart/mixed;\r\n" " boundary=\"----=_NextPart_5039E410_D41071F0_120ABDFB\";\r\n" "This is a multi-part message in MIME format.\r\n\r\n" "------=_NextPart_5039E410_D41071F0_120ABDFB\r\n" "Content-Type: multipart/alternative;\r\n" " boundary=\"----=_NextPart_5039E410_D41071F0_53510C95\";\r\n\r\n" "------=_NextPart_5039E410_D41071F0_53510C95\r\n" "Content-Type: text/plain;\r charset=\"gb2312\"\r\n" "Content-Transfer-Encoding: base64\r\n\r\n"),mailAdd,userF,pTitle); strcat(SetMailHead,pText); //郵件頭部再加上正文文本內(nèi)容 strcat(SetMailHead,TEXT("\r\n\r\n")); strcpy(data,SetMailHead); TCHAR SetMailHtml[1024]; //郵件HTML代碼部份 wsprintf(SetMailHtml,TEXT("------=_NextPart_5039E410_D41071F0_53510C95\r\n" "Content-Type: text/html;\r\n" " charset=\"gb2312\"\r\n" "Content-Transfer-Encoding: base64\r\n\r\n")); strcat(SetMailHtml,pText); //加入郵件內(nèi)容 strcat(SetMailHtml,TEXT("\r\n\r\n------=_NextPart_5039E410_D41071F0_53510C95--\r\n\r\n")); strcat(data,SetMailHtml); if(TRUE==attach) //判斷是否添加了附件路徑 { strcat(data,file); //加入附件部份代碼 strcat(data,TEXT("------=_NextPart_5039E410_D41071F0_120ABDFB--\r\n")); } send(sock,data,lstrlen(data),0); TCHAR cN[]="\r\n.\r\n"; //郵件結(jié)束標(biāo)志 send(sock,cN,lstrlen(cN),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHAR cQuit[] = "QUIT\r\n"; //退出命令 send(sock,cQuit,lstrlen(cQuit),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); TCHAR cNum[256]; if(SOCKET_ERROR==iRet) { ShowError(); return; } else { MessageBox(hwnd,TEXT("測試發(fā)送成功"),TEXT("恭喜"),MB_OK); } free(pTitle); //釋放空間 closesocket(sock); //關(guān)閉SOCK WSACleanup(); return; } void ShowError() { TCHAR* lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER| //自動分配消息緩沖區(qū) FORMAT_MESSAGE_FROM_SYSTEM, //從系統(tǒng)獲取信息 NULL,GetLastError(), //獲取錯誤信息標(biāo)識 MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), //使用系統(tǒng)缺省語言 (LPTSTR)&lpMsgBuf, //消息緩沖區(qū) 0, NULL); MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR); }
希望本文所述對大家的C++程序設(shè)計有所幫助。
相關(guān)文章
OpenCV圖像分割中的分水嶺算法原理與應(yīng)用詳解
這篇文章主要為大家詳細介紹了OpenCV圖像分割中的分水嶺算法原理與應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01