邮件群发工具的编写(二)数据的保存
数据的保存与读取
人类是在不断探索与改进中进步的
上一篇,邮件群发工具的编写(一)邮件地址提取,我们讲到了邮箱的提取。
那么这一篇,讲一下提取完的邮箱信息的保存和读取。
首先,我希望对上一篇邮箱提取类的功能进行补充,因为上篇文章只讲到一直提取,那万一我中途想中断提取再去做别的事呢又乍办?
因此,必须在对多线程进行人为干预和控制,所以对上篇文章中提到的测试类和方法进行了改进,增加了一个开关逻辑变量Paused,判断这个变量以决定线程是否继续,当然您可能有比这更好的方法,我这里只是抛砖引玉罢了。
1 public class TestClass 2 { 3 public static bool Paused = false; 4 static MailUtil mailUtil = new MailUtil(); 5 static Dictionary<string, LinkMan> linkmans = new Dictionary<string, LinkMan>(); 6 public static Dictionary<string, LinkMan> TestMethod(System.Windows.Forms.ListView listView) 7 { 8 9 System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(delegate 10 { 11 while (mailUtil.HasNext) 12 { 13 14 Dictionary<string, LinkMan> list = mailUtil.Extract(); 15 foreach (KeyValuePair<string, LinkMan> kvp in list) 16 { 17 if (!linkmans.ContainsKey(kvp.Key)) 18 { 19 linkmans.Add(kvp.Key, kvp.Value); 20 System.Windows.Forms.ListViewItem viewItem = listView.Items.Add(linkmans.Count.ToString()); 21 viewItem.SubItems.Add(kvp.Value.Nick); 22 viewItem.SubItems.Add(kvp.Value.Email); 23 viewItem.SubItems.Add(kvp.Value.Area); 24 } 25 } 26 if (Paused) 27 break; 28 } 29 if (linkmans.Count == 0) throw new Exception("没有找到任何数据"); 30 31 })); 32 thread.Start(); 33 return linkmans; 34 } 35 }
接下来是改一下调用的方式,这里面的button是你添加点击的按钮。
1 private void button1_Click(object sender, EventArgs e) 2 { 3 if (this.button1.Text == "开始提取") 4 { 5 this.button1.Text = "中断"; 6 TestClass.Paused = false; 7 links = TestClass.TestMethod(listView1); 8 } 9 else 10 { 11 this.button1.Text = "开始提取"; 12 TestClass.Paused = true; 13 } 14 15 16 }
好了上一篇的提取就到此结束了。
接下来步入正文。保存数据通常我们用数据库,本地数据库有access,当然我们这里不用数据库用到xml技术就可以了。
xml的操作其实很简单,这里为了我们以后调用方便,我还是把xml进行了一个简单的封装处理。
千言万语,还是不如直接上代码直观。
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Xml; 5 using System.Runtime.CompilerServices; 6 /// 7 ///作者:凌晨的搜索者 8 ///网址:www.uu102.com 9 /// 10 namespace System 11 { 12 public class U_Xml 13 { 14 public string FileName { get; set; } 15 public XmlDocument XmlDoc { get; set; } 16 public XmlElement RootElement { get; set; } 17 public U_Xml() 18 { 19 } 20 public U_Xml(string fileName ,string rootElement) 21 { 22 this.FileName = fileName; 23 this.XmlDoc = new XmlDocument();//创建xml文档 24 XmlDeclaration xmlDeclaration = this.XmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 25 this.XmlDoc.AppendChild(xmlDeclaration);//添加申明 26 this.RootElement =this.XmlDoc.CreateElement(rootElement);//创建根元素 27 this.XmlDoc.AppendChild(this.RootElement); //添加根元素 28 29 } 30 31 public static XmlDocument LoadFromFile(string fileName) 32 { 33 XmlDocument xmlDoc = new XmlDocument(); 34 xmlDoc.Load(fileName);//加载已经存在的文件 35 return xmlDoc; 36 } 37 public void Save(string fileName) 38 { 39 if (!string.IsNullOrEmpty(fileName)) 40 this.FileName = fileName; 41 if (this.XmlDoc == null) throw new Exception("没有创建xml文档,无法保存"); 42 this.XmlDoc.Save(this.FileName); 43 } 44 public void Save() 45 { 46 Save(""); 47 } 48 } 49 /// <summary> 50 /// 这个类,用到扩展方法,用起来相当方便,有点像jquery的链式编程 51 /// </summary> 52 public static class Methods 53 { 54 55 /// <summary> 56 /// 添加节点 57 /// </summary> 58 /// <param name="arr"> 59 /// 第一个参数:xml实例化类 60 /// 第二个参数:节点名字 61 /// <returns></returns> 62 public static XmlNode AddNode(this XmlElement _xmlElement, params object[] arr) 63 { 64 65 U_Xml u_Xml=(U_Xml)arr[0]; 66 XmlNode xmlNode =u_Xml.XmlDoc.CreateNode(XmlNodeType.Element,(string)arr[1],""); 67 _xmlElement .AppendChild(xmlNode);//添加节点 68 return xmlNode; 69 70 } 71 /// <summary> 72 /// 添加节点 73 /// </summary> 74 /// <param name="arr"> 75 /// 第一个参数:xml实例化类\n 76 /// 第二个参数:节点名字 77 /// </param> 78 /// <returns></returns> 79 public static XmlNode AddNode(this XmlNode _xmlElement, params object[] arr) 80 { 81 U_Xml u_Xml = (U_Xml)arr[0]; 82 XmlNode xmlNode = u_Xml.XmlDoc.CreateNode(XmlNodeType.Element, (string)arr[1],""); 83 _xmlElement.AppendChild(xmlNode);//添加节点 84 return xmlNode; 85 } 86 /// <summary> 87 /// 添加属性 88 /// </summary> 89 /// <param name="arr"> 90 /// 第一个参数:xml实例化类\n 91 /// 第二个参数:属性名称\n 92 /// 第三个参数:属性值 93 /// </param> 94 /// <returns></returns> 95 public static XmlAttribute AddAttibute(this XmlElement _xmlElement, params object[] arr) 96 { 97 U_Xml u_Xml = (U_Xml)arr[0]; 98 XmlAttribute xmlAttribute = u_Xml.XmlDoc.CreateAttribute((string)(arr[1])); 99 xmlAttribute.Value = (string)arr[2]; 100 _xmlElement.Attributes.Append(xmlAttribute); 101 return xmlAttribute; 102 } 103 /// <summary> 104 /// 添加属性 105 /// </summary> 106 /// <param name="arr"> 107 /// 第一个参数:xml实例化类\n 108 /// 第二个参数:属性名称\n 109 /// 第三个参数:属性值 110 /// </param> 111 /// <returns></returns> 112 public static XmlAttribute AddAttibute(this XmlNode _xmlElement, params object[] arr) 113 { 114 U_Xml u_Xml = (U_Xml)arr[0]; 115 XmlAttribute xmlAttribute = u_Xml.XmlDoc.CreateAttribute((string)(arr[1])); 116 xmlAttribute.Value = (string)arr[2]; 117 _xmlElement.Attributes.Append(xmlAttribute); 118 return xmlAttribute; 119 } 120 public static XmlNode ReName(this XmlElement _xmlElement, params object[] arr) 121 { 122 string value = (string)arr[2]; 123 124 U_Xml u_Xml=(U_Xml)arr[0]; 125 XmlNode xmlElement = u_Xml.XmlDoc.CreateNode("element",value,""); 126 if (u_Xml.XmlDoc[(string)arr[1]] == null) throw new Exception("不存在该节点"); 127 xmlElement.InnerText = u_Xml.XmlDoc[(string)arr[1]].InnerText; 128 u_Xml.XmlDoc[(string)arr[1]].ParentNode.ReplaceChild(xmlElement,u_Xml.XmlDoc[(string)arr[1]]); 129 u_Xml.Save(); 130 return xmlElement; 131 } 132 public static XmlNode ReName(this XmlNode _xmlElement, params object[] arr) 133 { 134 string value = (string)arr[2]; 135 136 U_Xml u_Xml = (U_Xml)arr[0]; 137 XmlNode xmlElement = u_Xml.XmlDoc.CreateNode("element", value, ""); 138 xmlElement.InnerText = u_Xml.XmlDoc[(string)arr[1]].InnerText; 139 u_Xml.XmlDoc[(string)arr[1]].ParentNode.ReplaceChild(xmlElement, u_Xml.XmlDoc[(string)arr[1]]); 140 u_Xml.Save(); 141 return xmlElement; 142 } 143 public static void Delete(this XmlNode _xmlElement) 144 { 145 if (_xmlElement == null) throw new Exception("该节点不存在"); 146 if(_xmlElement.ParentNode.HasChildNodes) _xmlElement.ParentNode.RemoveChild(_xmlElement); 147 } 148 } 149 150 }
写到这里,可能很多人会开始产生疑问了,几句简单的xml保存操作代码,有必要写成这样吗?答案肯定是有必要咯。至于上面的那个我封装好的保存类,用起来相当简单,大家把代码复制后可以试试效果,简单极了。
调用的话也可以说是超简单的。
1 private void button2_Click(object sender, EventArgs e) 2 { 3 U_Xml u_Xml = new U_Xml(Environment.CurrentDirectory + "\\Config\\MailInfo.xml", "MailSet"); 4 foreach (KeyValuePair<string, LinkMan> kvp in links) 5 { 6 XmlNode xmlNode= u_Xml.RootElement.AddNode(u_Xml, "Email"); 7 xmlNode.AddAttibute(u_Xml, "Nick", kvp.Value.Nick); 8 xmlNode.AddAttibute(u_Xml, "Area", kvp.Value.Area); 9 xmlNode.InnerText = kvp.Value.Email; 10 } 11 u_Xml.Save(); 12 13 }
好了,废话不多说了,千言万语尽在代码中。保存的操作就这样完了。
下一篇,我们会涉及到群发邮件的核心问题。教程每天都在更新,希望大家继续关注!
由于本博客内部原因,文章是后面重新不上去的,请各位谅解
转载于:https://www.cnblogs.com/uu102/archive/2012/09/02/2667804.html
邮件群发工具的编写(二)数据的保存相关推荐
- 邮件群发工具的编写(四)邮件跟踪服务
不管黑猫白猫,抓得到老鼠的就是好猫 上一篇,邮件群发工具的编写(三)邮件发送的几种方式 中,我们谈到了发送邮件.这一篇,我们讲讲邮件跟踪服务器的创建 邮件群发出去之后,很多朋友都想知道群发的效果.这就 ...
- 腾讯微博qq说说备份导出工具_微信重要数据怎么保存?微信聊天记录备份可以吗?...
说起来,一些重要的数据我们通常会选择怎样保存呢?很多人都不是太了解数据存储的时间,能有五年就不错了.事实上,我们的一些数据可以保存的比我们想象的还要久一些.长期存储对于我们每个人而言,都是生活中十分喜 ...
- html邮件模板编辑器_免费电子邮件群发工具推荐「aweber」
推荐一款免费30天使用的电子邮件群发工具「aweber」,并且它不单单只是一个邮件群发工具,它有非常多的实用功能,以下我会做一些简单介绍. 一:自动化营销渠道 使用aweber的拖放广告系列编辑器构建 ...
- qq邮件引流需要注意什么?QQ邮件群发推广的技巧
目前国内的电子邮箱,由于QQ邮箱和QQ客户端有关联,所以使用QQ邮箱的客户非常多,特别是QQ客户端收到邮件会弹窗提示.QQ邮箱用户已然成为了企业营销人员最受欢迎的目标群体,通过QQ邮件群发推广来推广自 ...
- 中国邮件群发服务商现状分析
在互联网商务的风靡盛世中,EDM邮件营销成为网络营销服务的重要角色.尽管国内并不缺乏规范的专业Email营销服务机构,但让百家知晓的仍寥寥无几.是技术不到位,满足不了企业需求,还是服务商品牌意识太薄弱 ...
- 邮件群发平台_海外疫情持续严重影响外贸市场,U-Mail邮件群发应对出招
2020年将成为一个具有历史性的一年,新冠状病毒疫情在全球持续肆虐,直至3月23号,国内的确诊病例持续下降,国外的疫情缺持续爆发,确诊案例却不断上升.其中以欧美地区和美国为首.阿里巴巴外贸圈名人堂讲师 ...
- 邮件群发的5个条件和因素(新手必看)
一.IP 1.申请IP,指你本机的电脑IP 2.SMTP服务器:指邮件服务器的IP,好的smtp服务器一定符合以下条件: 2.1.静态IP 2.2.没进入国际垃圾邮件IP黑名单 2.3.能泛解析域名 ...
- 邮件轻松发--邮件群发小工具
关于这个工具的创作:相信大家都有找工作的经历,在简历投递的时候是否有这样的烦恼?点对点的发送邮件时,不停的复制粘贴自己的简历发送,在这一期间不仅浪费了大家相当多的一部分时间,而且发送简历的效率也不是很 ...
- 用Python编写小工具下载OSM路网数据
文章来源于Python大数据分析,作者费弗里 本文对应脚本已上传至Github仓库: https://github.com/CNFeffery/DataScienceStudyNotes[1] 1 简 ...
最新文章
- (转)金额转中文大写
- 深度学习框架大PK:TNN决战MNN,ncnn依旧经典
- XX(北京)科技股份公司为啥需要购置服务器?
- 带有示例的Python File readlines()方法
- Javascript获取地址参数
- 甘肃银行借助HDIM打造综合数据保护平台
- hp7610扫描到计算机无法激活,惠普HP Officejet 7610一体机解决扫描问题(一)
- 5种解决方案可帮助5G商业化并降低网络成本
- 云盘服务器被毁,360云盘宣布停止个人云盘服务 明年2月1日清空
- “2021云管和云网大会”在京召开
- matlab 关键路径函数,用线性规划建模(确定参数)关键路径法
- c 语言打印26个大写字母怎么读,26个大写字母读法
- 国内首款众筹刷单破亿的产品诞生,监管缺乏下京东刷单文化盛行
- python批量图片文字识别_利用Python批量进行图片文字识别
- dfs根目录_分布式文件系统DFS详细解读
- 燕山大学校园网自动登录问题解决方案
- 什么是SQL触发器?SQL触发器是什么意思?
- 基于STM32F103RB的模拟液位检测告警系统(已实现)
- 使用source导入MySQL出现“ERROR: Failed to open file xx, error: 2“问题的解决
- 零基础学python编程思维(九) | 面向对象的编程——类
热门文章
- java 多线程异常_java多线程执行异常
- python打开setting_Django自带日志 settings.py文件配置方法
- 洛谷 P 4180 次小生成树
- 一步一步带你训练自己的SSD检测算法
- 训练神经网络适合使用交叉熵(cross_entropy)错误率,而不是分类错误率或是均方差
- 五分钟了解操作系统内核
- 帮人取款每百元抽10元回扣,最终涉嫌诈骗罪被批捕
- 这些贷款合同陷阱你知道多少?
- C++中public,protected,private派生类继承问题和访问权限问题
- python控制流代码怎么用_Python学习笔记控制流的元素