Przejdź do treści

TailoredApps.Shared.MediatR.Email

NuGet License: MIT


Opis

Integracja wysyłania emaili z pipeline MediatR. Biblioteka dostarcza command SendMail oraz jego handler SendMailCommandHandler, dzięki czemu wysyłka emaila staje się naturalną częścią architektury CQRS — możesz wysłać email przez _mediator.Send(new SendMail { ... }) bez bezpośredniej zależności od IEmailProvider.

To podejście umożliwia łatwe wzbogacenie procesu wysyłki o logowanie, retry i auditing z poziomu pipeline behaviors, bez modyfikowania handlera.


Instalacja

dotnet add package TailoredApps.Shared.MediatR.Email

Rejestracja w DI

// Program.cs
using TailoredApps.Shared.Email;
using TailoredApps.Shared.MediatR.Email.Handlers;
using TailoredApps.Shared.Email.MailMessageBuilder;

// 1. Zarejestruj email provider (SMTP lub konsola)
builder.Services.RegisterSmtpProvider();

// 2. Zarejestruj mail message builder
builder.Services.AddTransient<IMailMessageBuilder, TokenReplacingMailMessageBuilder>();
builder.Services.Configure<TokenReplacingMailMessageBuilderOptions>(o =>
{
    o.Location = "EmailTemplates/";
    o.FileExtension = "html";
});

// 3. Zarejestruj handler
builder.Services.AddTransient<ISendMailCommandHandler, SendMailCommandHandler>();

// 4. MediatR (jeśli jeszcze nie zarejestrowany)
builder.Services.AddMediatR(cfg =>
    cfg.RegisterServicesFromAssembly(typeof(Program).Assembly));

Przykład użycia

public class UserRegistrationService
{
    private readonly IMediator _mediator;

    public UserRegistrationService(IMediator mediator) => _mediator = mediator;

    public async Task RegisterUserAsync(string email, string userName)
    {
        // Logika rejestracji...

        // Wyślij email powitalny przez MediatR pipeline
        var result = await _mediator.Send(new SendMail
        {
            Recipent = email,
            Subject = "Witaj w naszym serwisie!",
            Template = "welcome.html",
            TemplateVariables = new Dictionary<string, string>
            {
                { "UserName", userName },
                { "ActivationUrl", $"https://app.example.com/activate/{Guid.NewGuid()}" }
            },
            Attachments = null
        });

        Console.WriteLine($"Email wysłany, MessageId: {result.MessageId}");
    }

    public async Task SendInvoiceAsync(
        string email,
        string invoiceNumber,
        byte[] pdfContent)
    {
        await _mediator.Send(new SendMail
        {
            Recipent = email,
            Subject = $"Faktura #{invoiceNumber}",
            Template = "invoice.html",
            TemplateVariables = new Dictionary<string, string>
            {
                { "InvoiceNumber", invoiceNumber }
            },
            Attachments = new Dictionary<string, byte[]>
            {
                { $"faktura_{invoiceNumber}.pdf", pdfContent }
            }
        });
    }
}

API Reference

Typ Rodzaj Opis
SendMail Command (IRequest<SendMailResponse>) Dane emaila: Recipent, Subject, Template, TemplateVariables, Templates, Attachments
SendMailResponse Klasa Wynik wysyłki: MessageId (provider-specific identifier)
SendMailCommandHandler Handler Buduje treść z szablonu i wysyła przez IEmailProvider
ISendMailCommandHandler Interfejs Kontrakt handlera

🤖 AI Agent Prompt

## TailoredApps.Shared.MediatR.Email — Instrukcja dla agenta AI

Używasz TailoredApps.Shared.MediatR.Email do wysyłania emaili przez MediatR pipeline.

### Rejestracja
```csharp
builder.Services.RegisterSmtpProvider(); // lub RegisterConsoleProvider()
builder.Services.AddTransient<IMailMessageBuilder, TokenReplacingMailMessageBuilder>();
builder.Services.AddTransient<ISendMailCommandHandler, SendMailCommandHandler>();

Wysyłanie emaila

var result = await _mediator.Send(new SendMail
{
    Recipent = "user@example.com",
    Subject = "Temat",
    Template = "template.html",           // nazwa pliku szablonu
    TemplateVariables = new() { { "Name", "Jan" } },
    Attachments = null                     // lub Dictionary<string, byte[]>
});
// result.MessageId — ID przypisany przez provider

Zasady

  • Template to klucz szablonu przekazywany do IMailMessageBuilder.Build()
  • TemplateVariables zastępują {{token}} w szablonie
  • Podaj Templates (Dictionary) gdy szablony są inline, nie z pliku
  • SendMail rzuci jeśli template nie zostanie znaleziony w IMailMessageBuilder ```