• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++实现邮件群发的方法

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

作者:kevin0216 字体:[增加 减小] 来源:互联网 时间:2017-05-28

kevin0216 通过本文主要向大家介绍了c++闰年的计算方法,c++使用方法,c++排序方法,c++ 类方法,c++方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了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、增加干预码

#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;     //标记是否群发
TCHAR* pTitle = NULL;     //指向标题文件内容的指针
HANDLE hThread=NULL;     //线程返回句柄
long i=0;        //列表控件“行”计数
static long sendNum=1;    //发送邮件数量
#pragma comment(lib,"WSOCK32.LIB")
extern TCHAR tcRunPath[MAX_PATH];  //程序当前路径目录
extern TCHAR shortPath[MAX_PATH];  //文件路径,TAB2中的全局变量
extern TCHAR titlePath[256];   //邮件标题文件路径
extern TCHAR mtPath[256];    //邮件内容文件路径
extern TCHAR sendListPath[MAX_PATH]; //发送列表文件路径
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("请选择发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("请选择发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)    //列表初始化设置,视图选为报表视图
{
 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));   //得到列表当前拓展风格
 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(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)//窗口控件初始化设置
{
 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未选中的设置为只读
{
 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控件被选中,则设置相应的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)    //读取文件--邮件发送内容
{
 int nLen = 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) //是否勾选在邮件标题 加入系统当前时间
 {
  SYSTEMTIME stLocal;
  GetLocalTime(&stLocal); //得到系统当前时间
  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); //在标题后加入系统时间
 }
 fclose(pF);     //关闭文件
 TCHAR* pText = NULL;
 pF = fopen(mtPath , "r"); //打开文件




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 在C++中反射调用.NET的方法(一)
  • 在C++中反射调用.NET的方法(二)
  • 在C++中反射调用.NET的方法(三)
  • C++实现顺序表的方法
  • C++实现合并排序的方法
  • C++判断矩形相交的方法
  • C++实现邮件群发的方法
  • C++去除输入行中空白的方法
  • C++处理键盘输入的方法
  • C++实现raw_input的方法

相关文章

  • 2017-05-28如何用矩形法(梯形法)求定积分
  • 2017-05-28桶排序算法的理解及C语言版代码示例
  • 2017-05-28c++判断是否为目录的示例分享
  • 2017-05-28C语言中使用lex统计文本文件字符数
  • 2017-05-28C++访问Redis的mset 二进制数据接口封装方案
  • 2017-05-28c语言实现系统时间校正工具代码分享
  • 2017-05-28c++基础语法:普通继承
  • 2017-05-28C++ Vector用法深入剖析
  • 2017-05-28从C++单例模式到线程安全详解
  • 2017-05-28使用C语言判断栈的方向实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++映像劫持后门实例分析
    • map插入自定义对象总结
    • c++图像处理:24位真彩图颜色变换实例
    • C语言的数组学习入门之对数组初始化的操作
    • C语言中使用lex统计文本文件字符数
    • 浅析内存对齐与ANSI C中struct型数据的内存布局
    • 详解C语言中的memset()函数
    • 求素数,用vector存储的实现方法
    • C++求逆序对的方法
    • 深入解析C++编程中线程池的使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有