© 2020, Developed by Hieu Dev

Hướng dẫn code chức năng gửi mail trong .NET Core

Gửi email là một yêu cầu phổ biến trong các ứng dụng web ASP.NET Core. Trong bài viết này, chúng ta sẽ tìm hiểu cách gửi email có tệp đính kèm bằng cách sử dụng open source component phổ biến - MailKit. 

Hướng dẫn code chức năng gửi mail trong .NET Core
Hướng dẫn code chức năng gửi mail trong .NET Core


Các bước thực hiện code chức năng gửi mail sẽ tóm gọn trong 5 bước đơn giản sau đây:

1. Cài đặt MailKit NuGet package

MailKit có sẵn trong NuGet package. Nhấp chuột phải vào project của bạn và nhấp vào Manage NuGet packages. Sau đó, tìm kiếm MailKit.

Cài đặt MailKit NuGet package
Cài đặt MailKit NuGet package


Sau khi đã cài đặt xong, bạn có thể dễ dàng sử dụng package này bằng cách import chúng vào code:

using MailKit.Net.Smtp;
using MimeKit;

2. Chuẩn bị email để gửi

Sau bạn đã thêm MailKit vào project .NET Core, bây giờ chúng ta sẽ xây dựng email message mà chúng ta muốn gửi. Như bạn đã biết, một email bao gồm một số thứ như người gửi, người nhận, nội dung thư, hoặc các file đính kèm...

Và những thứ đó cũng có và sẽ được cấu hình trong MimeMessage. Dưới đây là một ví dụ để cấu hình MimeMessage:

MimeMessage message = new MimeMessage();

MailboxAddress from = new MailboxAddress("Admin", 
"admin@example.com");
message.From.Add(from);

MailboxAddress to = new MailboxAddress("User", 
"user@example.com");
message.To.Add(to);

message.Subject = "This is email subject";

Như code trên, ta thấy có sử dụng lớp MailboxAddress để xây dựng địa chỉ người gửi và địa chỉ người nhận. Tham số đầu tiên cho hàm tạo MailboxAddress là tên hiển thị của địa chỉ email, tham số thứ hai là chính địa chỉ email. Bạn nên thay đổi chúng theo thiết lập của bạn. Thuộc tính Subject cho biết chủ đề hay tiêu đề của email.

3. Thêm nội dung email và các tệp đính kèm

Tiếp theo, chúng ta cần đặt nội dung thư và tùy chọn thêm tệp đính kèm email. Cụ thể ta có đoạn code sau:

BodyBuilder bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = "<h1>Hello World!</h1>";
bodyBuilder.TextBody = "Hello World!";

Như bạn thấy, chúng ta sử dụng class BodyBuilder. Nó có hai thuộc tính là HtmlBody và TextBox tương ứng với HTML version và text version của email. 

Tiếp theo, để thêm các tệp đính kèm, và các tệp đính kèm đó là một hoặc nhiều tệp, chúng ta cần đường dẫn đến tệp đó. Thay vì mã hóa cứng các đường dẫn, chúng ta sẽ tính toán chúng bằng cách sử dụng đối tượng IHostingEnosystem như hình dưới đây:

IHostingEnvironment env = null;

public HomeController(IHostingEnvironment env)
{
    this.env = env;
}
...
bodyBuilder.Attachments.Add(env.WebRootPath + "\\file.png");
Như bạn có thể thấy, đoạn code trên ta thêm đính kèm file.png vào email nằm dưới wwwroot. Vì vậy, ta đưa vào một đối tượng IHostingEnosystem và sử dụng thuộc tính WebRootPath của nó để lấy đường dẫn. 

Sau đó, ta thêm các file vào đối tượng BodyBuilder đã tạo trước đó. Khi BodyBuilder đã sẵn sàng, chúng ta có thể tạo một phần thân MimeMessage từ nó như sau:

message.Body = bodyBuilder.ToMessageBody();

Phương thức ToMessageBody() sẽ tạo một nội dung email HTML hoặc text và các tệp đính kèm.

4. Kết nối với SMTP server

