编写一个Windows服务程序,定时从数据库中拿出记录发送邮件
前言:编写一个Windows服务程序,定时从数据库中拿出记录发送邮件。
测试环境:Visual Studio 2005 SP1、Windows Server 2003 SP2
一、新建项目
打开VS2005,新建一个“Windows 服务”项目。
二、添加Timer
展开“工具箱”,在“组件”标签下找到“Timer”双击,这时就添加了一个Timer组件,修改“Name”属性为“timEmail”、“Enabled”为“false”、“Interval”为“60000”。
接下来要做一些修补工作,不知是VS2005的BUG还是我没找着地方,在VS2003下是不存在该问题的:刚从“组件”下添加的“Timer”按理说应该来自“System.Timers命名空间”,也只有“System.Timers.Timer”才能在Windows服务程序中正常工作,但是现在这个Timer却是属于“System.Windows.Forms.Timer”的。所以得稍作修改,打开“.Designer.cs”文件,修改如下:
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
//this.timEmail = new System.Windows.Forms.Timer(this.components);原
this.timEmail = new System.Timers.Timer();//改
this.timEmail.Interval = 60000;
this.ServiceName = "Service1";
#endregion
//private System.Windows.Forms.Timer timEmail;原
private System.Timers.Timer timEmail;//改
三、添加配置文件
服务每次调用配置文件,获取一些基本参数,这样一些变更就可直接修改配置文件而不必修改代码。新建ServiceConfig.xml存放于项目“Bin\Debug\”下:
<serviceConfig>
<serviceItem
name="sendEmail"
enable="true"
elapsed="60000"
connectionString="your database connection..."
smtp="smtp address"
account="your email account..."
password="your password..." >
</serviceItem>
</serviceConfig>
四、以下是实现代码
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Xml;//操作配置文件
using System.IO;//写日志
using System.Threading;//使用线程
namespace ClientWindowsService
{
public partial class ClientService : ServiceBase
{
public ClientService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//服务启动
this.timEmail.Enabled = true;
this.tSendEmail();
}
protected override void OnStop()
{
//服务停止
this.timEmail.Enabled = false;
}
private void timEmail_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//定时器
this.tSendEmail();
}
//开启新进程发送邮件
private void tSendEmail()
{
Thread t = new Thread(new ThreadStart(sendEmail));
t.Start();
}
//发送邮件函数
private void sendEmail()
{
XmlDocument doc = new XmlDocument();
//添加System.Windows.Forms引用,获取执行目录
string configFile = System.Windows.Forms.Application.StartupPath.ToString() + "\ServiceConfig.xml";
doc.Load(@configFile);
XmlElement root = doc.DocumentElement;
foreach (XmlNode node in root)
{
//如果配置文件中开启服务
if (node.Attributes["name"].Value == "sendEmail" && node.Attributes["enable"].Value == "true")
{
try
{
//读取数据库,发送邮件操作,略
}
catch (Exception error)
{
//写错误日志
using (StreamWriter sw = new StreamWriter(System.Windows.Forms.Application.StartupPath.ToString() + @"" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt", true, System.Text.Encoding.UTF8))
{
sw.WriteLine(DateTime.Now.ToString() + ":");
sw.WriteLine(error.ToString());
sw.WriteLine("---------------------------------------------");
sw.Close();
}
}
}
}//end foreach
}
}//end class
}//end namespace
五、布署服务
在设计模式下右键-->添加安装程序-->设置serviceProcessInstaller1的Account为LocalSystem
设置serviceInstaller1的StartType为Automatic
编译
在命令模式下执行:%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe D:\项目目录\bin\Debug\可执行文件名.exe
转载于:https://www.cnblogs.com/ori8/archive/2009/05/23/1487541.html
编写一个Windows服务程序,定时从数据库中拿出记录发送邮件相关推荐
- (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 请编写一个程序,请将字符串中所有字母全部向后移一位,最后一个字母放在字符串的开头,最后将新的字符串输出。
请编写一个程序,请将字符串中所有字母全部向后移一位,最后一个字母放在字符串的开头,最后将新的字符串输出. ran = [] result = "" old_str = input( ...
- 请编写一个程序,用于统计字符串中每个字母的出现次数(字母忽略大小写),统计出结果后,请按照{'a':3,'b':2}的格式输出。
请编写一个程序,用于统计字符串中每个字母的出现次数(字母忽略大小写),统计出结果后,请按照{'a':3,'b':2}的格式输出. ras = [] mystr = input("请输入一个全 ...
- 编写一个Java程序,在程序中包含一个Employee类,Employee类包含name、age、salary三个成员变量
编写一个Java程序,在程序中包含一个Employee类,Employee类包含name.age.salary三个成员变量,Employee类中有4个构造方法,分别为无参的.带一个参数用来对name属 ...
- C语言——选择控制结构 寻找中位数v1.0编写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c);功能是返回a,b,c三数中大小位于中间的一个数。
寻找中位数v1.0 编写一个函数返回三个整数中的中间数. 函数原型:int mid(int a, int b, int c); 功能是返回a,b,c三数中大小位于中间的一个数. 程序运行结果示例1: ...
- 编写一个能将给定非负整数列表中的数字排列成最大数字的函数
编写一个能将给定非负整数列表中的数字排列成最大数字的函数.例如,给定[50,2,1,9],最大数字为95021. public class TestFindMaxNum { /** * @param ...
- LeetCode4_编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ““。(解决方案:横向扫描、 纵向扫描 、分治 二分查找 、秀儿操作之排序比较头尾)
题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow&q ...
- 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。
在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...
- java 农历的编写保存数据批量插入到数据库中
java 农历的编写保存数据批量插入到数据库中 1.阴历转农历的工具类 public class Nongli {private static int monCyl, dayCyl, yearCyl; ...
最新文章
- linux分区空间不足--lvm逻辑卷的实现过程
- sublimelinter校验php,代码校验工具 SublimeLinter 的安装与使用
- 汇编:从键盘读取字符
- 小程序云函数获取用户昵称_小程序云开发云函数进阶
- elasticsearch 5.6.x单机环境构建(集成head插件和IK中文分词)
- android app源码大全_Android秋招秘籍,看我如何搞定BAT,Vivo,爱奇艺
- mysql 的 distinct 去掉重复的数据
- 计算机图片处理器,光学图像处理器
- 一个计算机爱好者的不完整回忆(十二)下载软件
- PPT 配色-颜色代码
- A Knee_Guided Evolutionary Algorithm for Compressing Deep Neural Network (KGEA)解读
- C语言>>输入两个字符串,比较这两个字符串是否相同并输出比较结果。要求不用任何字符串处理函数。
- 计算机任务管理器无法响应,电脑任务管理器经常未响应怎么办
- 怎样识别app网站服务器在国外,APP服务器你了解多少?什么是海外app服务器
- 01-CSS属性:字体属性和文本属性
- 真香!端午节到来,我用Python画了几个粽子送给女票,女票差点吃了我的电脑...
- 文献:利用自驱动分子马达并行计算子集和问题 Parallel computation with molecular-motor-propelled agents...(PNAS)
- MyDocument.exe病毒查杀方法
- 文科高中毕业学计算机技术,一位高中生的困惑:成绩好的学理科,成绩差的学文科?...
- 「Java」- 八大排序
热门文章
- Spark详解(九):Spark存储原理分析
- Nginx配置Basic Auth登录认证的实现方法
- Linux命令——find详解
- 信息系统开发平台OpenExpressApp - 数据权限
- 在VM虚拟机Windows Server r2上部署安装Microsoft Dynamics CRM 2016 步骤详解(一)
- MySQL数据库使用(二):配置、连接远端数据库
- 183. Customers Who Never Order
- Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test)
- Activiti邮件任务
- WebForm(文件上传)