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

Nuova richiesta di prenotazione visita

È 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}
Medico richiesto{payload.doctor}
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"Medico richiesto: {payload.doctor}\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)