windows服务定时发送电子邮件

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Diagnostics;
  6 using System.Linq;
  7 using System.ServiceProcess;
  8 using System.Text;
  9 using System.Threading.Tasks;
 10 using System.IO;
 11 using MmxChina.StartExhibition.userInfos;
 12 using System.Threading;
 13 using Microsoft.Office.Interop.Excel;
 14 using System.Data.SqlClient;
 15 using System.Net.Mail;
 16 using System.Net.Mime;
 17 using System.Collections;
 18
 19
 20
 21 namespace Mmxchina.StarExhibition.Service
 22 {
 23
 24     public partial class Service1 : ServiceBase
 25     {
 26
 27         public Service1()
 28         {
 29             InitializeComponent();
 30         }
 31
 32         //启动服务
 33         protected override void OnStart(string[] args)
 34         {
 35             Thread thread = new Thread(new ThreadStart(print));
 36             thread.Start();
 37         }
 38
 39         //停止服务
 40         protected override void OnStop()
 41         {
 42
 43         }
 44
 45         //服务业务开始
 46         private void print()
 47         {
 48             while (true)
 49             {
 50                 Thread.Sleep(1000);
 51                 if (DateTime.Now.ToLongTimeString() == "0:00:01")
 52                 {
 53                     ProcessExcels(1);
 54                 }
 55             }
 56         }
 57
 58         /// <summary>
 59         /// 准备数据
 60         /// </summary>
 61         public void ProcessExcels(int doNums)
 62         {
 63             string logInfoPath = "c:\\" + DateTime.Now.GetDateTimeFormats(‘D‘)[0].ToString() + "星展日志信息.txt";
 64             //开始准备数据
 65             File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":开始准备数据\r\n", Encoding.UTF8);
 66             SqlConnection conn = new SqlConnection("Data Source=112.124.56.152;Initial Catalog=DB_StartExhibition;User ID=wangman;pwd=wangman");
 67             conn.Open();
 68             SqlDataAdapter adapter = new SqlDataAdapter("select row_number() over (order by id desc) as 序号, userName 姓名, userTelPhone 电话, userCity 城市,case isConsumer when ‘1‘ then ‘是‘ when ‘0‘ then ‘否‘ end 是否是星展客户,userEmail 您的邮箱,createTime 上行时间 from userInfos  where createTime between  CONVERT(varchar (100),(getdate()-1),23) and CONVERT(varchar (100),getdate(),23)", conn);
 69             DataSet dataSet = new System.Data.DataSet();
 70             adapter.Fill(dataSet);
 71             conn.Close();
 72             if (dataSet.Tables[0].Rows.Count <= 0)
 73             {
 74                 CreateMessageWithAttachment(null, "星展昨天无用户数据", "星展昨天无用户信息", "[email protected]", "王曼", "");
 75                 return;
 76             }
 77
 78             Microsoft.Office.Interop.Excel.Application _excelApplicatin = null;
 79             Workbook _workBook = null;
 80             Worksheet _workSheet = null;
 81             Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//引用Excel对象
 82             _excelApplicatin = new Microsoft.Office.Interop.Excel.Application();
 83             _excelApplicatin.Visible = false;
 84             _excelApplicatin.DisplayAlerts = false;
 85             _workBook = _excelApplicatin.Workbooks.Add(true);
 86             _workSheet = (Worksheet)_workBook.ActiveSheet;
 87             /*标题信息*/
 88             _workSheet.Name = "星展用户信息";
 89             _workSheet.get_Range("A1", "G1").Merge(_workSheet.get_Range("A1", "F1").MergeCells);
 90             _workSheet.get_Range("A1", "H1").HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
 91             _workSheet.get_Range("A1", "H1").Font.Size = 18;
 92             _workSheet.get_Range("A1", "H1").RowHeight = 30;
 93             _workSheet.get_Range("A1", "H1").Font.Bold = true;
 94             _workSheet.Cells[1, 1] = DateTime.Now.AddDays(-1).GetDateTimeFormats(‘D‘)[0].ToString() + "星展用户信息";
 95             /*标题信息*/
 96             /*表头信息*/
 97             int colIndex = 0;
 98             int rowIndex = 2;
 99             foreach (DataColumn col in dataSet.Tables[0].Columns)
100             {
101                 colIndex++;
102                 _workSheet.Cells[rowIndex, colIndex] = col.ColumnName;
103             }
104             _workSheet.get_Range("A2", "G2").RowHeight = 20;
105             _workSheet.get_Range("A2", "G2").Font.Bold = true;
106             _workSheet.get_Range("A1", "I" + dataSet.Tables[0].Rows.Count + 3).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
107             _workSheet.get_Range("A1", "I" + dataSet.Tables[0].Rows.Count + 3).NumberFormatLocal = "@";
108             /*表头信息*/
109
110             foreach (DataRow row in dataSet.Tables[0].Rows)
111             {
112                 rowIndex++;
113                 colIndex = 0;
114                 foreach (DataColumn col in dataSet.Tables[0].Columns)
115                 {
116                     colIndex++;
117                     if (colIndex == 7)
118                         _workSheet.Cells[rowIndex, colIndex] = DateTime.Parse(row[col.ColumnName].ToString()).GetDateTimeFormats(‘f‘)[0].ToString();
119                     else
120                         _workSheet.Cells[rowIndex, colIndex] = row[col.ColumnName];
121                 }
122
123             }
124
125             _workSheet.get_Range("A2", "H1").EntireColumn.AutoFit();
126             _workBook.SaveAs("c:\\" + DateTime.Now.AddDays(-1).GetDateTimeFormats(‘D‘)[0].ToString() + "星展用户信息");
127             _workBook.Close();
128             _excelApplicatin.Quit();
129             File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":数据准备完毕\r\n", Encoding.UTF8);
130             File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":开始发送数据\r\n", Encoding.UTF8);
131             try
132             {
133                 string[,] mailBoxs = { { "王曼", "[email protected]" }, { "陈高峰", "[email protected]" } };
134                 for (int i = 0; i < mailBoxs.GetLength(0) - 1; i++)
135                 {
136                     File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":正在给" + mailBoxs[i, 0] + "发送邮件\r\n", Encoding.UTF8);
137                     CreateMessageWithAttachment(new string[] { "c:\\" + DateTime.Now.AddDays(-1).ToLongDateString().ToString() + "星展用户信息.xlsx" }, "星展用户信息", "您好:昨天有" + dataSet.Tables[0].Rows.Count + "人登记信息,请打开附件查看详细系信息。   以上,谢谢!", mailBoxs[i, 1], "星展客户", "");
138                 }
139
140                 File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":数据发送成功\r\n", Encoding.UTF8);
141             }
142             catch (Exception err)
143             {
144                 File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":数据发送失败.   失败原因:" + err.Message + "\r\n", Encoding.UTF8);
145                 Thread.Sleep(5000);
146                 if (doNums <= 3)
147                     ProcessExcels(++doNums);
148                 if (doNums == 4)
149                 {
150                     File.AppendAllText(logInfoPath, DateTime.Now.ToString("yyyyMMddHHmmss") + ":已尝试发送三次邮件,仍无法送达对方服务器...\r\n", Encoding.UTF8);
151                     CreateMessageWithAttachment(null, "星展用户信息未送达服务器", null, "[email protected]", "陈高峰", "");
152                 }
153             }
154
155         }
156
157         /// <summary>
158         /// 发送邮件
159         /// </summary>
160         /// <param name="filePaths">文件路径数组可附件多个文件</param>
161         /// <param name="title">标题</param>
162         /// <param name="content">邮件躯体【当指定邮件内容为html格式时此值可为null】</param>
163         /// <param name="toUser">接收邮件地址</param>
164         /// <param name="toUserName">接收人姓名</param>
165         /// <param name="htmlPath">html格式的邮件</param>
166         /// 参考地址
167         /// http://www.cnblogs.com/cykevin/archive/2011/04/12/2013542.html
168         /// http://www.cnblogs.com/panthervic/archive/2012/08/08/2629068.html
169         public static void CreateMessageWithAttachment(string[] filePaths, string title, string content, string toUser, string toUserName, string htmlPath = "")
170         {
171             // 1, Create a message and set up the recipients.创建一个邮件,设置发送人,收信人以及主题,正文
172             //电子邮件信息类
173             System.Net.Mail.MailAddress fromAddress = new System.Net.Mail.MailAddress("[email protected]", "北京无线互联广告有限公司");//发件人Email,在邮箱是这样显示的,[发件人:小明<[email protected]>;]
174             System.Net.Mail.MailAddress toAddress = new System.Net.Mail.MailAddress(toUser, toUserName);//收件人Email,在邮箱是这样显示的, [收件人:小红<[email protected]>;]
175             System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(fromAddress, toAddress);//创建一个电子邮件类
176             mailMessage.Subject = title;
177
178             if (htmlPath != "")
179             {
180                 string contentFilePath = (htmlPath);//邮件的内容可以是一个html文本.
181                 System.IO.StreamReader read = new System.IO.StreamReader(contentFilePath, System.Text.Encoding.GetEncoding("GB2312"));
182                 string mailBody = read.ReadToEnd();
183                 read.Close();
184                 mailMessage.Body = mailBody;//可为html格式文本
185                 mailMessage.IsBodyHtml = true;//邮件内容是否为html格式
186             }
187             else
188             {
189                 mailMessage.Body = content;//可为html格式文本
190             }
191
192             //mailMessage.Body = "邮件的内容";//可为html格式文本
193             mailMessage.SubjectEncoding = System.Text.Encoding.UTF8;//邮件主题编码
194             mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");//邮件内容编码
195             mailMessage.Priority = System.Net.Mail.MailPriority.High;//邮件的优先级,有三个值:高(在邮件主题前有一个红色感叹号,表示紧急),低(在邮件主题前有一个蓝色向下箭头,表示缓慢),正常(无显示).
196
197             // 2,Create  the file attachment for this e-mail message.创建邮件附件
198             if (filePaths != null)
199                 foreach (string filePath in filePaths)
200                 {
201                     Attachment data = new Attachment(filePath, MediaTypeNames.Application.Octet);
202                     mailMessage.Attachments.Add(data);// 添加附件
203                 }
204
205             // 5,创建发送端,配置发送端Send the message.
206             SmtpClient client = new SmtpClient("smtp.163.com");
207             client.UseDefaultCredentials = false;
208             // Add credentials if the SMTP server requires them.
209             client.Credentials = new System.Net.NetworkCredential("[email protected]", "aaaa");
210             // 6,发送
211             try
212             {
213                 client.Send(mailMessage);// 发送
214             }
215             catch
216             {
217                 mailMessage.Dispose();
218                 client.Dispose();
219                 throw new Exception("邮件服务器异常.信息未发出!");
220             }
221
222         }
223
224
225     }
226 }
时间: 2024-10-12 16:19:05

