02/10/2018, 00:44

[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:

table sinh viên

Nhập dữ liệu mẫu vào trong tbl_sinhvien

table dữ liệu email sinh viên C#

+ 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 :)

Tags: email
0