Hướng dẫn gửi email và đọc nội dung email bằng C#

Tác giả

Tác giả Nguyễn Thắng Hưng đang là Software Engineer tại công ty Infodation. Trong bài viết này, tác giả chia sẻ về cách sử dụng thư viện MailKit trong ứng dụng ASP.NET Core API.

Biết thêm về tác giả tại Facebook Thắng Hưng.

Nội dung

MailKit là gì?

MailKit là một nền tảng đa nguồn mở. Thư viện mail-client NET dựa trên MimeKit và được tối ưu hóa cho các thiết bị di động.

MailKit hỗ trợ cho Gmail, HotMail, Office365.

Bắt đầu

Trong bài hướng dẫn này mình sẽ dung dotnet core API để hướng dẫn (Console, Windows, WebForm, MVC cũng áp dụng tương tự 😉).

Chuẩn bị

  • Editor Visual Studio 20XX
  • Kiến thức C#
  • 2 email để test 😉
  • Để Gmail cho phép ứng dụng của bạn kết nối đến server SMTP của nó với xác thực là tài khoản gmail của bạn, bạn cần thiết lập tài khoản email của bạn như sau:
  • Vào địa chỉ https://myaccount.google.com/security
  • Ở menu trái chọn mục Bảo mật, sau đó tại mục Quyền truy cập của ứng dụng kém an toàn phải ở chế độ bật

Cài đặt thư viện MailKit

Tạo mới 1 project C# bằng Visual Studio (Console, Web, Window Form,…). Mình chọn ASP.NET Core Web API => đặt tên cho project.

Sau khi tạo xong project hãy xóa 2 tệp WeatherForecast.csWeatherForecastController.cs. Tạo mới 1 folder có tên là Services

Trên thanh menu của VS chọn Tool > NuGet Package Manager > Package Manager Console

Trên cửa sổ Package Manager Console nhập Install-Package MailKit và nhập Install-Package Swashbuckle.AspNetCore để cài đặt thư viện.

Bắt đầu code

Trên thanh Solution bên phải nhấp chuột trái vào Services sau đó chuột phải chọn Add > New Item…

Cửa sổ items hiện ra hãy chọn interface và đặt tên là IMailRepository và nhấp nút Add


Tương tự tạo tiếp 1 class và đặt tên là MailRepository và cho nó kế thừa interface trên


Tiếp theo vào file IMailRepository để viết vài function cho email

Đầu tiên là function GetUnredMails có chức năng đọc mail, function gồm có 4 parameter: mailServer (server của mail mà mình muốn kết nối, VD: gmail, office365,…), port (cổng của mỗi server), login (tên tài khoản đăng nhập, VD: adb@gmail.com), password (mật khẩu đăng nhập). Kiểu trả về là 1 list string chứa nội dung của email còn Task là từ khóa của lập trình bất đồng bộ.

Tiếp theo là function SendMail  có chức năng gửi mail, function gồm có 7 parameter: mailServer (server của mail mà mình muốn kết nối, VD: gmail, office365,…), port (cổng của mỗi server), login (tên tài khoản đăng nhập, VD: adb@gmail.com), password (mật khẩu đăng nhập), to (email bạn muốn gửi đến), subject (tiêu đề của email), html (bạn có thể gửi dạng text hoặc html).

Bây giờ ta vào file MailRepository để triển khai 2 funtion trên. Đầu tiên là function GetUnreadMails

Ở đây mình dung lập trình bất đồng bộ nên luôn có cặp từ khóa async await:

  • Line 19: tạo 1 list để lưu nội dung của tất cả các email chưa đọc.
  • Line 20 => 28: cú pháp kết nối với server của MailKit.
  • Line 29: bạn có thể setting cho nó là ReadOnly hoặc ReadWrite. Sự khác nhau giữa 2 hàm này là 1 cái chỉ đọc không cho nó làm gì còn cái kia là đọc xong mình có thể đánh dấu nó đã đọc hoặc xóa email đó. Trong trường hợp này mình muốn vừa đọc xong email là đánh dấu nó đã được đọc luôn thì lần sau sẽ không đọc lại email đó nữa nên mình dung ReadWrite.
  • Line 30: viết query để MailKit có thể tìm kiếm đúng hòm thư mà mình muốn, query này trả về 1 list mail. Có rất nhiều query trong đó nên bạn cứ nghịch thoải mái 😉.
  • Line 31 => 37: viết 1 vòng lặp để đọc từng thư trong đó. Dòng 33:lấy Id của mail. Dòng 34: đưa nội dung (mình lấy html nha, còn bạn nào muốn lấy text thì tự nghịch nhé xem như thử thách 😉) của email vào list string lúc đầu mình tạo.
  • Line 36: gọi hàm đánh dấu xác nhận email đó đã đọc.
  • Line 38: ngắt kết nối với server để giải phóng dung lượng cho project.
  • Line 40: trả về 1 list chứa nội dung của email mà mình đọc được

Tiếp theo là function SendMail

  • Line 48: add địa chỉ email của bạn (địa chỉ email bạn đăng nhập)
  • Line 49: add địa chỉ bạn muốn gửi
  • Line 50: add tiêu đề cho email
  • Line 51: add nội dung cho email (có thể là html hoặc text)
  • Line 54 => 58: cú pháp của thư viện

Hướng dẫn sử dụng function

Những bạn không dùng API thì chỉ tập trung vào cách dùng function thôi nhé, khi biết dùng function rồi thì có thể bỏ qua các bước phía dưới:

  • Tạo mới 1 controller: đưa chuột vào thư mục Controllers > chuột phải > Add > New item… chọn API Controller Empty, đặt tên file: MailKitControllerAdd
  • Triển khai API đọc email
  • Line 27: gọi function đọc mail mà mình vừa tạo. Các parameter truyền vào tương ứng với emailServer, port, user, password mà mình tạo bên service.
  • Nếu bạn không dùng dotnet core thì có thể dùng function như sau:
  • Line 33 => 37: sau khi ta lấy list content email, cho nó vào 1 vòng lặp để mình lấy hết nội dung của từng email đó và sau đó nối chuỗi cho biến contentText. Biến contentText dùng để chứa tất cả các nội dung mà mình lấy được.
  • Nên dùng try catch vì khi mình dùng thư viện nào đó, nếu có lỗi nó sẽ bắt được những lỗi mà mình không cover được và quăng ra 1 message để mình biết nó là lỗi gì.
  • Tương tự triển khai API send mail
  • Vào thư mục Startup.cs để tiến hành đăng ký service bằng cách DI (chỉ áp dụng cho dotnet core 😉).
  • Trong function ConfigureServices hãy thêm vài dòng code dưới đây

Configure

  • Chỗ nào báo đỏ cứ chuột phải và chọn bóng đèn rồi add câu lệnh using nha 😉. Vào folder Properties > chọn file launchSettings.json và chỉnh file

Nhấp nút

để chạy project

Nhấp chữ GET mở ra 1 form cho mình truyền parameter

Chọn Try it out và truyền parameter vào sau đó nhấp Execute, kéo xuống Server response để xem kết quả. Nếu 200 là thành công còn khác 200 nó sẽ báo lỗi cho bạn fix. Lưu ý: phải chắc chắn trong gmail của bạn có thư là chưa đọc nếu không thì nó sẽ trả về 200 và không có nội dung nào cả

SendMail cũng chạy tương tự vậy nhá.

Tham khảo mã nguồn

https://github.com/jstedfast/MailKit