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++程序设计有所帮助。