"""Mailer interface for transactional email. Implementations: ConsoleMailer (dev default — logs the link) and SMTPMailer (operator-configured). Selected by config; resolved via app.api.deps.get_mailer. Real deployments will move sending to the worker; for now it is inline. """ from abc import ABC, abstractmethod class Mailer(ABC): @abstractmethod async def send_email_verification(self, *, to: str, link: str) -> None: ... @abstractmethod async def send_password_reset(self, *, to: str, link: str) -> None: ...