邮件群发工具的编写(二)数据的保存

 数据的保存与读取

人类是在不断探索与改进中进步的

上一篇,邮件群发工具的编写(一)邮件地址提取,我们讲到了邮箱的提取。

那么这一篇,讲一下提取完的邮箱信息的保存和读取。

首先,我希望对上一篇邮箱提取类的功能进行补充,因为上篇文章只讲到一直提取,那万一我中途想中断提取再去做别的事呢又乍办?

因此,必须在对多线程进行人为干预和控制,所以对上篇文章中提到的测试类和方法进行了改进,增加了一个开关逻辑变量Paused,判断这个变量以决定线程是否继续,当然您可能有比这更好的方法,我这里只是抛砖引玉罢了。

View Code
 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是你添加点击的按钮。

 

View Code
 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进行了一个简单的封装处理。

千言万语,还是不如直接上代码直观。

View Code
  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保存操作代码,有必要写成这样吗?答案肯定是有必要咯。至于上面的那个我封装好的保存类,用起来相当简单,大家把代码复制后可以试试效果,简单极了。

调用的话也可以说是超简单的。

 

View Code
 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ lambda函数_C++11 之 lambda函数的详细使用

1. lambda 函数概述lambda 表达式是一种匿名函数&#xff0c;即没有函数名的函数&#xff1b;该匿名函数是由数学中的λ演算而来的。通常情况下&#xff0c;lambda函数的语法定义为&#xff1a;[capture] (parameters) mutable ->return-type {statement}其中&#xff1a;[c…

pytorch 正向与反向传播的过程 获取模型的梯度(gradient),并绘制梯度的直方图

记录一下怎样pytorch框架下怎样获得模型的梯度 文章目录引入所需要的库一个简单的函数模型梯度获取先定义一个model如下定义两个获取梯度的函数定义一些过程与调用上述函数的方法可视化一下梯度的histogram引入所需要的库 import os import torch import torch.nn as nn impor…

ubuntu升级python_Ubuntu 升级python3为更高版本【已实测】

2020-04-13 更新安装步骤&#xff1a; 1. 先update一下 sudo apt update 2. 安装依赖库 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-d…

Framework打包

2019独角兽企业重金招聘Python工程师标准>>> iOS app需要在许多不同的CPU架构下运行&#xff1a; arm7: 在最老的支持iOS7的设备上使用 arm7s: 在iPhone5和5C上使用 arm64: 运行于iPhone5S的64位 ARM 处理器 上 i386: 32位模拟器上使用 x86_64: 64为模拟器上使用…

windows 10 下利用WSL的Linux环境实现vscode C/C++环境的配置

本文主要结合二个工具&#xff0c;介绍如何在windows搭建Linux开发环境&#xff1a; WSL(Windows Subsystem for Linux)VSCode(Visual Studio Code) 文章目录WSL安装VSCode安装配置Linux下的C/C环境1. 打开WSL的控制台2. 更新ubuntu软件3. 安装GCC和GDB4. 配置VSCode(1). 打开…

Windows 11下 WSL使用 jupyter notebook

这里写目录标题前言在WSL下的配置测试运行更优雅的启动方法配置jupyter生成默认配置文件生成秘钥修改配置文件nohup启动前言 一直都使用jupyter notebook&#xff0c;不管做数据分析&#xff0c;还是调试代码&#xff0c;还有写文章都是。但是好像在WSL下又不好使。看了网上有…

sql2000导出mysql_如何将sql2000的数据库导入到mysql中?

展开全部先用SQl2000导出e68a843231313335323631343130323136353331333262373366文本文件&#xff0c;把后缀名改为CSv&#xff0c;再从Mysql中一导入OK参考&#xff1a;第一种是安装mysql ODBC&#xff0c;利用sql server的导出功能&#xff0c;选择mysql数据源&#xff0c;进…

实现日、周、月排行统计 sql

在如今很多系统中&#xff0c;都需要进行日、周、月排行统计&#xff0c;但是在网上寻找 了一番&#xff0c;发现很多都是相对的周、月排行&#xff0c;即周排行则用当前时间减去7天。这样我个人认为并不恰当。如月排行中&#xff0c;假设今天是4月22日,则从3月22日至4月22日之…

产品运行所需的信息检索失败_为服务业注入新活力,华北工控推出服务机器人专用计算机产品方案...

