C++实现邮件群发的方法
本文实例讲述了C++实现邮件群发的方法。分享给大家供大家参考。具体如下:
关于生成随机QQ邮箱不精确的问题,在之后版本打算另写一个采集器插件进行帐号采集,所以,这个软件只用来进行内容发送,邮箱进行随机生成
如果你已经有采集来的QQ号,请复制到SendList.txt替换内容即可
可以直接复制HTML代码到邮件内容,保存即可。目前邮件内容最大设置为10000字节,如果有增大的必要,欢迎提交留言。
这是我学习后VC编程中涉及到多线程,socket,及一些WINDOWSAPI的宗合应用
使用说明:
一、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、增加干预码
#include"stdafx.h" #include<windows.h> #include<windowsx.h> #include"Resource.h" #include"TabDlg1.h" #include"winsock2.h" #defineMAXSTRING10000 staticintflag=0;//标记是否群发 TCHAR*pTitle=NULL;//指向标题文件内容的指针 HANDLEhThread=NULL;//线程返回句柄 longi=0;//列表控件“行”计数 staticlongsendNum=1;//发送邮件数量 #pragmacomment(lib,"WSOCK32.LIB") externTCHARtcRunPath[MAX_PATH];//程序当前路径目录 externTCHARshortPath[MAX_PATH];//文件路径,TAB2中的全局变量 externTCHARtitlePath[256];//邮件标题文件路径 externTCHARmtPath[256];//邮件内容文件路径 externTCHARsendListPath[MAX_PATH];//发送列表文件路径 externBOOLattach;//是否添加了附件 externTCHARfile[MAXSTRING];//附件部份代码 BOOLWINAPITAB1_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam) { switch(uMsg) { HANDLE_MSG(hWnd,WM_INITDIALOG,TAB1_OnInitDialog); HANDLE_MSG(hWnd,WM_COMMAND,TAB1_OnCommand); HANDLE_MSG(hWnd,WM_CLOSE,TAB1_OnClose); } returnFALSE; } BOOLTAB1_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam) { InitLVColumn(hwnd); InitComboBox(hwnd); returnTRUE; } voidTAB1_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify) { IsChecked(hwnd);//判断勾选框是否被勾选 IsRadioChecked(hwnd);//RADIO控件是否被选择 switch(id) { caseIDC_MAIL_TEST: { if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED&&IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED) { MessageBox(hwnd,TEXT("请选择发QQ邮箱或163信箱"),"",MB_OK); return; } else { flag=0; hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0); } } break; caseIDC_BUTTON_START: { if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED&&IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED) { MessageBox(hwnd,TEXT("请选择发QQ邮箱或163信箱"),"",MB_OK); return; } else { flag=1; hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0); } } break; caseIDC_BUTTON_PAUSE: { if(NULL!=hThread) { SuspendThread(hThread); } else { return; } } break; caseIDC_BUTTON_RESUME: { if(NULL!=hThread) { ResumeThread(hThread); } else { return; } } break; default: break; } } voidTAB1_OnClose(HWNDhwnd) { EndDialog(hwnd,0); } intInitLVColumn(HWNDhwnd)//列表初始化设置,视图选为报表视图 { LVCOLUMNlvColumn; MyLVColumnMyColumn[2]={{TEXT("编号"),0x30,LVCFMT_CENTER},{TEXT("邮箱帐号"),0x99,LVCFMT_CENTER}}; lvColumn.mask=LVCF_TEXT|LVCF_FMT|LVCF_WIDTH|LVCF_SUBITEM; DWORDdwStyle=ListView_GetExtendedListViewStyle(GetDlgItem(hwnd,IDC_LIST));//得到列表当前拓展风格 dwStyle|=LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle|=LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) //dwStyle|=LVS_EX_CHECKBOXES;//item前生成checkbox控件 ListView_SetExtendedListViewStyle(GetDlgItem(hwnd,IDC_LIST),dwStyle);//设置列表扩展风格 for(inti=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); } return0; } intInitComboBox(HWNDhwnd)//窗口控件初始化设置 { HWNDhwndCombo=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("")); return1; } intIsChecked(HWNDhwnd)//checkbox未选中的设置为只读 { 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); return0; } else { EnableWindow(GetDlgItem(hwnd,IDC_BUTTON_START),true); EnableWindow(GetDlgItem(hwnd,IDC_BUTTON_RESUME),true); EnableWindow(GetDlgItem(hwnd,IDC_BUTTON_PAUSE),true); return1; } return0; } intIsRadioChecked(HWNDhwnd)//RADIO控件被选中,则设置相应的SMTP地址 { if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED) { ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com")); return1; } if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED) { ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.163.com")); return2; } return0; } TCHAR*readText1(HWNDhwnd)//读取文件--邮件发送内容 { intnLen=0; FILE*pF=fopen(titlePath,"r");//打开文件 fseek(pF,0,SEEK_END);//文件指针移到文件尾 nLen=ftell(pF);//得到当前指针位置,即是文件的长度 rewind(pF);//文件指针恢复到文件头位置 pTitle=(char*)malloc(sizeof(char)*nLen+1);//动态申请空间,为保存字符串结尾标志\0,多申请一个字符的空间 if(!pTitle) { MessageBox(hwnd,TEXT("内存不够!"),"错误",MB_ICONWARNING); exit(0); } nLen=fread(pTitle,sizeof(char),nLen,pF); pTitle[nLen]='\0';//添加字符串结尾标志 if(IsDlgButtonChecked(hwnd,IDC_CHECK_TITLE)==BST_CHECKED)//是否勾选在邮件标题加入系统当前时间 { SYSTEMTIMEstLocal; GetLocalTime(&stLocal);//得到系统当前时间 TCHARstrTime[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);//在标题后加入系统时间 } fclose(pF);//关闭文件 TCHAR*pText=NULL; pF=fopen(mtPath,"r");//打开文件 fseek(pF,0,SEEK_END); nLen=ftell(pF); rewind(pF); pText=(char*)malloc(sizeof(char)*nLen+1);//动态申请空间,为保存字符串结尾标志\0,多申请一个字符的空间 if(!pText) { MessageBox(hwnd,TEXT("内存不够!"),"错误",MB_ICONWARNING); exit(0); } nLen=fread(pText,sizeof(char),nLen,pF); pText[nLen]='\0';//添加字符串结尾标志 fclose(pF);//关闭文件 TCHARchText[MAXSTRING]; TCHAR*encText=base64_encode(pText,strlen(pText)); strcpy(chText,encText);//BASE64加密结果 free(encText);//释放指针 free(pText);//释放空间 returnchText; } DWORDWINAPIThreadFunc(LPVOIDlpParam)//发邮件线程 { HWNDhwnd=(HWND)lpParam; TCHARuserName[256];//用户帐号 TCHARuserPassWord[256];//用户密码 GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userName,sizeof(userName)/sizeof(TCHAR)); GetDlgItemText(hwnd,IDC_EDIT_USERPASSWORD,userPassWord,sizeof(userPassWord)/sizeof(TCHAR)); TCHAR*name=userName; inti=0; intj=strlen(name); TCHAR*encName=base64_encode(name,j);//给用户名base64加密编码 ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR)); wsprintf(userName,"%s\n",encName);//在加编码后加入回车符 TCHAR*passWord=userPassWord; intk=strlen(passWord); TCHAR*encPassWord=base64_encode(passWord,k);//给用户密码base64加密编码 //intlen=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);*///反编译用户名,如果需要,可以把用户名密码反编后发到指定邮箱。 free(encName);//释放指针 free(encPassWord); //free(dec); if(1==flag)//全局标记,点击群发还是测试,1为群发,0为测试 { HANDLEwFile; intszId; TCHARch; TCHARszState[256]; strcpy(sendListPath,tcRunPath); strcat(sendListPath,"\\SendList.txt");//拼接全路径及文件名 TCHAR*sFileName=sendListPath; FILE*fp=fopen(sFileName,"r"); if(fp==NULL) { returnFALSE;//打开文件失败,则返回,不读取 } fseek(fp,0,SEEK_END); intlength=ftell(fp);//length为0,则是空的 rewind(fp);//把指针移回文件头部还可以用fseek(fp,0,SEEK_SET);效果一样 if(length==0)//判断文件如果为空,则关闭文件,返回, { fclose(fp);//要关闭打开的文件,不然退出时,无法保存 returnFALSE; } while(!feof(fp)) { fscanf(fp,"%s\r\n",szState); SocketQ(hwnd,userName,userPassWord,szState); TCHARsTime[256]; unsignedlongiTime; 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); return0; } voidSocketQ(HWNDhwnd,TCHARuserName[],TCHARuserPassWord[],TCHARszState[])//传入加密的用户名跟密码连接163 { /******************************************************************* 使用Socket的程序在使用Socket之前必须调用WSAStartup函数。 该函数的第一个参数指明程序请求使用的Socket版本, 其中高位字节指明副版本、低位字节指明主版本; 操作系统利用第二个参数返回请求的Socket的版本信息。 当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库, 然后绑定找到的Socket库到该应用程序中。 以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。 该函数执行成功后返回0。 *****************************************************************/ TCHAR*pText; pText=readText1(hwnd); intWSA_return; WSADATAwsaData; WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData);//初始化Socket库 SOCKETsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建SOCKET hostent*host=NULL; SOCKADDR_INsa; sa.sin_family=AF_INET;//设置电线连接服务器端的端口 TCHARcPort[100]; GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR)); intiPort=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 TCHARhost_name[256]=""; ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR)); ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR)); TCHARstr_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; } TCHARbuffer[256];//对话过程 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); intiRet=recv(sock,buffer,256,0);//接收问候语 if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHARHello[]="HELOSMTP\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; } TCHAREhlo[]="EHLOSMTP\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; } TCHARlogin[]="AUTHLOGIN\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);//发送加密的用户名 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);//发送加密的密码 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);//发送加密的用户名 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } send(sock,userPassWord,lstrlen(userPassWord),0);//发送加密的密码 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } } TCHARuserF[256]; TCHARuserL[256]; TCHARtemp[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); TCHARmailFrom[256]; //MessageBox(hwnd,userF,"",MB_OK); wsprintf(mailFrom,TEXT("MAILFROM:<%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; } TCHARmailTo[256]; wsprintf(mailTo,TEXT("RCPTTO:<%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; } TCHARdataCommad[]="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; } //下面是发送正文及附件部份 TCHARdata[50000]; TCHARSetMailHead[1024];//邮件头部信息 wsprintf(SetMailHead,TEXT("To:%s\r\nFrom:%s\r\nSubject:%s\r\n" "Date:2012-8-24\r\nX-Mailer:Kevin'smailer\r\nMIME-Version:1.0\r\n" "Content-Type:multipart/mixed;\r\n" "boundary=\"----=_NextPart_5039E410_D41071F0_120ABDFB\";\r\n" "Thisisamulti-partmessageinMIMEformat.\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;\rcharset=\"gb2312\"\r\n" "Content-Transfer-Encoding:base64\r\n\r\n"),szState,userF,pTitle); strcat(SetMailHead,pText);//邮件头部再加上正文文本内容 strcat(SetMailHead,TEXT("\r\n\r\n")); strcpy(data,SetMailHead); TCHARSetMailHtml[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);//加入邮件内容 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); TCHARcN[]="\r\n.\r\n";//邮件结束标志 send(sock,cN,lstrlen(cN),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHARcQuit[]="QUIT\r\n";//退出命令 send(sock,cQuit,lstrlen(cQuit),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); TCHARcNum[256]; if(SOCKET_ERROR==iRet) { ShowError(); return; } else { TCHARstr[256];//输出已发送列表 wsprintf(str,"%i",sendNum); LVITEMlvItem; lvItem.mask=LVIF_TEXT; lvItem.iSubItem=0; intItemCount=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);//关闭SOCKET WSACleanup(); return; } voidSocket(HWNDhwnd,TCHARuserName[],TCHARuserPassWord[])//传入加密的用户名跟密码连接163 { TCHAR*pText; pText=readText1(hwnd); intWSA_return; WSADATAwsaData; WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData);//初始化Socket库 SOCKETsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); hostent*host=NULL; SOCKADDR_INsa; sa.sin_family=AF_INET;//设置电线连接服务器端的端口 TCHARcPort[100]; GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR)); intiPort=atoi(cPort); sa.sin_port=htons(iPort); HOSTENT*host_entry; TCHARhost_name[256]=""; ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR)); ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR)); TCHARstr_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; } TCHARbuffer[256];//对话过程 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); intiRet=recv(sock,buffer,256,0);//接收问候语 if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHARHello[]="HELOSMTP\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; } TCHAREhlo[]="EHLOSMTP\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; } TCHARlogin[]="AUTHLOGIN\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);//发送加密的用户名 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);//发送加密的密码 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);//发送加密的用户名 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } send(sock,userPassWord,lstrlen(userPassWord),0);//发送加密的密码 ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } } TCHARuserF[256]; TCHARuserL[256]; TCHARtemp[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); TCHARmailFrom[256]; //MessageBox(hwnd,userF,"",MB_OK); wsprintf(mailFrom,TEXT("MAILFROM:<%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; } TCHARmailAdd[256]; GetDlgItemText(hwnd,IDC_EDIT_MAILADD,mailAdd,sizeof(mailAdd)/sizeof(TCHAR)); TCHARmailTo[256]; wsprintf(mailTo,TEXT("RCPTTO:<%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; } TCHARdataCommad[]="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; } //下面是发送正文及附件部份 TCHARdata[50000]; TCHARSetMailHead[1024];//邮件头部信息 wsprintf(SetMailHead,TEXT("To:%s\r\nFrom:%s\r\nSubject:%s\r\n" "Date:2012-8-24\r\nX-Mailer:Kevin'smailer\r\nMIME-Version:1.0\r\n" "Content-Type:multipart/mixed;\r\n" "boundary=\"----=_NextPart_5039E410_D41071F0_120ABDFB\";\r\n" "Thisisamulti-partmessageinMIMEformat.\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;\rcharset=\"gb2312\"\r\n" "Content-Transfer-Encoding:base64\r\n\r\n"),mailAdd,userF,pTitle); strcat(SetMailHead,pText);//邮件头部再加上正文文本内容 strcat(SetMailHead,TEXT("\r\n\r\n")); strcpy(data,SetMailHead); TCHARSetMailHtml[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);//加入邮件内容 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); TCHARcN[]="\r\n.\r\n";//邮件结束标志 send(sock,cN,lstrlen(cN),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); if(SOCKET_ERROR==iRet) { ShowError(); return; } TCHARcQuit[]="QUIT\r\n";//退出命令 send(sock,cQuit,lstrlen(cQuit),0); ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); iRet=recv(sock,buffer,256,0); TCHARcNum[256]; if(SOCKET_ERROR==iRet) { ShowError(); return; } else { MessageBox(hwnd,TEXT("测试发送成功"),TEXT("恭喜"),MB_OK); } free(pTitle);//释放空间 closesocket(sock);//关闭SOCK WSACleanup(); return; } voidShowError() { TCHAR*lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|//自动分配消息缓冲区 FORMAT_MESSAGE_FROM_SYSTEM,//从系统获取信息 NULL,GetLastError(),//获取错误信息标识 MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//使用系统缺省语言 (LPTSTR)&lpMsgBuf,//消息缓冲区 0, NULL); MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR); }
希望本文所述对大家的C++程序设计有所帮助。