C++实现邮件群发的方法

2023-05-16

这篇文章主要介绍了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 {
 23  switch(uMsg)
 24  {
 25   HANDLE_MSG(hWnd, WM_INITDIALOG, TAB1_OnInitDialog);
 26   HANDLE_MSG(hWnd, WM_COMMAND, TAB1_OnCommand);
 27   HANDLE_MSG(hWnd,WM_CLOSE, TAB1_OnClose);
 28  }
 29  return FALSE;
 30 }
 31 BOOL TAB1_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
 32 {
 33  InitLVColumn(hwnd);
 34  InitComboBox(hwnd);
 35  return TRUE;
 36 }
 37 void TAB1_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
 38 { 
 39  IsChecked(hwnd);   //判断勾选框是否被勾选
 40  IsRadioChecked(hwnd); //RADIO控件是否被选择
 41  switch(id)
 42  {
 43   case IDC_MAIL_TEST:
 44   {  
 45    if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED && IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED)
 46    {
 47     MessageBox(hwnd,TEXT("请选择发QQ邮箱或163信箱"),"",MB_OK);
 48     return;
 49    }
 50    else
 51    {
 52     flag=0;
 53     hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0);
 54    }
 55   }
 56   break;
 57   case IDC_BUTTON_START:
 58   {  
 59    if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)!=BST_CHECKED && IsDlgButtonChecked(hwnd,IDC_RADIO_163)!=BST_CHECKED)
 60    {
 61     MessageBox(hwnd,TEXT("请选择发QQ邮箱或163信箱"),"",MB_OK);
 62     return;
 63    }
 64    else
 65    {
 66     flag=1;
 67     hThread=CreateThread(NULL,0,ThreadFunc,hwnd,0,0);
 68    }
 69   }
 70   break;
 71   case IDC_BUTTON_PAUSE:
 72   {   
 73    if(NULL!=hThread)
 74    {
 75     SuspendThread(hThread); 
 76    }
 77    else
 78    {
 79     return;
 80    }
 81   }
 82   break;
 83   case IDC_BUTTON_RESUME:
 84   {   
 85    if(NULL!=hThread)
 86    {
 87     ResumeThread(hThread); 
 88    }
 89    else
 90    {
 91     return;
 92    }
 93   }
 94   break;
 95   default:
 96   break;
 97  }
 98 }
 99 void TAB1_OnClose(HWND hwnd)
