a2fe4a49e3
Сотрудник сам подключает ящик (autoconfig, вложения, пагинация списка, надёжный IMAP-поиск); в хедере работает /api/search по разделам и сущностям с ACL. Также устойчивость Mattermost-токена для чата. Co-authored-by: Cursor <cursoragent@cursor.com>
108 lines
4.1 KiB
Python
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,
|
|
)
|