mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-07-22 00:38:49 +00:00
First successful live run surfaced three issues: 1. Email looked rubbish (a giant raw presigned URL). Now sends a proper HTML email with a 'Download documents' button plus a plain-text fallback, and a summary (N documents across M properties, expiry). Email delivery is now best-effort: a transport failure no longer loses an already-built package (the link is still on sub_task.outputs), and the SMTP connect has a 30s timeout so an unreachable SES endpoint fails fast instead of hanging to the 900s Lambda timeout. 2. Every folder was 'address unavailable (...)': the resolver read property.address, but these are HubSpot deals with no property row. It now uses the deal's dealname from hubspot_deal_data. 3. No logs / no idea why a run took ~9 minutes: the worker's INFO logs were dropped (Lambda root logger defaults to WARNING). The handler now raises the level, and the orchestrator logs per-phase timing and volume (gather+plan, packaged N files / X MB, upload, email, total) so the slow phase is visible. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
19 lines
641 B
Python
19 lines
641 B
Python
"""The outbound-email port (ADR-0059).
|
|
|
|
A narrow interface the orchestrator depends on to notify a user, so the
|
|
transport (SES over SMTP today) stays swappable and testable behind it.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Optional, Protocol
|
|
|
|
|
|
class EmailSender(Protocol):
|
|
def send(
|
|
self, *, to: str, subject: str, body: str, html_body: Optional[str] = None
|
|
) -> None:
|
|
"""Send an email to ``to``. ``body`` is the plain-text part; when
|
|
``html_body`` is given it is added as an HTML alternative (clients that
|
|
render HTML show it, others fall back to the plain text)."""
|
|
...
|