100 {
101  EndDialog(hwnd, 0);
102 }
103 int InitLVColumn(HWND hwnd)    //列表初始化设置,视图选为报表视图
104 {
105  LVCOLUMN lvColumn;
106  MyLVColumn MyColumn[2] = {{TEXT("编号"), 0x30, LVCFMT_CENTER},{TEXT("邮箱帐号"), 0x99, LVCFMT_CENTER}};
107  lvColumn.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH|LVCF_SUBITEM;
108  DWORD dwStyle =ListView_GetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST));   //得到列表当前拓展风格
109  dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(只适用与report风格的listctrl)
110  dwStyle |= LVS_EX_GRIDLINES;  //网格线(只适用与report风格的listctrl)
111 // dwStyle |= LVS_EX_CHECKBOXES;  //item前生成checkbox控件
112  ListView_SetExtendedListViewStyle(GetDlgItem(hwnd, IDC_LIST),dwStyle);     //设置列表扩展风格
113  for(int i = 0; i < 2; i++)
114  {
115   lvColumn.pszText = MyColumn[i].szColumnName;
116   lvColumn.cx = MyColumn[i].cx;
117   lvColumn.fmt = MyColumn[i].fmt;
118   SendDlgItemMessage(hwnd, IDC_LIST, LVM_INSERTCOLUMN, i, (LPARAM)&lvColumn);
119  }
120   
121  return 0;
122 }
123 int InitComboBox(HWND hwnd)//窗口控件初始化设置
124 {
125  HWND hwndCombo=GetDlgItem(hwnd,IDC_COMBO_SLEEPTIME);
126  ComboBox_InsertString(hwndCombo,-1,TEXT("0"));
127  ComboBox_InsertString(hwndCombo,-1,TEXT("1"));
128  ComboBox_InsertString(hwndCombo,-1,TEXT("2"));
129  ComboBox_InsertString(hwndCombo,-1,TEXT("5"));
130  ComboBox_InsertString(hwndCombo,-1,TEXT("10"));
131  ComboBox_InsertString(hwndCombo,-1,TEXT("20"));
132  ComboBox_SetText(hwndCombo,TEXT("0"));
133  SetDlgItemText(hwnd,IDC_EDIT_MAILADD,TEXT("12345678@qq.com"));
134  ComboBox_InsertString(GetDlgItem(hwnd,IDC_COMBO_SMTP),0,TEXT("smtp.qq.com"));
135  ComboBox_InsertString(GetDlgItem(hwnd,IDC_COMBO_SMTP),1,TEXT("smtp.163.com"));
136  ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com"));
137  SetDlgItemText(hwnd,IDC_EDIT_MAILPORT,TEXT("25")); 
138  SetDlgItemText(hwnd,IDC_EDIT_USERNAME,TEXT(""));
139   
140  return 1;
141 }
142 int IsChecked(HWND hwnd)  //checkbox未选中的设置为只读
143 {
144  if(IsDlgButtonChecked(hwnd,IDC_CHECK_QUNFA)!=BST_CHECKED)
145  {
146   EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_START), false);
147   EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_RESUME), false);
148   EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_PAUSE), false);
149   return 0;
150  }
151  else
152  {
153   EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_START), true);
154   EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_RESUME), true);
155   EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_PAUSE), true);
156   return 1;
157  }
158  return 0;
159 }
160 int IsRadioChecked(HWND hwnd) //RADIO控件被选中,则设置相应的SMTP 地址
161 {
162  if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED)
163  {
164   ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.qq.com"));
165   return 1;
166  }
167  if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED)
168  {
169   ComboBox_SetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),TEXT("smtp.163.com"));
170   return 2;
171  }
172  return 0;
173 }
174 TCHAR* readText1(HWND hwnd)    //读取文件--邮件发送内容
175 {
176  int nLen = 0;
177  FILE *pF = fopen(titlePath , "r"); //打开文件
178  fseek(pF, 0, SEEK_END);    //文件指针移到文件尾
179  nLen = ftell(pF);     //得到当前指针位置, 即是文件的长度
180  rewind(pF);       //文件指针恢复到文件头位置
181  pTitle = (char*) malloc(sizeof(char)*nLen+1);//动态申请空间, 为保存字符串结尾标志\0, 多申请一个字符的空间
182  if(!pTitle)
183  {
184   MessageBox(hwnd,TEXT("内存不够!"),"错误",MB_ICONWARNING);
185   exit(0);
186  }
187  nLen = fread(pTitle, sizeof(char), nLen, pF);
188  pTitle[nLen] = '\0';   //添加字符串结尾标志
189  if(IsDlgButtonChecked(hwnd,IDC_CHECK_TITLE)==BST_CHECKED) //是否勾选在邮件标题 加入系统当前时间
190  {
191   SYSTEMTIME stLocal;
192   GetLocalTime(&stLocal); //得到系统当前时间
193   TCHAR strTime[256];
194   ZeroMemory(strTime,sizeof(strTime)/sizeof(TCHAR));
195   wsprintf(strTime,"%04u-%02u-%02u %02u:%02u:%02u",stLocal.wYear,stLocal.wMonth,stLocal.wDay,stLocal.wHour,stLocal.wMinute,stLocal.wSecond);
196   strcat(pTitle,strTime); //在标题后加入系统时间
197  }
198  fclose(pF);     //关闭文件
199  TCHAR* pText = NULL;
200  pF = fopen(mtPath , "r"); //打开文件
201  fseek(pF, 0, SEEK_END); 
202  nLen = ftell(pF); 
203  rewind(pF); 
204  pText = (char*) malloc(sizeof(char)*nLen+1); //动态申请空间, 为保存字符串结尾标志\0, 多申请一个字符的空间
205  if(!pText)
206  {
207   MessageBox(hwnd,TEXT("内存不够!"),"错误",MB_ICONWARNING);
208   exit(0);
209  }
210  nLen = fread(pText, sizeof(char), nLen, pF);
211  pText[nLen] = '\0';   //添加字符串结尾标志
212  fclose(pF);     //关闭文件
213  TCHAR chText[MAXSTRING];  
214  TCHAR* encText=base64_encode(pText,strlen(pText));  
215  strcpy(chText,encText);  //BASE64加密结果
216  free(encText);    //释放指针
217  free(pText);     //释放空间
218  return chText;
219 }
220 DWORD WINAPI ThreadFunc(LPVOID lpParam)//发邮件线程
221 {
222  HWND hwnd=(HWND)lpParam;
223  TCHAR userName[256];    //用户帐号
224  TCHAR userPassWord[256];   //用户密码
225  GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userName,sizeof(userName)/sizeof(TCHAR));
226  GetDlgItemText(hwnd,IDC_EDIT_USERPASSWORD,userPassWord,sizeof(userPassWord)/sizeof(TCHAR));
227  TCHAR *name=userName; 
228  int i = 0; 
229  int j = strlen(name); 
230  TCHAR *encName = base64_encode(name, j);    //给用户名base64加密编码  
231  ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR)); 
232  wsprintf(userName,"%s\n", encName);      //在加编码后加入回车符
233  TCHAR *passWord=userPassWord; 
234  int k = strlen(passWord); 
235  TCHAR *encPassWord = base64_encode(passWord, k);  //给用户密码base64加密编码    
236  // int len = strlen(enc); 
237  // TCHAR *dec = base64_decode(enc, len);    //反编 
238  ZeroMemory(userPassWord,sizeof(userPassWord)/sizeof(TCHAR)); 
239  wsprintf(userPassWord,"%s\n", encPassWord);
240  /*ZeroMemory(userName,sizeof(userName)/sizeof(TCHAR)); 
241  wsprintf(userName,"\ndecoded : %s", dec);
242  MessageBox(hwnd,userName,"",MB_OK);*/     //反编译用户名,如果需要,可以把用户名密码反编后发到指定邮箱。
243  free(encName);           //释放指针
244  free(encPassWord);
245  //free(dec); 
246  if(1==flag)            //全局标记,点击群发还是测试,1为群发,0为测试
247  {
248    HANDLE wFile;
249    int szId;
250    TCHAR ch;
251    TCHAR szState[256];
252    strcpy(sendListPath,tcRunPath);
253    strcat(sendListPath,"\\SendList.txt");   //拼接全路径及文件名
254    TCHAR *sFileName=sendListPath;
255    FILE *fp=fopen(sFileName,"r");
256    if(fp==NULL)
257    {
258     return FALSE;        //打开文件失败,则返回,不读取
259    }
260    fseek(fp, 0, SEEK_END);
261    int length = ftell(fp);      //length为0,则是空的
262    rewind(fp);         //把指针移回文件头部 还可以用 fseek(fp, 0, SEEK_SET);效果一样
263    if(length==0)         //判断文件如果为空,则关闭文件,返回,
264    {
265     fclose(fp);        //要关闭打开的文件,不然退出时,无法保存
266     return FALSE;
267    }
268    while(!feof(fp))
269    { 
270     fscanf(fp,"%s\r\n",szState);
271     SocketQ(hwnd,userName,userPassWord,szState);
272     TCHAR sTime[256];    
273     unsigned long iTime;
274     ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SLEEPTIME),sTime,sizeof(sTime)/sizeof(TCHAR));
275     iTime=atoi(sTime);
276     iTime=iTime*1000;
277     Sleep(iTime);
278    } 
279    fclose(fp);
280  }
281  else
282  {
283   Socket(hwnd,userName,userPassWord); 
284  }
285  CloseHandle(hThread); 
286  return 0;
287 }
288 void SocketQ(HWND hwnd,TCHAR userName[],TCHAR userPassWord[],TCHAR szState[])//传入加密的用户名跟密码连接163
289 {
290    /*******************************************************************
291    使用Socket的程序在使用Socket之前必须调用WSAStartup函数。
292    该函数的第一个参数指明程序请求使用的Socket版本,
293    其中高位字节指明副版本、低位字节指明主版本;
294    操作系统利用第二个参数返回请求的Socket的版本信息。
295    当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,
296    然后绑定找到的Socket库到该应用程序中。
297    以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
298    该函数执行成功后返回0。
299    *****************************************************************/
300   TCHAR* pText;
301   pText = readText1(hwnd);
302   int WSA_return;
303   WSADATA wsaData;   
304   WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData);   //初始化Socket库  
305   SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建SOCKET
306   hostent* host = NULL; 
307   SOCKADDR_IN sa;
308   sa.sin_family=AF_INET;         //设置电线连接服务器端的端口
309   TCHAR cPort[100];
310   GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR));
311   int iPort=atoi(cPort);
312   sa.sin_port = htons(iPort);   
313   //sa.sin_addr.S_un.S_addr = inet_addr("123.58.178.203");//可以写死IP地址   
314    HOSTENT *host_entry;         //存放主机域名,如smtp.qq.com
315    TCHAR host_name[256]="";
316    ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR)); 
317    ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR));
318    TCHAR str_ipAdd[256];
319    if(WSA_return==0)
320    {
321    host_entry=gethostbyname(host_name);     // 要解析的域名或主机名 
322    if(host_entry!=NULL)
323    {
324    wsprintf(str_ipAdd,"%d.%d.%d.%d",
325     (host_entry->h_addr_list[0][0]&0x00ff),
326     (host_entry->h_addr_list[0][1]&0x00ff),
327     (host_entry->h_addr_list[0][2]&0x00ff),
328     (host_entry->h_addr_list[0][3]&0x00ff));
329      
330    }
331    }
332   sa.sin_addr.S_un.S_addr = inet_addr(str_ipAdd);   //得到域名IP地址
333   if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
334   {
335   ShowError();
336   return;
337   }
338   TCHAR buffer[256];          //对话过程  
339   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));
340   int iRet=recv(sock,buffer,256,0);      //接收问候语  
341   if(SOCKET_ERROR==iRet)
342   {
343    ShowError();   
344    return;
345   }
346   TCHAR Hello[] = "HELO SMTP\r\n";      //注意不能忘了末尾的回车  
347   send(sock,Hello,lstrlen(Hello),0); 
348   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
349   iRet=recv(sock,buffer,256,0);
350   if(SOCKET_ERROR==iRet)
351   {
352    ShowError();   
353    return;
354   }
355   TCHAR Ehlo[] = "EHLO SMTP\r\n";  
356   send(sock,Ehlo,lstrlen(Ehlo),0); 
357   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
358   iRet=recv(sock,buffer,256,0);
359   if(SOCKET_ERROR==iRet)
360   {
361    ShowError();   
362    return;
363   }
364   TCHAR login[] = "AUTH LOGIN\r\n";      //登陆命令
365   send(sock,login,lstrlen(login),0); 
366   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
367   iRet=recv(sock,buffer,256,0);
368   if(SOCKET_ERROR==iRet)
369   {
370    ShowError();   
371    return;
372   }
373   if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED)
374   {
375    strcat(userName,"\r\n");
376    send(sock,userName,lstrlen(userName),0);   //发送加密的用户名
377    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
378    iRet=recv(sock,buffer,256,0);
379    if(SOCKET_ERROR==iRet)
380    {
381     ShowError();   
382     return;
383    }
384    strcat(userPassWord,"\r\n");
385    send(sock,userPassWord,lstrlen(userPassWord),0); //发送加密的密码
386    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
387    iRet=recv(sock,buffer,256,0);
388    if(SOCKET_ERROR==iRet)
389    {
390     ShowError();   
391     return;
392    }
393   }
394   if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED)
395   {
396    send(sock,userName,lstrlen(userName),0);   //发送加密的用户名
397    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
398    iRet=recv(sock,buffer,256,0);
399    if(SOCKET_ERROR==iRet)
400    {
401     ShowError();   
402     return;
403    }
404    send(sock,userPassWord,lstrlen(userPassWord),0); //发送加密的密码
405    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
406    iRet=recv(sock,buffer,256,0);
407    if(SOCKET_ERROR==iRet)
408    {
409     ShowError();   
410     return;
411    }
412   }
413   TCHAR userF[256];
414   TCHAR userL[256];
415   TCHAR temp[256];
416   GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userF,sizeof(userF)/sizeof(TCHAR)); 
417   ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),temp,sizeof(host_name)/sizeof(TCHAR));
418   strcat(userF,"@");
419   strncpy(userL,temp+5,sizeof(userL));
420   strcat(userF,userL);
421   TCHAR mailFrom[256];
422   //MessageBox(hwnd,userF,"",MB_OK);
423   wsprintf(mailFrom,TEXT("MAIL FROM:<%s>\r\n"),userF);
424   send(sock,mailFrom,lstrlen(mailFrom),0);
425   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
426   iRet=recv(sock,buffer,256,0);
427   if(SOCKET_ERROR==iRet)
428   {
429    ShowError();   
430    return;
431   }
432    TCHAR mailTo[256];
433    wsprintf(mailTo,TEXT("RCPT TO:<%s>\r\n"),szState);
434    send(sock,mailTo,lstrlen(mailTo),0);
435    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
436    iRet=recv(sock,buffer,256,0);
437    if(SOCKET_ERROR==iRet)
438    {
439     ShowError();   
440     return;
441    }
442   TCHAR dataCommad[]="DATA\r\n";
443   send(sock,dataCommad,lstrlen(dataCommad),0); 
444   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
445   iRet=recv(sock,buffer,256,0);
446   if(SOCKET_ERROR==iRet)
447   {
448    ShowError();   
449    return;
450   }
451   //下面是发送正文及附件部份
452   TCHAR data[50000];
453   TCHAR SetMailHead[1024];      //邮件头部信息
454   wsprintf(SetMailHead,TEXT("To:%s\r\nFrom:%s\r\nSubject: %s\r\n"
455          "Date:2012-8-24\r\nX-Mailer:Kevin's mailer\r\nMIME-Version:1.0\r\n"
456          "Content-Type: multipart/mixed;\r\n"
457          " boundary=\"----=_NextPart_5039E410_D41071F0_120ABDFB\";\r\n"
458          "This is a multi-part message in MIME format.\r\n\r\n"
459          "------=_NextPart_5039E410_D41071F0_120ABDFB\r\n"
460          "Content-Type: multipart/alternative;\r\n"
461          " boundary=\"----=_NextPart_5039E410_D41071F0_53510C95\";\r\n\r\n"
462          "------=_NextPart_5039E410_D41071F0_53510C95\r\n"
463          "Content-Type: text/plain;\r charset=\"gb2312\"\r\n"
464          "Content-Transfer-Encoding: base64\r\n\r\n"),szState,userF,pTitle);
465   strcat(SetMailHead,pText);     //邮件头部再加上正文文本内容
466   strcat(SetMailHead,TEXT("\r\n\r\n"));
467   strcpy(data,SetMailHead);
468   TCHAR SetMailHtml[1024];     //邮件HTML代码部份
469   wsprintf(SetMailHtml,TEXT("------=_NextPart_5039E410_D41071F0_53510C95\r\n"
470          "Content-Type: text/html;\r\n"
471          " charset=\"gb2312\"\r\n"
472          "Content-Transfer-Encoding: base64\r\n\r\n"));
473   strcat(SetMailHtml,pText);     //加入邮件内容
474   strcat(SetMailHtml,TEXT("\r\n\r\n------=_NextPart_5039E410_D41071F0_53510C95--\r\n\r\n"));
475   strcat(data,SetMailHtml);
476   if(TRUE==attach)       //判断是否添加了附件路径
477   {
478    strcat(data,file);      //加入附件部份代码
479    strcat(data,TEXT("------=_NextPart_5039E410_D41071F0_120ABDFB--\r\n"));
480   }
481   send(sock,data,lstrlen(data),0);
482   TCHAR cN[]="\r\n.\r\n";     //邮件结束标志
483   send(sock,cN,lstrlen(cN),0);
484   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
485   iRet=recv(sock,buffer,256,0);
486    if(SOCKET_ERROR==iRet)
487    {
488     ShowError();   
489     return;
490    }
491   TCHAR cQuit[] = "QUIT\r\n";     //退出命令
492   send(sock,cQuit,lstrlen(cQuit),0); 
493   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
494   iRet=recv(sock,buffer,256,0);
495   TCHAR cNum[256];
496   if(SOCKET_ERROR==iRet)
497   {
498    ShowError();   
499    return;
500   }  
501   else
502   { 
503    TCHAR str[256];      //输出已发送列表
504    wsprintf(str,"%i",sendNum);
505    LVITEM lvItem;
506    lvItem.mask = LVIF_TEXT;
507    lvItem.iSubItem = 0;
508    int ItemCount = ListView_GetItemCount(GetDlgItem(hwnd, IDC_LIST));
509    lvItem.iItem = ItemCount; 
510    lvItem.pszText = str;
511    SendDlgItemMessage(hwnd, IDC_LIST, LVM_INSERTITEM, 0, (LPARAM)&lvItem); 
512    ListView_SetItemText(GetDlgItem(hwnd, IDC_LIST), i++, 1, szState);       
513    sendNum++;
514   }
515   free(pTitle);        //释放空间  
516   closesocket(sock);       //关闭SOCKET 
517   WSACleanup();
518   return;
519 }
520 void Socket(HWND hwnd,TCHAR userName[],TCHAR userPassWord[])//传入加密的用户名跟密码连接163
521 {
522   TCHAR* pText;
523   pText = readText1(hwnd);
524   int WSA_return;
525   WSADATA wsaData;   
526   WSA_return=WSAStartup(MAKEWORD(2,0),&wsaData);//初始化Socket库
527   SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
528   hostent* host = NULL; 
529   SOCKADDR_IN sa;
530   sa.sin_family=AF_INET;      //设置电线连接服务器端的端口
531   TCHAR cPort[100];
532   GetDlgItemText(hwnd,IDC_EDIT_MAILPORT,cPort,sizeof(cPort)/sizeof(TCHAR));
533   int iPort=atoi(cPort);
534   sa.sin_port = htons(iPort);  
535    HOSTENT *host_entry;
536    TCHAR host_name[256]="";
537    ZeroMemory(host_name,sizeof(host_name)/sizeof(TCHAR)); 
538    ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),host_name,sizeof(host_name)/sizeof(TCHAR));
539    TCHAR str_ipAdd[256];
540    if(WSA_return==0)
541    {   
542    host_entry=gethostbyname(host_name); // 即要解析的域名或主机名 
543     if(host_entry!=NULL)
544     {
545      wsprintf(str_ipAdd,"%d.%d.%d.%d",
546     (host_entry->h_addr_list[0][0]&0x00ff),
547     (host_entry->h_addr_list[0][1]&0x00ff),
548     (host_entry->h_addr_list[0][2]&0x00ff),
549     (host_entry->h_addr_list[0][3]&0x00ff));
550       
551     }
552    }
553   sa.sin_addr.S_un.S_addr = inet_addr(str_ipAdd);  
554   if(connect(sock,(SOCKADDR *)&sa,sizeof(sa))==SOCKET_ERROR)
555   {
556    ShowError();
557    return; 
558   }
559   TCHAR buffer[256];      //对话过程 
560   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR));  
561   int iRet=recv(sock,buffer,256,0);  //接收问候语 
562   if(SOCKET_ERROR==iRet)
563   {
564    ShowError();   
565    return;
566   }
567   TCHAR Hello[] = "HELO SMTP\r\n";  //注意不能忘了末尾的回车 
568   send(sock,Hello,lstrlen(Hello),0); 
569   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
570   iRet=recv(sock,buffer,256,0);
571   if(SOCKET_ERROR==iRet)
572   {
573    ShowError();   
574    return;
575   }
576   TCHAR Ehlo[] = "EHLO SMTP\r\n";  
577   send(sock,Ehlo,lstrlen(Ehlo),0); 
578   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
579   iRet=recv(sock,buffer,256,0);
580   if(SOCKET_ERROR==iRet)
581   {
582    ShowError();   
583    return;
584   }
585   TCHAR login[] = "AUTH LOGIN\r\n";      //登陆命令
586   send(sock,login,lstrlen(login),0); 
587   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
588   iRet=recv(sock,buffer,256,0);
589   if(SOCKET_ERROR==iRet)
590   {
591    ShowError();   
592    return;
593   }
594   if(IsDlgButtonChecked(hwnd,IDC_RADIO_QQ)==BST_CHECKED)
595   {
596    strcat(userName,"\r\n");
597    send(sock,userName,lstrlen(userName),0);   //发送加密的用户名
598    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
599    iRet=recv(sock,buffer,256,0);
600    if(SOCKET_ERROR==iRet)
601    {
602     ShowError();   
603     return;
604    }
605    strcat(userPassWord,"\r\n");
606    send(sock,userPassWord,lstrlen(userPassWord),0); //发送加密的密码
607 // 何问起 hovertree.com
608    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
609    iRet=recv(sock,buffer,256,0);
610    if(SOCKET_ERROR==iRet)
611    {
612     ShowError();   
613     return;
614    }
615   }
616   if(IsDlgButtonChecked(hwnd,IDC_RADIO_163)==BST_CHECKED)
617   {
618    send(sock,userName,lstrlen(userName),0);   //发送加密的用户名
619    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
620    iRet=recv(sock,buffer,256,0);
621    if(SOCKET_ERROR==iRet)
622    {
623     ShowError();   
624     return;
625    }
626    send(sock,userPassWord,lstrlen(userPassWord),0); //发送加密的密码
627    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
628    iRet=recv(sock,buffer,256,0);
629    if(SOCKET_ERROR==iRet)
630    {
631     ShowError();   
632     return;
633    }
634   }
635   TCHAR userF[256];
636   TCHAR userL[256];
637   TCHAR temp[256];
638   GetDlgItemText(hwnd,IDC_EDIT_USERNAME,userF,sizeof(userF)/sizeof(TCHAR)); 
639   ComboBox_GetText(GetDlgItem(hwnd,IDC_COMBO_SMTP),temp,sizeof(host_name)/sizeof(TCHAR));
640   strcat(userF,"@");
641   strncpy(userL,temp+5,sizeof(userL));
642   strcat(userF,userL);
643   TCHAR mailFrom[256];
644   //MessageBox(hwnd,userF,"",MB_OK);
645   wsprintf(mailFrom,TEXT("MAIL FROM:<%s>\r\n"),userF);
646   send(sock,mailFrom,lstrlen(mailFrom),0);
647   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
648   iRet=recv(sock,buffer,256,0);
649   if(SOCKET_ERROR==iRet)
650   {
651    ShowError();   
652    return;
653   }
654    TCHAR mailAdd[256];
655    GetDlgItemText(hwnd,IDC_EDIT_MAILADD,mailAdd,sizeof(mailAdd)/sizeof(TCHAR));
656    TCHAR mailTo[256];
657    wsprintf(mailTo,TEXT("RCPT TO:<%s>\r\n"),mailAdd);
658    send(sock,mailTo,lstrlen(mailTo),0);
659    ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
660    iRet=recv(sock,buffer,256,0);
661    if(SOCKET_ERROR==iRet)
662    {
663     ShowError();   
664     return;
665    }
666   TCHAR dataCommad[]="DATA\r\n";
667   send(sock,dataCommad,lstrlen(dataCommad),0); 
668   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
669   iRet=recv(sock,buffer,256,0);
670   if(SOCKET_ERROR==iRet)
671   {
672    ShowError();   
673    return;
674   }
675   //下面是发送正文及附件部份
676   TCHAR data[50000];
677   TCHAR SetMailHead[1024];      //邮件头部信息
678   wsprintf(SetMailHead,TEXT("To:%s\r\nFrom:%s\r\nSubject: %s\r\n"
679          "Date:2012-8-24\r\nX-Mailer:Kevin's mailer\r\nMIME-Version:1.0\r\n"
680          "Content-Type: multipart/mixed;\r\n"
681          " boundary=\"----=_NextPart_5039E410_D41071F0_120ABDFB\";\r\n"
682          "This is a multi-part message in MIME format.\r\n\r\n"
683          "------=_NextPart_5039E410_D41071F0_120ABDFB\r\n"
684          "Content-Type: multipart/alternative;\r\n"
685          " boundary=\"----=_NextPart_5039E410_D41071F0_53510C95\";\r\n\r\n"
686          "------=_NextPart_5039E410_D41071F0_53510C95\r\n"
687          "Content-Type: text/plain;\r charset=\"gb2312\"\r\n"
688          "Content-Transfer-Encoding: base64\r\n\r\n"),mailAdd,userF,pTitle);
689   strcat(SetMailHead,pText);      //邮件头部再加上正文文本内容
690   strcat(SetMailHead,TEXT("\r\n\r\n"));
691   strcpy(data,SetMailHead);
692   TCHAR SetMailHtml[1024];      //邮件HTML代码部份
693   wsprintf(SetMailHtml,TEXT("------=_NextPart_5039E410_D41071F0_53510C95\r\n"
694          "Content-Type: text/html;\r\n"
695          " charset=\"gb2312\"\r\n"
696          "Content-Transfer-Encoding: base64\r\n\r\n"));
697   strcat(SetMailHtml,pText);      //加入邮件内容
698   strcat(SetMailHtml,TEXT("\r\n\r\n------=_NextPart_5039E410_D41071F0_53510C95--\r\n\r\n"));
699   strcat(data,SetMailHtml);
700   if(TRUE==attach)        //判断是否添加了附件路径
701   {
702    strcat(data,file);       //加入附件部份代码
703    strcat(data,TEXT("------=_NextPart_5039E410_D41071F0_120ABDFB--\r\n"));
704   }
705   send(sock,data,lstrlen(data),0);
706   TCHAR cN[]="\r\n.\r\n";      //邮件结束标志
707   send(sock,cN,lstrlen(cN),0);
708   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
709   iRet=recv(sock,buffer,256,0);
710   if(SOCKET_ERROR==iRet)
711   {
712    ShowError();   
713    return;
714   }
715   TCHAR cQuit[] = "QUIT\r\n";      //退出命令
716   send(sock,cQuit,lstrlen(cQuit),0); 
717   ZeroMemory(buffer,sizeof(buffer)/sizeof(TCHAR)); 
718   iRet=recv(sock,buffer,256,0);
719   TCHAR cNum[256];
720   if(SOCKET_ERROR==iRet)
721   {
722    ShowError();   
723    return;
724   }  
725   else
726   {  
727    MessageBox(hwnd,TEXT("测试发送成功"),TEXT("恭喜"),MB_OK);
728   }
729    free(pTitle);         //释放空间
730   closesocket(sock);        //关闭SOCK  
731   WSACleanup();
732   return;
733 }
734 void ShowError()
735 {
736  TCHAR* lpMsgBuf;
737  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|  //自动分配消息缓冲区
738  FORMAT_MESSAGE_FROM_SYSTEM,      //从系统获取信息
739  NULL,GetLastError(),        //获取错误信息标识
740  MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),   //使用系统缺省语言
741  (LPTSTR)&lpMsgBuf,        //消息缓冲区
742  0,
743  NULL);
744  MessageBox(NULL,lpMsgBuf,"",MB_ICONERROR); 
745 }  

