update: Major Overhaul to all subsystems
This commit is contained in:
104
backend/crm/mail_accounts.py
Normal file
104
backend/crm/mail_accounts.py
Normal file
@@ -0,0 +1,104 @@
|
||||
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
|
||||
Reference in New Issue
Block a user