from __future__ import annotations from datetime import datetime from email.message import EmailMessage import smtplib from app.config import settings from app.schemas.booking import BookingRequestCreate class MailConfigurationError(RuntimeError): pass def _build_booking_subject(payload: BookingRequestCreate) -> str: return f"{settings.booking_email_subject_prefix} Nuova richiesta visita - {payload.name}" def _build_booking_html(payload: BookingRequestCreate) -> str: submitted_at = datetime.now().strftime("%d/%m/%Y %H:%M") return f"""
È stata inviata una nuova richiesta di prenotazione non vincolante dal sito web.
| Nome e cognome | {payload.name} |
| Telefono | {payload.phone} |
| Nome animale | {payload.pet_name or "-"} |
| Tipo animale | {payload.pet_type} |
| Tipo di visita | {payload.service} |
| Data preferita | {payload.date} |
| Orario preferito | {payload.time or "Qualsiasi orario"} |
| Note | {payload.notes or "-"} |
| Inviata il | {submitted_at} |
Questa richiesta non costituisce conferma automatica dell'appuntamento e richiede presa in carico da parte dello staff.
""" def _build_booking_text(payload: BookingRequestCreate) -> str: submitted_at = datetime.now().strftime("%d/%m/%Y %H:%M") return ( "Nuova richiesta di prenotazione visita\n\n" f"Nome e cognome: {payload.name}\n" f"Telefono: {payload.phone}\n" f"Nome animale: {payload.pet_name or '-'}\n" f"Tipo animale: {payload.pet_type}\n" f"Tipo di visita: {payload.service}\n" f"Data preferita: {payload.date}\n" f"Orario preferito: {payload.time or 'Qualsiasi orario'}\n" f"Note: {payload.notes or '-'}\n" f"Inviata il: {submitted_at}\n\n" "La richiesta non costituisce conferma automatica dell'appuntamento." ) def send_booking_request_email(payload: BookingRequestCreate) -> None: if not settings.booking_mail_enabled: raise MailConfigurationError("Configurazione SMTP incompleta.") message = EmailMessage() message["Subject"] = _build_booking_subject(payload) message["From"] = settings.booking_email_from message["To"] = settings.booking_email_to message.set_content(_build_booking_text(payload)) message.add_alternative(_build_booking_html(payload), subtype="html") with smtplib.SMTP(settings.smtp_host, settings.smtp_port, timeout=30) as server: if settings.smtp_use_tls: server.starttls() server.login(settings.smtp_username, settings.smtp_password) server.send_message(message)