希望本文所述对大家的C++程序设计有所帮助。

推荐:http://www.cnblogs.com/roucheng/p/cppjy.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现邮件群发的方法 的相关文章

  • C++从1~m数字中任取k个元素,求所有组合算法

    define MAXN 100 int a MAXN 定位数组 用于指示选取元素集合数组的位置 xff0c 选取元素集合数组0 起始 void comb int m int r int cur 指示定位数组中哪个成员正在移进 unsigne
  • 宏的本质以及宏(包括函数式宏) 没有返回值概念

    由什么问题而引申的 xff1a 字符串 XX ENM USB 中的XX是会变的 xff0c 想写一个宏定义来表示该字符串 首先 xff0c 想到用 define STR xff08 x xff09 x 34 ENM USB 形式 xff0c
  • windows环境下curl报错:Protocol "'http" not supported or disabled in libcurl

    原因 xff1a window命令行不支持单括号引用 解决方案 xff1a 将单括号删除 例如 xff1a curl http localhost 9200 pretty 在window命令行应改为 xff1a curl http loca
  • 关于Gson解析失败:Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

    找了半天 xff0c 终于搞定了 xff0c 不得不说 xff0c 这是个坚强的bug 真的是个坚强的bug 一把辛酸了 xff0c xff0c 啥也不说了 xff0c 希望遇到一样坑的小伙伴 别放弃 xff0c 你们还有我 哈哈 解决办法
  • Python+pandas+每天股票涨了多少

    第一步 xff1a 得到某支股票历年来的交易数据 方法见 xff1a https blog csdn net zwy 0309 article details 108217342 在此 xff0c 我使用以下脚本得到股票 xff08 代码
  • 通过串口实时打印Android内核调试log信息

    一 前言 在调试 Android的Linux内核时 xff0c 我们往往会通过打开对应模块的调试Log来查看一些关键信息 通常我们可以使用一些简单的查看方法 xff0c 比如 xff1a 在pc端装有adb工具时 xff0c 使用adb s
  • Spring XML配置文件详解

    spring配置文件是用于指导Spring工厂进行Bean生产 依赖关系注入 xff08 装配 xff09 及Bean实例分发的 34 图纸 34 Spring框架的配置文件是基于xml的 xff0c Spring强大的功能依赖于类型繁多的
  • 两行命令解决ubuntu22.04安装网易云音乐后点击图标无反应的问题

    感谢知乎用户 64 拉布 xff1a https zhuanlan zhihu com p 518108518 1 终端中输入以下命令 xff1a span class token builtin class name cd span op
  • 数据库MVCC多版本并发控制原理

    MVCC实现原理 频繁的加锁会带来什么问题 xff1f 读数据的时候没办法修改 修改数据的时候没办法读取 xff0c 极大的降低了数据库性能 数据库是如何解决加锁后的性能问题的 xff1f MVCC 多版本控制实现读取数据不用加锁 xff0
  • 学习笔记-----ButterKnife

    ButterKnife是一个专注于Android系统的View注入框架 ButterKnife bind this 一切findViewById Fragment Adapter中同样适用 xff0c ButterKnife bind th
  • 【Linux】vim 中批量添加注释

    本期主题 xff1a vim 中批量添加注释博客主页 xff1a 小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限 xff0c 出现错误希望大家不吝赐 此文主要介绍两种方法 xff1a 方法一 xff1a 块选择模式
  • Exported service does not require permission警告

    很久没写过应用了 xff0c 今天写一个Service时 xff0c 在manifest文件的 lt service gt 标签发现了这个警告 lt service android name 61 34 SendService 34 gt
  • Windows服务器高并发处理IOCP(完成端口)详细说明

    本系列里完成端口的代码在两年前就已经写好了 xff0c 但是由于许久没有写东西了 xff0c 不知该如何提笔 xff0c 所以这篇文档总是在酝酿之中 酝酿了两年之后 xff0c 终于决定开始动笔了 xff0c 但愿还不算晚 这篇文档我非常详
  • linux下如何测试端口通不通(四种方法)

    一般情况下使用 34 telnet ip port 34 判断端口通不通 接下来通过本文给大家分享四种方法测试端口通不通 xff0c 感兴趣的朋友一起学习吧 一般情况下使用 34 telnet ip port 34 判断端口通不通 xff0
  • 教你Vim编辑器,如何删除一行或者多行内容

    如何从Vim中删除行 xff1f 如何删除多行 xff1f 本文介绍在Vim编辑器中删除行的不同方法文内含长段代码可复制可往左滑 xff0c 希望对大家有帮助 xff01 安装Vim 在Ubuntu Debian中的安装方式 sudo ap
  • VBoxManage常用命令用法

    VBoxManage命令常用用法 系统环境 xff1a CentOS 7 3 x86 64 VirtualBox版本 xff1a 6 1 22 VirtualBox扩展版本 xff1a 6 1 22 增加一个新的扩展包 VBoxManage
  • Centos7安装Redis

    一 安装gcc依赖 由于 redis 是用 C 语言开发 xff0c 安装之前必先确认是否安装 gcc 环境 xff08 gcc v xff09 xff0c 如果没有安装 xff0c 执行以下命令进行安装 root 64 localhost
  • webRTC中的coturn服务安装

    目录 1 先准备一台云主机 2 安装coturn的依赖 2 1 依赖软件准备 2 1 安装依赖组件 2 2 安装coturn的持久化保存用户信息库 3 安装coturn 4 coturn配置 4 1 创建用户 4 2 配置说明 4 3 收集
  • Git配置.gitignore忽略文件

    git设置忽略文件和目录有两种方式 xff0c 一种是项目所有人员共用的的 xff0c 一种是开发自己使用的 第一种 xff0c 所有开发者共用的需要把设置设定在 gitignore该文件中 第二种 xff0c 开发者个人使用的忽略配置 x
  • 线程池实现原理

    创建线程有哪几种方式 一 继承Thread类创建线程类 xff08 1 xff09 定义Thread类的子类 xff0c 并重写该类的run方法 xff0c 该run方法的方法体就代表了线程要完成的任务 因此把run 方法称为执行体 xff