windows服务定时发送电子邮件的相关文章

Windows服务定时执行任务

1.创建多线程类 /// <summary> /// 多线程 /// </summary> public abstract class MuliThread<T> { /// <summary> /// 线程 /// </summary> private static readonly List<Thread> Threads = new List<Thread>(); /// <summary> /// 日志

Windows服务定时运行,判断当前时间是否在配置时间段内

1 /// <summary> 2 /// 判断程序是否在设置运行时间内 3 /// </summary> 4 /// <param name="startTime">开始执行时间</param> 5 /// <param name="overTime">执行结束时间</param> 6 /// <returns>true:在执行时间内,false:在执行时间外</return

杂记2:VS2013创建Windows服务实现自动发送邮件

这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务项目 首先,有人提问VS2013找不到创建Windows服务项目的选项,答案是在“Windows 桌面”目录下: 步骤二:重命名服务,添加Timer组件 重命名默认创建的Service1服务,比如MyMailService:然后在设计界面添加Timer组件. 这里要注意,VS工具箱默认提供的是Sys

Windows服务-手把手带你体验

Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 下面我们完成一个windows服务定时向mysql数据库中插入记录,come on! 1

使用ASP.NET实现定时计划任务,不依靠windows服务

我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows service?我们经常需要运行一些维护性的任务或者像发送提醒邮件给用户这样的定时任务.这些仅仅通过使用Windows Service就可以完成.Asp.net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码.所以,我们不得不构建自己的windows service来运行那些定时任务.但是在一个共享的托管环境下,我们并不总是有机会部署我们自己的windwos service到我们托管服务提供商的we

