Files
ACORE/apps/mail_connector/mail_settings.py
T
lokses a2fe4a49e3 mail + portal: самоподключение почты, веб-клиент и глобальный поиск
Сотрудник сам подключает ящик (autoconfig, вложения, пагинация списка, надёжный IMAP-поиск); в хедере работает /api/search по разделам и сущностям с ACL. Также устойчивость Mattermost-токена для чата.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-22 12:22:53 +03:00

108 lines
4.1 KiB
Python

"""Настройки IMAP/SMTP из ConnectorConfig (mail или carbonio) + переопределения ящика."""
from __future__ import annotations
from dataclasses import dataclass
from core.models import ConnectorConfig
class MailConfigError(Exception):
"""Почтовый сервер не настроен."""
@dataclass(frozen=True)
class MailSettings:
imap_host: str
imap_port: int
smtp_host: str
smtp_port: int
use_ssl: bool = True
verify_ssl: bool = False
@classmethod
def from_connector(cls, cfg: ConnectorConfig) -> MailSettings:
extra = cfg.extra_config or {}
imap_port = extra.get('imap_port') or (993 if cfg.use_ssl else 143)
smtp_port = extra.get('smtp_port') or (465 if cfg.use_ssl else 587)
return cls(
imap_host=cfg.host,
imap_port=int(imap_port),
smtp_host=extra.get('smtp_host') or cfg.host,
smtp_port=int(smtp_port),
use_ssl=bool(cfg.use_ssl),
verify_ssl=bool(extra.get('verify_ssl', False)),
)
def get_mail_settings() -> MailSettings:
"""Активные настройки: приоритет connector_type=mail, иначе carbonio (IMAP на том же хосте)."""
cfg = ConnectorConfig.get_for('mail')
if cfg:
return MailSettings.from_connector(cfg)
carbonio = ConnectorConfig.get_for('carbonio')
if carbonio and carbonio.host:
extra = carbonio.extra_config or {}
return MailSettings(
imap_host=carbonio.host,
imap_port=int(extra.get('imap_port', 993)),
smtp_host=extra.get('smtp_host') or carbonio.host,
smtp_port=int(extra.get('smtp_port', 465)),
use_ssl=True,
verify_ssl=bool(extra.get('verify_ssl', False)),
)
raise MailConfigError(
'Почта не настроена. Включите коннектор «Почта (IMAP/SMTP)» или Carbonio CE '
'в админке → Настройки коннекторов.'
)
def resolve_mail_settings(mailbox=None) -> MailSettings:
"""Глобальные настройки сервера + необязательные переопределения из UserMailbox.
Если портальный коннектор не настроен, но у ящика указаны хосты — используем их.
"""
try:
base = get_mail_settings()
except MailConfigError:
base = None
if mailbox is None:
if base is None:
raise MailConfigError(
'Почта не настроена. Включите коннектор «Почта (IMAP/SMTP)» или Carbonio CE '
'в админке → Настройки коннекторов.'
)
return base
imap_host = (mailbox.imap_host or '').strip()
smtp_host = (mailbox.smtp_host or '').strip()
if base is not None:
imap_host = imap_host or base.imap_host
smtp_host = smtp_host or base.smtp_host
imap_port = int(mailbox.imap_port or base.imap_port or 993)
smtp_port = int(mailbox.smtp_port or base.smtp_port or 465)
use_ssl = bool(mailbox.use_ssl) if mailbox.imap_host or mailbox.smtp_host else base.use_ssl
verify_ssl = bool(mailbox.verify_ssl) if mailbox.imap_host or mailbox.smtp_host else base.verify_ssl
else:
if not imap_host:
raise MailConfigError(
'Не вказано IMAP-сервер. Увімкніть коннектор пошти в порталі '
'або вкажіть хост вручну / дочекайтесь автоконфігу.'
)
imap_port = int(mailbox.imap_port or 993)
smtp_port = int(mailbox.smtp_port or 465)
smtp_host = smtp_host or imap_host
use_ssl = bool(mailbox.use_ssl)
verify_ssl = bool(mailbox.verify_ssl)
return MailSettings(
imap_host=imap_host,
imap_port=imap_port,
smtp_host=smtp_host or imap_host,
smtp_port=smtp_port,
use_ssl=use_ssl,
verify_ssl=verify_ssl,
)