- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[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 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
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
Have Fun :)