欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)郵件群發(fā)的方法

 更新時間:2015年07月09日 12:04:33   作者:kevin0216  
這篇文章主要介紹了C++實現(xiàn)郵件群發(fā)的方法,較為詳細的分析了郵件發(fā)送的原理與C++相關(guān)實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下

本文實例講述了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)文章

  • 一篇文章帶你了解C語言操作符

    一篇文章帶你了解C語言操作符

    指令系統(tǒng)的每一條指令都有一個操作符,它表示該指令應(yīng)進行什么樣性質(zhì)的操作,不同的指令用操作符這個字段的不同編碼來表示,每個編碼代表一種指令,這篇文章主要給大家介紹了關(guān)于C語言中操作符的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語言的位段與枚舉詳解

    C語言的位段與枚舉詳解

    這篇文章主要為大家詳細介紹了C語言的位段與枚舉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    利用Matlab繪制好看的旋轉(zhuǎn)九邊形

    這篇文章主要為大家介紹了如何利用Matlab繪制超好看的旋轉(zhuǎn)九邊形。文中的示例代碼講解詳細,對我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下
    2022-03-03
  • 深入理解c++實現(xiàn)Qt信號和槽機制

    深入理解c++實現(xiàn)Qt信號和槽機制

    信號和槽機制是 Qt 的核心機制,可以讓編程人員將互不相關(guān)的對象綁定在一起,實現(xiàn)對象之間的通信,本文就來深入理解c++實現(xiàn)Qt信號和槽機制,感興趣的可以了解一下
    2023-08-08
  • C++的類型轉(zhuǎn)換詳細介紹

    C++的類型轉(zhuǎn)換詳細介紹

    這篇文章主要介紹了C++的類型轉(zhuǎn)換詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c++詳細講解構(gòu)造函數(shù)的拷貝流程

    c++詳細講解構(gòu)造函數(shù)的拷貝流程

    拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對象時,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象??截悩?gòu)造函數(shù)通常用于:通過使用另一個同類型的對象來初始化新創(chuàng)建的對象。?復(fù)制對象把它作為參數(shù)傳遞給函數(shù)。復(fù)制對象,并從函數(shù)返回這個對象
    2022-05-05
  • C語言調(diào)試手段:鎖定錯誤的實現(xiàn)方法

    C語言調(diào)試手段:鎖定錯誤的實現(xiàn)方法

    本篇文章是對在C語言調(diào)試中,鎖定錯誤的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用鉤子如何鎖定鍵盤的方法分享

    使用鉤子如何鎖定鍵盤的方法分享

    鎖鍵盤一般用鉤子實現(xiàn),所以難度稍大,不過下面這個程序當(dāng)簡單,而且連鉤子所需要DLL也省了
    2014-01-01
  • OpenCV圖像分割中的分水嶺算法原理與應(yīng)用詳解

    OpenCV圖像分割中的分水嶺算法原理與應(yīng)用詳解

    這篇文章主要為大家詳細介紹了OpenCV圖像分割中的分水嶺算法原理與應(yīng)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++用函數(shù)對算法性能進行測試

    C++用函數(shù)對算法性能進行測試

    算法無處不在,算法是程序的靈魂,而數(shù)據(jù)結(jié)構(gòu)則是程序的骨架,二者共同構(gòu)成了程序,那么如何評估算法的性能呢?理論上可以通過計算時間復(fù)雜度的方法來評估,但這是理性的認識,我們還有一種直觀的評估方法,那就是程序執(zhí)行的時間
    2022-08-08

最新評論