v0.143.0
 1"""Email backend for previewing sent messages during development.
 2
 3Messages are captured as .eml files in ``.plain/emails/`` so you can inspect
 4them — either via the Plain toolbar panel (when ``plain.toolbar`` is
 5installed) or by opening the .eml in Mail.app. Nothing is delivered to a real
 6SMTP server.
 7"""
 8
 9from __future__ import annotations
10
11from datetime import datetime
12from typing import TYPE_CHECKING
13
14from plain.runtime import PLAIN_TEMP_PATH
15from plain.utils.crypto import get_random_string
16
17from .base import BaseEmailBackend
18
19if TYPE_CHECKING:
20    from ..message import EmailMessage
21
22
23__all__ = ["EmailBackend"]
24
25
26EMAIL_DIR = PLAIN_TEMP_PATH / "emails"
27
28
29class EmailBackend(BaseEmailBackend):
30    def send_messages(self, email_messages: list[EmailMessage]) -> int:
31        if not email_messages:
32            return 0
33
34        EMAIL_DIR.mkdir(parents=True, exist_ok=True)
35
36        count = 0
37        for message in email_messages:
38            timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
39            stem = f"{timestamp}-{get_random_string(8)}"
40            (EMAIL_DIR / f"{stem}.eml").write_bytes(
41                message.message().as_bytes(linesep="\r\n")
42            )
43            count += 1
44        return count