[C#] Hướng dẫn sử dụng Windows Services để gởi email hàng ngày trong lập trình Csharp
Bài viết hôm nay, mình sẽ hướng dẫn các bạn sử dụng Windows Services trong C# và VB.NET để tạo lịch gởi email hằng ngày. Trong .NET đã có hỗ trợ cho chúng ta tạo một dịch vụ windows rất dễ dàng. Mình ví dụ: Nếu các bạn viết một phần mềm quản lý nhân ...
Bài viết hôm nay, mình sẽ hướng dẫn các bạn sử dụng Windows Services trong C# và VB.NET để tạo lịch gởi email hằng ngày. Trong .NET đã có hỗ trợ cho chúng ta tạo một dịch vụ windows rất dễ dàng.
Mình ví dụ: Nếu các bạn viết một phần mềm quản lý nhân sự. Hằng ngày sau 7h30, các bạn muốn đọc dữ liệu từ máy chấm công về database của mình thì các bạn cũng có thể ứng dụng bài viết này của mình, để tạo một dịch vụ sử dụng cho mục đích của bạn.
Vậy Windows Services là gì?
Serives là ứng dụng chạy ngầm của hệ điều hành Windows.
Dùng để xử lý những công việc nặng nề và cần nhiều thời gian hay còn gọi là các long-running tasks (ví dụ gửi các email đang được xếp trong hàng đợi trong database, hoặc dùng để consolidate dữ liệu thô – raw data thành dữ liệu có thể được dùng trong report).
Có thể chạy mà không cần sử dụng giao diện người dùng.
Hoạt động độc lập so với giao diện người dùng, nên dễ dàng thực hiện việc deploy, maintain.
Rất dễ cài đặt chỉ với vài câu lệnh trong Command Prompt, hoặc tiện lợi hơn bạn có thể dùng file .bat để tự động việc đó dùm bạn.
Có các option để khởi động cùng với hệ điều hành (startup type).
I. Thực hiện hướng dẫn gởi email hàng ngày bằng Windows services
1. Khái niệm:
Trong bài viết này, các dịch vụ Windows sẽ thực hiện một nhiệm vụ hàng ngày tại một thời điểm cụ thể. Gọi là để lấy tất cả các hồ sơ của học sinh có sinh nhật ngày hôm nay.
Học sinh đó sẽ nhận được một email có chứa Birthday muốn tự động bởi các dịch vụ Windows.
2. Cơ sở dữ liệu
Các bạn tạo một cấu trúc dữ liệu như sau:
Nhập dữ liệu mẫu vào trong tbl_sinhvien
+ Chỉnh sửa file App.config
Sửa đổi các xử lý sự kiện SchedularCallback
Chúng tôi sẽ cần phải sửa đổi SchedularCallback xử lý sự kiện để tự động lấy hồ sơ của học sinh có một sinh nhật và gửi email.
Lần đầu tiên một truy vấn được thực thi để lấy tất cả các hồ sơ của học sinh bằng cách kết hợp các ngày và tháng sinh của họ với các ngày và tháng ngày tháng hiện hành tương ứng.
Sau đó, một vòng lặp được thực thi và từng người một một email được gửi đến từng sinh viên.
Một khi các công tác được thực hiện các dịch vụ Windows vào chế độ nghỉ ngơi và sẽ một lần nữa thực hiện các nhiệm vụ tương tự sau 24 giờ ở thời gian quy định.
Source code C#
private void SchedularCallback(object e) { try { DataTable dt = new DataTable(); string query = “SELECT Name, Email FROM Students WHERE DATEPART(DAY, BirthDate) = @Day AND DATEPART(MONTH, BirthDate) = @Month”; string constr = ConfigurationManager.ConnectionStrings[“constr”].ConnectionString; using (SqlConnection con = new SqlConnection(constr)) { using (SqlCommand cmd = new SqlCommand(query)) { cmd.Connection = con; cmd.Parameters.AddWithValue(“@Day”, DateTime.Today.Day); cmd.Parameters.AddWithValue(“@Month”, DateTime.Today.Month); using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) { sda.Fill(dt); } } } foreach(DataRow row in dt.Rows) { string name = row[“Name”].ToString(); string email = row[“Email”].ToString(); WriteToFile(“Trying to send email to: ” + name + ” ” + email); using (MailMessage mm = new MailMessage(“sender@gmail.com”, email)) { mm.Subject = “Birthday Greetings”; mm.Body = string.Format(“Happy Birthday {0} Many happy returns of the day.”, name); mm.IsBodyHtml = true; SmtpClient smtp = new SmtpClient(); smtp.Host = “smtp.gmail.com”; smtp.EnableSsl = true; System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(); credentials.UserName = “sender@gmail.com”; credentials.Password = “”; smtp.UseDefaultCredentials = true; smtp.Credentials = credentials; smtp.Port = 587; smtp.Send(mm); WriteToFile(“Email sent successfully to: ” + name + ” ” + email); } } this.ScheduleService(); } catch (Exception ex) { WriteToFile(“Simple Service Error on: {0} ” + ex.Message + ex.StackTrace); //Stop the Windows Service. using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(“SimpleService”)) { serviceController.Stop(); } } }
Source code VB.NET
Private Sub SchedularCallback(e As Object) Try Dim dt As New DataTable() Dim query As String = “SELECT Name, Email FROM Students WHERE DATEPART(DAY, BirthDate) = @Day AND DATEPART(MONTH, BirthDate) = @Month” Dim constr As String = ConfigurationManager.ConnectionStrings(“constr”).ConnectionString Using con As New SqlConnection(constr) Using cmd As New SqlCommand(query) cmd.Connection = con cmd.Parameters.AddWithValue(“@Day”, DateTime.Today.Day) cmd.Parameters.AddWithValue(“@Month”, DateTime.Today.Month) Using sda As New SqlDataAdapter(cmd) sda.Fill(dt) End Using End Using End Using For Each row As DataRow In dt.Rows Dim name As String = row(“Name”).ToString() Dim email As String = row(“Email”).ToString() WriteToFile(“Trying to send email to: ” & name & ” ” & email) Using mm As New MailMessage(“sender@gmail.com”, email) mm.Subject = “Birthday Greetings” mm.Body = String.Format(“Happy Birthday {0} Many happy returns of the day.”, name) mm.IsBodyHtml = True Dim smtp As New SmtpClient() smtp.Host = “smtp.gmail.com” smtp.EnableSsl = True Dim credentials As New System.Net.NetworkCredential() credentials.UserName = “sender@gmail.com” credentials.Password = “” smtp.UseDefaultCredentials = True smtp.Credentials = credentials smtp.Port = 587 smtp.Send(mm) WriteToFile(“Email sent successfully to: ” & name & ” ” & email) End Using Next Me.ScheduleService() Catch ex As Exception WriteToFile(“Simple Service Error on: {0} ” + ex.Message + ex.StackTrace) ‘Stop the Windows Service. Using serviceController As New System.ServiceProcess.ServiceController(“SimpleService”) serviceController.[Stop]() End Using End Try End Sub
Theo http://laptrinhasp.com
Have Fun :)