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"""

Your Vesper device is ready

{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.

""" send_email( to=customer_email, subject=f"Your Vesper device is ready — {serial_number}", html=html, ) def send_device_provisioned_alert( admin_email: str, serial_number: str, hw_type: str, ) -> None: """Internal alert sent to an admin when a device reaches provisioned status.""" html = f"""

Device Provisioned

A Vesper device has successfully provisioned and is ready to ship.

Serial Number {serial_number}
Board Type {hw_type.upper()}

View in Admin Console

""" send_email( to=admin_email, subject=f"[Vesper] Device provisioned — {serial_number}", html=html, )