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