Để gửi email mà chúng ta vừa tạo, chúng ta cần kết nối với một máy chủ SMTP. Trong hầu hết các trường hợp, bạn cũng sẽ cần thông tin xác thực bảo mật để kết nối với máy chủ. Đoạn mã sau đây cho biết cách thiết lập kết nối với máy chủ SMTP.

SmtpClient client = new SmtpClient();
client.Connect("smtp_address_here", port_here, true);
client.Authenticate("user_name_here", "pwd_here");

Ở đây, ta tạo một instance cho lớp SmtpClient đại diện cho một client đến một SMTP server. Chúng ta gọi phương thức Connect() của nó và truyền địa chỉ máy chủ SMTP và SMTP port. Tham số Boolean thứ ba cho biết kết nối có yêu cầu SSL hay không. 

Sau đó, chúng ta tiến hành gọi phương thức Authenticate() để xác thực tài khoản người dùng với máy chủ SMTP. Phương thức Authenticate() chấp nhận tên người dùng và mật khẩu làm tham số của nó. 

Bây giờ, ta cần thay đổi các giá trị này để phù hợp với môi trường của bạn. 

Ví dụ bây giờ mình sẽ hướng dẫn đến bạn cách lấy các tham số này từ cấu hình SMTP Gmail đơn giản như sau:

Cấu hình SMTP Gmail

Bạn bắt đầu truy cập website: https://myaccount.google.com/ sau đó đăng nhập tài khoản gmail. Tìm kiếm và chọn thư mục Bảo mật. Nếu trạng thái ở xác minh 2 bước đang tắt thì bạn bật lên như hình sau:

Hướng dẫn code chức năng gửi mail trong .NET Core
Bật chức năng xác minh 2 bước

Sau đó, bạn lấy Mật khẩu ứng dụng 

Hướng dẫn code chức năng gửi mail trong .NET Core
Nhấn vào mật khẩu ứng dụng

Bạn tìm kiếm ô Chọn ứng dụng

Hướng dẫn code chức năng gửi mail trong .NET Core
Tiến hành chọn ứng dụng

Tiếp theo, bạn chọn vào tuỳ chọn “Khác (Tên tuỳ chỉnh)

Hướng dẫn code chức năng gửi mail trong .NET Core
Chọn ứng dụng khác

Ở đây, bạn đặt tên bất kỳ chẳng hạn như hình dưới đây:

Hướng dẫn code chức năng gửi mail trong .NET Core
Chọn tên bất kỳ cho ứng dụng

Sau đó, bạn nhấn nút “Tạo”. Trên màn hình máy tính sẽ hiện mật khẩu, bạn chỉ cần lưu lại mật khẩu này để dùng cấu hình SMTP Gmail.

Hướng dẫn code chức năng gửi mail trong .NET Core
Thiết lập mật khẩu cho ứng dụng

Như vậy là bạn đã có thông tin mật khẩu SMTP rồi, và một số thông số khác của SMTP Gmail như sau:
  • SMTP Server: smtp.gmail.com
  • TLS/SSL: Required
  • SMTP Port: 587
  • SMTP Password: Mật khẩu Gmail của bạn.
  • SMTP Username: tên Gmail mà bạn dùng để tạo mật khẩu ứng dụng ở trên

5. Gửi email

Sau khi định cấu hình kết nối SMTP server, bây giờ chúng ta có thể gửi tin nhắn và sau đó ngắt kết nối khỏi máy chủ.

client.Send(message);
client.Disconnect(true);
client.Dispose();

Phương thức Send() chấp nhận một MimeMessage làm tham số và sẽ gửi tin nhắn đó khi bạn truyền vào. Khi tin nhắn đã được gửi đi, chúng ta có thể ngắt kết nối khỏi máy chủ bằng phương thức Disconnect(). Cuối cùng, chúng ta cần Displose() đối tượng SmtpClient.

Lời kết

Ở các dịch vụ mail khác nhau thì việc cấu hình SMTP sẽ khác nhau, bạn cần thay đổi linh hoạt. 

Mình sẽ viết một bài ví dụ về code trong .Net Core ở phần tới. Chúc các bạn thành công.
Hieu Ho.

Đăng nhận xét

Mới hơn Cũ hơn

TOGETHER

WE GROW