近年来&#xff0c;随着人口老龄化趋势加快和信息科技革命的持续推进&#xff0c;服务机器人已经被当作社会劳动力的一部分在医疗、教育、餐饮等行业广泛应用&#xff0c;市场潜力巨大。01、需求带动消费&#xff0c;科技改变服务服务机器人是国内智能机器人产业发展最快的分支…

Windows更新没有更新提示:从windows 10升级到Windows 11,并WSL下配置cuda

文章目录从windows 10 升级到Windows 11安装WSL的安装配置cuda从windows 10 升级到Windows 11 升级的方法有很多种&#xff0c;各大网站都有。有更新提示的按更新提示操作即可。我的是一直都没有更新提示&#xff0c;也搜索过网上的一些方法&#xff0c;但都不行。还是没法更新…

js修改css样式属性_这个笔记《CSS样式的常见属性及值》,让菜鸟轻松学会包粽子...

常见样式属性及值字体:font-family-size-style: normal(正常)|italic(倾斜)|oblique-weight: normal|bold(粗体)如果组合起来编写: font: style weight size family字体大小的单位可以是 px, em, rem, pt, cm, mm, in, pc文本:colortext-align(水平对齐方式): left|center|righ…

在 VirtualBox 中 CentOS 网络设置

转自&#xff1a;本文发表于水景一页。永久链接&#xff1a;<http://cnzhx.net/blog/minimal-centos-in-virtualbox/>。转载请保留此信息及相应链接。 4. 设置 按照上面的方法安装之后&#xff0c;还需要一些简单的设置&#xff0c;比如网络访问。然后既然是做网页服务器…

vscode C++ 分文件、文件夹编译配置与错误解决

文章目录问题includesourceout配置过程遇到的问题与解决遇到的问题1解决步骤1. ctrl shift p2. 配置json文件修改task.json文件修改launch.json可能遇到的错误1. collect2: error: ld returned 1 exit status2. /mnt/d/tmp/c/source/add.cpp:3:10: fatal error: add.h: No su…

淘淘商城项目mysql服务器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城项目环境搭建 ]...

背景&#xff1a;淘淘商城项目的环境搭建说明&#xff1a;采用SpringMVCSpringMybatisMysqlMavenSvn结构搭建&#xff0c;在开发之中可以参考其结构和搭建步骤去搭建实际的工程项目工程结构简图&#xff1a;项目结构&#xff1a;---------------------------------------------…

bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数

1. 概述在项目实际开发过程中&#xff0c;为了更好的复用&#xff0c;我们参考Spring Boot Starters&#xff0c;封装了许多企业内部中间件的starter。这些中间件的接入都需要申请并在项目中配置一些特定的参数。我们通过ConfigurationProperties注解&#xff0c;增加了在配置过…

进一步理解:inline-block,vertical-align,line-height

看似三个最常见的概念背后却隐藏了很深的很深“水” 那有多深呢&#xff0c;先来看下面的代码 引出问题 <style>.inline-block {display: inline-block;}.border {border: 1px solid #000000;}.span {width: 100px;height: 100px;}.bak {background: #33CCFF;} .o-hidden…

刷系统——黑屏问题

引用&#xff1a;http://www.miui.com/thread-344361-1-1.html 此贴大部分内容源自魔趣论坛V大的帖子&#xff0c;本人经过整理后发出&#xff0c;特此声明原帖地址&#xff1a;http://bbs.mfunz.com/thread-172610-1-1.html——此贴献给小白们&#xff0c;老鸟一笑而过吧近期有…

java executor_Java并发编程(08):Executor线程池框架

一、Executor框架简介1、基础简介Executor系统中&#xff0c;将线程任务提交和任务执行进行了解耦的设计&#xff0c;Executor有各种功能强大的实现类&#xff0c;提供便捷方式来提交任务并且获取任务执行结果&#xff0c;封装了任务执行的过程&#xff0c;不再需要Thread().st…

python 查看当前目录_「Python」打包分发工具setuptools学习

❝setuptools是python标准的打包分发工具&#xff0c;它可以将我们编写的python项目打包安装&#xff0c;这样其他同事就可以像调用标准库或python第三方库那样直接使用&#xff1b;也可以将项目上传到Pypi供更多人的下载安装使用。❞1. 项目结构项目结构❝这是一个打包构建好的…

九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)

九月十月百度人搜&#xff0c;阿里巴巴&#xff0c;腾讯华为小米搜狗笔试面试八十题 &#xff08;参与算法&面试题交流与讨论&#xff0c;请加群&#xff1a;30382647&#xff09;引言 自发表上一篇文章至今&#xff08;事实上&#xff0c;上篇文章更新了近3个月之久&#…