随机推荐

  • linux查看cpu与内存

    查看cpu 第一种方法 xff1a top命令法 1 首先执行top命令 xff1b 2 在top命令的显示界面 xff0c 按数据键1 xff0c 即可查看到当前系统中的总cpu数 xff1b 第二种方法 xff1a 通过proc文件系统
  • Element 布局组件el-row和el-col 详解

    1 背景 element的布局方式与bootstrap原理是一样的 xff0c 将网页划分成若干行 xff0c 然后每行等分为若干列 xff0c 基于这样的方式进行布局 xff0c 形象的成为栅栏布局 区别是element可将每行划分为24
  • netbeans中配置maven

    deploy 发布到远程maven库 本节默认maven库为nexus netbeans中按ctrl 43 1 xff0c 打开Project窗口 xff1b 在Project窗口中找到相关的project或module 在项目名上点击鼠标
  • 订阅关系一致

    订阅关系一致指的是同一个消费者Group ID下所有Consumer实例所订阅的Topic Tag必须完全一致 如果订阅关系不一致 消息消费的逻辑就会混乱 甚至导致消息丢失 本文提供订阅关系一致的正确示例代码以及订阅关系不一致的可能原因 帮
  • java之PO,VO,TO,QO,BO等

    PO persistant object 持久对象 在 o r 映射的时候出现的概念 xff0c 如果没有 o r 映射 xff0c 没有这个概念存在了 通常对应数据模型 数据库 xff0c 本身还有部分业务逻辑的处理 可以看成是与数据库中
  • 多生产者多消费者问题的无锁队列实现

    背景 代码根据论文 Implementing Lock Free Queues 复现 背景知识博客 xff1a 左耳朵耗子博客 https coolshell cn articles 8239 html 代码地址 xff1a https g
  • Ubuntu18下Github+Hexo搭建博客教程

    我的博客 xff0c 欢迎来访 xff1a www zxwsbg cn 搭建 安装git nodejs sudo apt get install git sudo apt get install nodejs sudo apt get in
  • linux中提供了PF_PACKET接口可以操作链路层的数据

    http blog sina com cn s blog 82f2fc28010132og html sock raw xff08 注意一定要在root下使用 xff09 原始套接字编程可以接收到本机网卡上的数据帧或者数据包 对于监听网络的
  • 分享52个Java源码,总有一款适合您

    Java源码 分享52个Java源码 xff0c 总有一款适合您 下面是文件的名字 xff0c 我放了一些图片 xff0c 文章里不是所有的图主要是放不下 xff0c 大家下载后可以看到 源码下载链接 xff1a https pan bai
  • 抽象类中的方法该如何实现呢?

    本节通过一个案例来学习如何实现抽象类中的方法 xff0c 具体步骤如下 xff1a 1 创建Animal类 创建一个Animal抽象类 xff0c 并在类中定义一个抽象call 方法 xff0c 如文件3 25所示 文件3 25Animal
  • zset类型的底层数据结构的实现

    参考资料 xff1a redis中zset底层实现原理 渣渣 CSDN博客 zset底层数据结构 redis的zset数据结构 xff1a 跳表 知乎 zset类型的底层数据结构的实现 xff1f zset是Redis提供的一个非常特别的数
  • XD软件都有哪些基础操作?

    下面我们来学习一下XD软件的基础操作 xff0c 包括资产面板的功能 交互动作 一键切图等等 1 重复网格 xff08 1 xff09 重复网格可智能复制其选择对象 xff0c 并批量更换图片 修改文字 之间距离等 xff08 2 xff0
  • 3分钟掌握7个XD基础操作

    下面我们来学习一下XD软件的基础操作 xff0c 包括资产面板的功能 交互动作 一键切图等等 1 重复网格 xff08 1 xff09 重复网格可智能复制其选择对象 xff0c 并批量更换图片 修改文字 之间距离等 xff08 2 xff0
  • 目标跟踪常用算法——EKF篇

    目录 1 扩展卡尔曼滤波算法 1 1 扩展卡尔曼滤波算法简单介绍 1 2 扩展卡尔曼滤波算法流程 1 3 扩展卡尔曼滤波算法仿真分析 2 参考文献 1 扩展卡尔曼滤波算法 1 1 扩展卡尔曼滤波算法简单介绍 对于非线性滤波问题 xff0c
  • 人工智能概述

    目录 什么是人工智能实现人工智能的方法逻辑编程机器学习深度学习机器学习和深度学习的区别 人工智能的分类如何实现人工智能 什么是人工智能 人工智能 又被称为机器智能 xff0c 是一种综合计算机科学 统计学 语言学等多种学科 xff0c 使机
  • java注解(annotation)的执行顺序

    可以在切面上使用 64 Order注解 如 64 Component 64 Aspect 64 Order 1 public class Aspect1 64 Component 64 Aspect 64 Order 2 public cl
  • Eclipse 常用快捷键 (动画讲解)

    Eclipse 常用快捷键 动画讲解 Eclipse有强大的编辑功能 xff0c 工欲善其事 xff0c 必先利其器 xff0c 掌握Eclipse快捷键 xff0c 可以大大提高工作效率 小坦克我花了一整天时间 xff0c 精选了一些常用
  • javaweb三大框架SSH

    1 MVC三层架构 xff1a 模型层 xff0c 控制层和视图层 模型层 xff0c 用Hibernate框架让来JavaBean在数据库生成表及关联 xff0c 通过对JavaBean的操作来 对数据库进行操作 xff1b 控制层 xf
  • HTTP请求方式及区别

    GET 向特定的路径资源发出请求 xff0c 数据暴露在url中 POST 向指定路径资源提交数据进行处理请求 xff08 一般用于上传表单或者文件 xff09 xff0c 数据包含在请求体中 OPTIONS 返回服务器针对特定资源所支持的
  • C++实现邮件群发的方法

    这篇文章主要介绍了C 43 43 实现邮件群发的方法 较为详细的分析了邮件发送的原理与C 43 43 相关实现技巧 非常具有实用价值 需要的朋友可以参考下 本文实例讲述了C 43 43 实现邮件群发的方法 分享给大家供大家参考 具体如下 x