雜記2:VS2013建立Windows服務實現自動發送郵件

這篇隨筆裏,我將介紹如何用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記錄發送錯誤信息

 

以上:-)

相關文章
相關標籤/搜索