105 lines
3.7 KiB
Python
105 lines
3.7 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from config import settings
|
|
|
|
|
|
def _bool(v: Any, default: bool) -> bool:
|
|
if isinstance(v, bool):
|
|
return v
|
|
if isinstance(v, str):
|
|
return v.strip().lower() in {"1", "true", "yes", "on"}
|
|
if v is None:
|
|
return default
|
|
return bool(v)
|
|
|
|
|
|
def get_mail_accounts() -> list[dict]:
|
|
"""
|
|
Returns normalized account dictionaries.
|
|
Falls back to legacy single-account config if MAIL_ACCOUNTS_JSON is empty.
|
|
"""
|
|
configured = settings.mail_accounts
|
|
normalized: list[dict] = []
|
|
|
|
for idx, raw in enumerate(configured):
|
|
if not isinstance(raw, dict):
|
|
continue
|
|
key = str(raw.get("key") or "").strip().lower()
|
|
email = str(raw.get("email") or "").strip().lower()
|
|
if not key or not email:
|
|
continue
|
|
normalized.append(
|
|
{
|
|
"key": key,
|
|
"label": str(raw.get("label") or key.title()),
|
|
"email": email,
|
|
"imap_host": raw.get("imap_host") or settings.imap_host,
|
|
"imap_port": int(raw.get("imap_port") or settings.imap_port or 993),
|
|
"imap_username": raw.get("imap_username") or email,
|
|
"imap_password": raw.get("imap_password") or settings.imap_password,
|
|
"imap_use_ssl": _bool(raw.get("imap_use_ssl"), settings.imap_use_ssl),
|
|
"imap_inbox": str(raw.get("imap_inbox") or "INBOX"),
|
|
"imap_sent": str(raw.get("imap_sent") or "Sent"),
|
|
"smtp_host": raw.get("smtp_host") or settings.smtp_host,
|
|
"smtp_port": int(raw.get("smtp_port") or settings.smtp_port or 587),
|
|
"smtp_username": raw.get("smtp_username") or email,
|
|
"smtp_password": raw.get("smtp_password") or settings.smtp_password,
|
|
"smtp_use_tls": _bool(raw.get("smtp_use_tls"), settings.smtp_use_tls),
|
|
"sync_inbound": _bool(raw.get("sync_inbound"), True),
|
|
"allow_send": _bool(raw.get("allow_send"), True),
|
|
}
|
|
)
|
|
|
|
if normalized:
|
|
return normalized
|
|
|
|
# Legacy single-account fallback
|
|
if settings.imap_host or settings.smtp_host:
|
|
legacy_email = (settings.smtp_username or settings.imap_username or "").strip().lower()
|
|
if legacy_email:
|
|
return [
|
|
{
|
|
"key": "default",
|
|
"label": "Default",
|
|
"email": legacy_email,
|
|
"imap_host": settings.imap_host,
|
|
"imap_port": settings.imap_port,
|
|
"imap_username": settings.imap_username,
|
|
"imap_password": settings.imap_password,
|
|
"imap_use_ssl": settings.imap_use_ssl,
|
|
"imap_inbox": "INBOX",
|
|
"imap_sent": "Sent",
|
|
"smtp_host": settings.smtp_host,
|
|
"smtp_port": settings.smtp_port,
|
|
"smtp_username": settings.smtp_username,
|
|
"smtp_password": settings.smtp_password,
|
|
"smtp_use_tls": settings.smtp_use_tls,
|
|
"sync_inbound": True,
|
|
"allow_send": True,
|
|
}
|
|
]
|
|
|
|
return []
|
|
|
|
|
|
def account_by_key(key: str | None) -> dict | None:
|
|
k = (key or "").strip().lower()
|
|
if not k:
|
|
return None
|
|
for acc in get_mail_accounts():
|
|
if acc["key"] == k:
|
|
return acc
|
|
return None
|
|
|
|
|
|
def account_by_email(email_addr: str | None) -> dict | None:
|
|
e = (email_addr or "").strip().lower()
|
|
if not e:
|
|
return None
|
|
for acc in get_mail_accounts():
|
|
if acc["email"] == e:
|
|
return acc
|
|
return None
|