incomming mail processing
This commit is contained in:
@@ -18,6 +18,7 @@ from backend.app.services.email_service import (
|
||||
send_verification_email,
|
||||
smtp_configured,
|
||||
)
|
||||
from backend.app.services.inbound_email_service import get_imap_settings, imap_configured, save_imap_settings
|
||||
from backend.app.services.email_verification import create_verification_token
|
||||
from backend.app.services.theme_service import THEMES, get_enabled_themes, save_enabled_themes
|
||||
from backend.app.services.secret_store import encrypt_secret
|
||||
@@ -63,6 +64,16 @@ class AdminThemesUpdate(BaseModel):
|
||||
themes: list[str]
|
||||
|
||||
|
||||
class AdminImapUpdate(BaseModel):
|
||||
imap_host: str
|
||||
imap_port: int = 993
|
||||
imap_username: str = ''
|
||||
imap_password: str = ''
|
||||
imap_mailbox: str = 'INBOX'
|
||||
imap_use_ssl: bool = True
|
||||
imap_poll_interval_seconds: int = 60
|
||||
|
||||
|
||||
def validate_smtp_values(payload: AdminSmtpUpdate, current: dict | None = None) -> dict:
|
||||
smtp_host = payload.smtp_host.strip()
|
||||
smtp_from = payload.smtp_from.strip()
|
||||
@@ -80,6 +91,27 @@ def validate_smtp_values(payload: AdminSmtpUpdate, current: dict | None = None)
|
||||
}
|
||||
|
||||
|
||||
def validate_imap_values(payload: AdminImapUpdate, current: dict | None = None) -> dict:
|
||||
imap_host = payload.imap_host.strip()
|
||||
imap_username = payload.imap_username.strip()
|
||||
imap_mailbox = payload.imap_mailbox.strip() or 'INBOX'
|
||||
if not imap_host or not imap_username or not imap_mailbox:
|
||||
raise HTTPException(status_code=422, detail='IMAP host, username, and mailbox are required')
|
||||
if not 1 <= payload.imap_port <= 65535:
|
||||
raise HTTPException(status_code=422, detail='IMAP port must be between 1 and 65535')
|
||||
if payload.imap_poll_interval_seconds < 5:
|
||||
raise HTTPException(status_code=422, detail='IMAP poll interval must be at least 5 seconds')
|
||||
return {
|
||||
'imap_host': imap_host,
|
||||
'imap_port': payload.imap_port,
|
||||
'imap_username': imap_username,
|
||||
'imap_password': payload.imap_password or (current or {}).get('imap_password', ''),
|
||||
'imap_mailbox': imap_mailbox,
|
||||
'imap_use_ssl': payload.imap_use_ssl,
|
||||
'imap_poll_interval_seconds': payload.imap_poll_interval_seconds,
|
||||
}
|
||||
|
||||
|
||||
def public_user(row):
|
||||
return {
|
||||
'id': row['id'],
|
||||
@@ -166,11 +198,29 @@ def public_smtp_settings(values: dict) -> dict:
|
||||
}
|
||||
|
||||
|
||||
def public_imap_settings(values: dict) -> dict:
|
||||
return {
|
||||
'imap_host': values['imap_host'],
|
||||
'imap_port': values['imap_port'],
|
||||
'imap_username': values['imap_username'],
|
||||
'imap_mailbox': values['imap_mailbox'],
|
||||
'imap_use_ssl': values['imap_use_ssl'],
|
||||
'imap_poll_interval_seconds': values['imap_poll_interval_seconds'],
|
||||
'password_configured': bool(values['imap_password']),
|
||||
'configured': imap_configured(values),
|
||||
}
|
||||
|
||||
|
||||
@router.get('/smtp')
|
||||
def get_admin_smtp_settings(_: dict = Depends(require_admin)):
|
||||
return public_smtp_settings(get_smtp_settings())
|
||||
|
||||
|
||||
@router.get('/imap')
|
||||
def get_admin_imap_settings(_: dict = Depends(require_admin)):
|
||||
return public_imap_settings(get_imap_settings())
|
||||
|
||||
|
||||
@router.get('/themes')
|
||||
def get_admin_themes(_: dict = Depends(require_admin)):
|
||||
return {'themes': THEMES, 'enabled': get_enabled_themes()}
|
||||
@@ -195,6 +245,22 @@ def update_admin_smtp_settings(payload: AdminSmtpUpdate, current_user: dict = De
|
||||
return public_smtp_settings(values)
|
||||
|
||||
|
||||
@router.put('/imap')
|
||||
def update_admin_imap_settings(payload: AdminImapUpdate, current_user: dict = Depends(require_admin)):
|
||||
current = get_imap_settings()
|
||||
values = validate_imap_values(payload, current)
|
||||
save_imap_settings(values)
|
||||
record_audit_event(current_user['id'], 'imap_settings_updated', 'application', details={
|
||||
'host': values['imap_host'],
|
||||
'port': values['imap_port'],
|
||||
'username': values['imap_username'],
|
||||
'mailbox': values['imap_mailbox'],
|
||||
'ssl': values['imap_use_ssl'],
|
||||
'poll_interval_seconds': values['imap_poll_interval_seconds'],
|
||||
})
|
||||
return public_imap_settings(values)
|
||||
|
||||
|
||||
@router.post('/smtp/test')
|
||||
def validate_admin_smtp(payload: AdminSmtpUpdate, request: Request, current_user: dict = Depends(require_admin)):
|
||||
values = validate_smtp_values(payload, get_smtp_settings())
|
||||
|
||||
Reference in New Issue
Block a user