IEmailSender trong netcore

Nó hoạt động theo cơ chế Dependency Injection (DI)bạn phải tự cài đặt cách gửi email.

👉 Đây là interface, Identity chỉ biết gọi, không biết gửi bằng cách nào.

public interface IEmailSender
{
    Task SendEmailAsync(string email, string subject, string htmlMessage);
}

2. Luồng hoạt động tổng quát

Controller / Razor Page
        ↓
_emailSender.SendEmailAsync(...)
        ↓
EmailSender (class bạn viết)
        ↓
SMTP / SendGrid / MailKit
        ↓
Email được gửi

👉 Identity không can thiệp vào bước này.


3. Cách _emailSender được inject (DI)

Đăng ký trong Program.cs

builder.Services.AddTransient<IEmailSender, SmtpEmailSender>();

👉 Khi ASP.NET Core tạo Controller:

  • Nó thấy cần IEmailSender
  • Nó tạo SmtpEmailSender
  • Gán vào _emailSender

4. Ví dụ implement _emailSender bằng SMTP

Ví dụ này chỉ minh họa, không có nội dung nhạy cảm.

using System.Net;
using System.Net.Mail;

public class SmtpEmailSender : IEmailSender
{
    private readonly IConfiguration _config;

    public SmtpEmailSender(IConfiguration config)
    {
        _config = config;
    }

    public async Task SendEmailAsync(string email, string subject, string htmlMessage)
    {
        var smtpClient = new SmtpClient(
            _config["Email:SmtpServer"],
            int.Parse(_config["Email:Port"])
        )
        {
            Credentials = new NetworkCredential(
                _config["Email:Username"],
                _config["Email:Password"]
            ),
            EnableSsl = true
        };

        var mail = new MailMessage
        {
            From = new MailAddress(_config["Email:From"]),
            Subject = subject,
            Body = htmlMessage,
            IsBodyHtml = true
        };

        mail.To.Add(email);

        await smtpClient.SendMailAsync(mail);
    }
}

5. Cách gọi _emailSender trong Controller

await _emailSender.SendEmailAsync(
    user.Email,
    "Xác nhận email",
    "Vui lòng nhấn link để xác nhận tài khoản."
);

👉 Controller chỉ gọi, không quan tâm SMTP.


6. _emailSender KHÔNG tự chạy

⚠️ Quan trọng:

  • _emailSender không tự động gửi email
  • Identity không gọi nó
  • Bạn phải gọi thủ công

Ví dụ:

  • Sau khi đăng ký
  • Khi reset password
  • Khi resend email

4. Identity kết hợp _emailSender thế nào

Bước 1: Tạo User

await _userManager.CreateAsync(user, password);

Bước 2: Tạo token xác nhận email

var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

👉 Token được tạo bởi Data Protection API, không phải EmailStore.


Bước 3: Tạo link xác nhận

var link = Url.Action(
    "ConfirmEmail",
    "Account",
    new { userId = user.Id, token = token },
    Request.Scheme);

Bước 4: Gửi email

await _emailSender.SendEmailAsync(
    user.Email,
    "Xác nhận email",
    $"Click vào link: <a href='{link}'>Confirm</a>");

Bước 5: User click link → xác nhận

await _userManager.ConfirmEmailAsync(user, token);

👉 Lúc này:

  • UserManager gọi
  • IUserEmailStore.SetEmailConfirmedAsync(...)
  • Lưu EmailConfirmed = true vào DB

Identity chỉ hỗ trợ:

  • Tạo token
  • Xác nhận token
  • Lưu trạng thái email

8. Vì sao Microsoft thiết kế như vậy?

✔ Không ép dùng SMTP
✔ Dùng được cho API / Mobile
✔ Thay SendGrid → SMTP không đổi code
✔ Dễ test (mock IEmailSender)

Hãy bình luận đầu tiên

Để lại một phản hồi

Thư điện tử của bạn sẽ không được hiện thị công khai.


*