import logging import resend from config import settings logger = logging.getLogger(__name__) def _get_client() -> resend.Resend: return resend.Resend(api_key=settings.resend_api_key) def send_email(to: str, subject: str, html: str) -> None: """Send a transactional email via Resend. Logs errors but does not raise.""" try: client = _get_client() client.emails.send({ "from": settings.email_from, "to": to, "subject": subject, "html": html, }) logger.info("Email sent to %s — subject: %s", to, subject) except Exception as exc: logger.error("Failed to send email to %s: %s", to, exc) raise def send_device_assignment_invite( customer_email: str, serial_number: str, customer_name: str | None = None, ) -> None: """Notify a customer that a Vesper device has been assigned to them.""" greeting = f"Hi {customer_name}," if customer_name else "Hello," html = f"""
{greeting}
A Vesper bell automation device has been registered and assigned to you.
Serial Number:
{serial_number}
Open the Vesper app and enter this serial number to get started.
If you did not expect this email, please contact your system administrator.
A Vesper device has successfully provisioned and is ready to ship.
| Serial Number | {serial_number} |
| Board Type | {hw_type.upper()} |