這篇隨筆裏,我將介紹如何用VS2013開發Windows服務項目,實現的功能是定時發送電子郵件。數據庫
開發環境:VS2013,SQL Server2008,採用C#語言開發windows
步驟一:建立Windows服務項目服務器
首先,有人提問VS2013找不到建立Windows服務項目的選項,答案是在「Windows 桌面」目錄下:ide
步驟二:重命名服務,添加Timer組件函數
重命名默認建立的Service1服務,好比MyMailService;而後在設計界面添加Timer組件。工具
這裏要注意,VS工具箱默認提供的是System.Windows.Forms.Timer組件,在windows服務中是沒法執行的。咱們要添加的是System.Timers.Timer組件!編碼
首先,在工具箱空白位置右鍵打開「選擇項」菜單,以下在「.NET Framework組件」頁下找到並勾選「Timer」:spa
而後將從工具箱找到你添加的Timer組件(可利用搜索功能),拖放到編輯區域;設計
接着,按照你的須要設置Timer的執行間隔,單位是毫秒,好比我是60000,一分鐘執行一次。3d
步驟三:實現服務啓動和中止功能
打開MyMailService的代碼編輯界面,默認包含3個方法:構造函數、OnStrat和OnStop。
OnStart和OnStop分別對應服務的啓動和終止;此外還有OnPause和OnContinue方法,分別對應服務的暫停和繼續。
如今,修改代碼以下,在服務啓動和中止的時候啓動和中止Timer定時器:
public MyMailService() { InitializeComponent(); base.AutoLog = false; // 不記錄windows事件日誌 base.ServiceName = "MyMailService"; timer1.Stop(); } protected override void OnStart(string[] args) { timer1.Start(); } protected override void OnStop() { timer1.Stop(); }
步驟四:實現Timer郵件發送功能
C#發送郵件的例子網上不少,用到System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient。
我按照本身的使用習慣,封裝了一個Mail對象:
public class Mail { private string DefaultHost = "smtp.mail.qq.com"; // SMTP服務器,這裏是QQ郵箱 private string DefaultFMAddress = "396042321@qq.com"; // 郵箱用戶名 private string DefaultName = "默認發送人"; private string DefaultPassword = "XXXXX"; // 郵箱密碼 private string DefaultSubject = "系統郵件";
private MailMessage MMsg; private NetworkCredential NC; public Mail() { MMsg = new MailMessage(); MMsg.From = new MailAddress(DefaultFMAddress, DefaultName); MMsg.Subject = DefaultSubject; MMsg.Priority = MailPriority.Normal; MMsg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess; NC = new NetworkCredential(); NC.UserName = DefaultFMAddress; NC.Password = DefaultPassword; } /// <summary>設置發件人</summary> /// <param name="fmAddress">發件人郵箱</param> /// <param name="fmName">發件人別名</param> public void setFrom(string fmAddress, string fmName) { MMsg.From = new MailAddress(fmAddress, fmName); } /// <summary>添加收件人</summary> /// <param name="toAddress">收件人地址</param> public void AddTo(string toAddress) { string[] adds = toAddress.Split(','); foreach (string add in adds) if (!string.IsNullOrEmpty(add)) MMsg.To.Add(add); } /// <summary>添加抄送人</summary> /// <param name="ccAddress">抄送人地址</param> public void AddCC(string ccAddress) { if (!string.IsNullOrEmpty(ccAddress)) MMsg.CC.Add(ccAddress); } /// <summary>郵件主題</summary> public string Subject { set { MMsg.Subject = value; } } /// <summary>郵件正文</summary> public string Content { set { MMsg.Body = value; MMsg.BodyEncoding = System.Text.Encoding.UTF8; MMsg.IsBodyHtml = true; } } /// <summary>添加附件:文件名UTF8編碼不得超過41字節,不然附件沒法打開</summary> /// <param name="path">附件的物理路徑</param> public void AddAttchment(string path) { if (!string.IsNullOrEmpty(path)) { string[] atts = path.Split(','); foreach (string att in atts) { if (!System.IO.File.Exists(att)) throw new Exception("找不到附件:" + att); else MMsg.Attachments.Add(new Attachment(att)); } } } /// <summary>發送級別</summary> public MailPriority Priority { set { MMsg.Priority = value; } } /// <summary>發送郵件</summary> public void Send() { SmtpClient sc = new SmtpClient(); sc.UseDefaultCredentials = true; sc.DeliveryMethod = SmtpDeliveryMethod.Network; sc.Credentials = NC; sc.Host = DefaultHost; sc.Send(MMsg); MMsg.Dispose(); // 發送郵件後釋放對象 } }
Timer的代碼:
private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Mail mail = new Mail(); mail.AddTo("396042321@qq.com"); // 收件人 mail.AddCC("396042321@qq.com"); // 抄送人 mail.Subject = "主題"; mail.Content = "郵件正文"; mail.AddAttchment("C:\test.txt"); // 附件 mail.Send(); }
步驟五:添加服務安裝程序
打開MyMailService的設計視圖,在空白位置右鍵選擇「添加安裝程序」,VS自動建立一個ProjectInstaller。
設置serviceProcessInstaller1的Account屬性爲LocalSystem;
設置serviceInstaller1的ServiceName爲MyMailService,StartType爲Automatic,Description爲「用於自動發送電子郵件」,DisplayName爲「定時發送郵件服務」
(這裏若設置DelayedAutoStart爲True,則服務在系統啓動一段時候後自動啓動,不然在系統啓動時啓動)
步驟六:生成項目,安裝到系統服務
選中項目右鍵選擇「生成」,生成exe文件;
而後在生成目錄下新建「安裝.bat」文件,使用記事本打開,輸入以下命令:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe CYWinService.exe pause
注意:這裏要填寫你的InstallUtil.exe的所在路徑
最後雙擊安裝.bat文件,就完成服務註冊了。
在個人電腦上右鍵選擇「管理」,打開「服務和應用程序」下的「服務」,就能看到咱們註冊的服務了。
後記:
(1)如何卸載我註冊的Windows服務?
在生成目錄下新建「卸載.bat」文件,輸入以下命令:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u CYWinService.exe pause
雙擊執行卸載.bat文件,便可卸載服務。
(2)改進:從數據庫讀取要發送的郵件信息,而後定時發送
修改Timer的代碼改成動態讀取便可,具體代碼就不貼了,個人表結構是:
TABLE [dbo].[t_SYS_Mail]( [ID] [int] IDENTITY(1,1) NOT NULL,
[FmSMTP] [varchar](50) NULL, -- 郵箱SMTP [FmWho] [varchar](50) NULL, -- 發送人郵箱 [FmPassword] [varchar](50) NULL, -- 發送人郵箱密碼 [FmName] [varchar](50) NULL, -- 顯示的發送人名稱 [ToWho] [varchar](100) NOT NULL, -- 收件人 [CCWho] [varchar](100) NULL, -- 抄送人 [MailSubject] [varchar](100) NOT NULL, -- 主題 [MailContent] [varchar](500) NOT NULL, -- 正文 [MailPriority] [varchar](50) NULL, -- 優先級 [MailAttchments] [varchar](500) NULL, -- 附件 [AddTime] [datetime] NULL, [SendTime] [datetime] NULL, [ErrMessage] [varchar](100) NULL)
用SendTime記錄發送時間,ErrMessage記錄發送錯誤信息
以上:-)