windows 服务实现定时任务调度(Quartz.Net)

我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了. 首先创建一个windows服务项目(详细信息请参阅:C#创建Windows Service(Windows 服务)基础教程) 在创建好的项目中点击“单击此处切换到代码视图”切换到代码 我们主要关注一下两个方法: • OnStart – 控制服务启动 • OnStop – 控制服务停止 例: 1 public partial class S

关于定时发送服务的解决办法(PHP)

一.定时发送任务解析 在进行手机APP或者微信开发的时候,经常会有需要定时推送消息的场景. 定时发送又分为两种: 一种是在开发的时候固定时间,后台管理人员只能选择将要推送的消息: 另一种是后台管理人员可以自由选择推送的时间和消息: 二.解决方案 PHP本身是不支持定时发送的,因为PHP是一个脚本语言.在大多数情况下,浏览器关闭,PHP也就不执行了.大部分情况下都依赖于外部的一些小东西. 1.固定时间 大多数服务器系统都是windows或linux. linux:使用CronTab定时执行php

.net 定时执行 windows 服务

1.新建项目 --> Windows 服务 2.Service1.cs代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.IO; using System.Text; using System.Timers; usin

C#创建windows服务并定时执行

一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Timers.Timer timer1;  //计时器 public Service1() { InitializeComponent(); } protected override void OnStart(string[] args)  //服务启动执行 { timer1 = new System.Time