From 3951df9755df7b7a6a5ddb73686547861fca40cf Mon Sep 17 00:00:00 2001 From: Lukas Remis Date: Sat, 18 Jul 2026 15:27:09 +0200 Subject: [PATCH] Two-way draft sync, signatures, sent/bcc fixes, and mail-list UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend - Sent copies: persist locally on send + periodic multi-folder CONDSTORE poll (Sent/Archive/Trash/Junk) so they thread and show without an IDLE-only INBOX. - Bcc: transmitted copy omits Bcc, Sent copy keeps it; store/display bcc_addr. - Drafts: mirror local drafts to the IMAP Drafts folder (append/replace/expunge); inbound sync of foreign drafts (un-threaded) with adopt-to-edit + dedup by UID. - Per-user storage quota (5 GiB default) and manual "sync all folders" action. - Account editing (display/color/server/password) and per-account HTML signature. - Account view scoped to that account's inbox; new migrations 0006–0009. Frontend - Mail-list pagination, folder filters (All/Unread/Pinned), sort toggle, refresh. - Aligned + widened mail-list margins; reading-pane bars fixed height. - Rich-text composer: color palette, highlight, image; attachments; expand/pop-out. - Signatures: auto-insert for new mail, replace on From change, reply insert. - Restore/Delete actions per folder; drafts view merges local + remote, date-sorted. Co-Authored-By: Claude Opus 4.8 --- backend/app/accounts/schemas.py | 6 + backend/app/api/accounts.py | 82 ++++- backend/app/api/compose.py | 124 ++++++- backend/app/api/schemas.py | 2 + backend/app/api/settings.py | 17 +- backend/app/api/threads.py | 1 + backend/app/indexer/indexer.py | 6 +- backend/app/indexer/mime.py | 2 + backend/app/models.py | 14 + backend/app/outbox/attachments.py | 40 +++ backend/app/outbox/draft_sync.py | 120 +++++++ backend/app/outbox/jobs.py | 114 ++++--- backend/app/outbox/mime_build.py | 17 +- backend/app/outbox/schemas.py | 14 + backend/app/sync/engine.py | 72 ++++ backend/app/sync/supervisor.py | 20 +- .../migrations/versions/0006_user_quota.py | 30 ++ .../migrations/versions/0007_message_bcc.py | 29 ++ .../versions/0008_draft_imap_uid.py | 29 ++ .../versions/0009_account_signature.py | 28 ++ backend/tests/accounts/test_account_api.py | 108 ++++++ backend/tests/api/test_api.py | 8 + backend/tests/outbox/test_draft_sync.py | 188 +++++++++++ backend/tests/outbox/test_outbox.py | 96 +++++- backend/tests/sync/test_secondary_poll.py | 99 ++++++ backend/workers/worker.py | 6 +- frontend/src/components/compose/Composer.tsx | 61 +++- .../src/components/compose/RichTextEditor.tsx | 71 +++- frontend/src/components/list/DraftsList.tsx | 109 +++++-- frontend/src/components/list/MessageList.tsx | 11 +- frontend/src/components/thread/ThreadView.tsx | 5 +- frontend/src/i18n/en.ts | 14 + frontend/src/lib/api.ts | 21 ++ frontend/src/lib/types.ts | 19 ++ frontend/src/lib/ws.ts | 2 + frontend/src/routes/MailLayout.tsx | 162 ++++++++- frontend/src/routes/settings/Settings.tsx | 308 ++++++++++++++++-- frontend/src/test/ThreadView.test.tsx | 1 + screenshots/mail_list_alignement.png | Bin 0 -> 173390 bytes 39 files changed, 1917 insertions(+), 139 deletions(-) create mode 100644 backend/app/outbox/attachments.py create mode 100644 backend/app/outbox/draft_sync.py create mode 100644 backend/migrations/versions/0006_user_quota.py create mode 100644 backend/migrations/versions/0007_message_bcc.py create mode 100644 backend/migrations/versions/0008_draft_imap_uid.py create mode 100644 backend/migrations/versions/0009_account_signature.py create mode 100644 backend/tests/outbox/test_draft_sync.py create mode 100644 backend/tests/sync/test_secondary_poll.py create mode 100644 screenshots/mail_list_alignement.png diff --git a/backend/app/accounts/schemas.py b/backend/app/accounts/schemas.py index c4a9fc6..cd282f2 100644 --- a/backend/app/accounts/schemas.py +++ b/backend/app/accounts/schemas.py @@ -61,6 +61,11 @@ class CreateAccountRequest(BaseModel): class UpdateAccountRequest(BaseModel): display_name: str | None = None color: str | None = None + signature: str | None = None + # Connection/credential changes require the password (re-validated + re-encrypted). + imap: ServerConfigIn | None = None + smtp: ServerConfigIn | None = None + password: str | None = None class AccountDetailOut(BaseModel): @@ -70,5 +75,6 @@ class AccountDetailOut(BaseModel): color: str state: str state_detail: str + signature: str imap_config: dict[str, object] smtp_config: dict[str, object] diff --git a/backend/app/api/accounts.py b/backend/app/api/accounts.py index f8304f2..e9206f3 100644 --- a/backend/app/api/accounts.py +++ b/backend/app/api/accounts.py @@ -32,6 +32,7 @@ from app.identity.deps import CurrentUser, require_csrf from app.models import Account from app.queue import get_arq_pool from app.redis_client import get_redis +from app.security.crypto import encrypt_secret router = APIRouter(prefix="/accounts", tags=["accounts"]) @@ -75,12 +76,27 @@ async def list_accounts(user: CurrentUser, db: DbSession) -> list[AccountOut]: ) return [ AccountOut( - id=a.id, email=a.email, display_name=a.display_name, color=a.color, state=a.state + id=a.id, + email=a.email, + display_name=a.display_name, + color=a.color, + state=a.state, + signature=a.signature, ) for a in accounts ] +@router.post("/sync", dependencies=[Depends(require_csrf)]) +async def sync_all_accounts(user: CurrentUser, db: DbSession) -> dict[str, str]: + """Poll every folder of each of the user's accounts (manual Refresh).""" + account_ids = list(await db.scalars(select(Account.id).where(Account.user_id == user.id))) + pool = await get_arq_pool() + for account_id in account_ids: + await pool.enqueue_job("refresh_account_job", str(account_id)) + return {"status": "queued"} + + @router.post("/discover", response_model=DiscoverResponse, dependencies=[Depends(require_csrf)]) async def discover_account(body: DiscoverRequest, user: CurrentUser) -> DiscoverResponse: await _rate_limit_discover(user.id) @@ -135,6 +151,25 @@ async def create_new_account( return _detail(account) +@router.get("/{account_id}", response_model=AccountDetailOut) +async def get_account(account_id: uuid.UUID, user: CurrentUser, db: DbSession) -> AccountDetailOut: + account = await db.scalar( + select(Account).where(Account.id == account_id, Account.user_id == user.id) + ) + if account is None: + raise_api_error(404, "not_found", "account not found") + return _detail(account) + + +def _server_from_config(cfg: dict[str, object]) -> ServerConfig: + return ServerConfig( + str(cfg["host"]), + int(str(cfg["port"])), + str(cfg.get("tls", "ssl")), + str(cfg.get("auth", "password")), + ) + + @router.patch( "/{account_id}", response_model=AccountDetailOut, dependencies=[Depends(require_csrf)] ) @@ -150,7 +185,51 @@ async def update_account( account.display_name = body.display_name if body.color is not None: account.color = body.color + if body.signature is not None: + account.signature = body.signature + + # Connection settings and/or password: re-validate against the servers, then + # re-encrypt the secret and re-sync. The password must be supplied (§10.2: the + # stored secret is only decrypted in the worker, never here). + conn_change = body.imap is not None or body.smtp is not None or body.password is not None + if conn_change: + if not body.password: + raise_api_error( + 400, + "password_required", + "the mailbox password is required to change server settings", + ) + imap = ( + _to_server_config(body.imap) if body.imap else _server_from_config(account.imap_config) + ) + smtp = ( + _to_server_config(body.smtp) if body.smtp else _server_from_config(account.smtp_config) + ) + try: + await test_account(imap=imap, smtp=smtp, username=account.email, password=body.password) + except AccountTestError as exc: + raise_api_error(400, exc.code, exc.detail) + account.imap_config = { + "host": imap.host, + "port": imap.port, + "tls": imap.tls, + "auth": imap.auth, + } + account.smtp_config = { + "host": smtp.host, + "port": smtp.port, + "tls": smtp.tls, + "auth": smtp.auth, + } + account.secret_ct = encrypt_secret(body.password.encode("utf-8")) + account.state = "backfilling" + await db.commit() + + if conn_change: + pool = await get_arq_pool() + await pool.enqueue_job("sync_bootstrap_account", str(account.id)) + return _detail(account) @@ -171,6 +250,7 @@ def _detail(account: Account) -> AccountDetailOut: color=account.color, state=account.state, state_detail=account.state_detail, + signature=account.signature, imap_config=account.imap_config, smtp_config=account.smtp_config, ) diff --git a/backend/app/api/compose.py b/backend/app/api/compose.py index dbcbdef..7145129 100644 --- a/backend/app/api/compose.py +++ b/backend/app/api/compose.py @@ -16,8 +16,14 @@ from app.config import get_settings from app.db import get_session from app.identity.deps import CurrentUser, require_csrf from app.indexer import blobstore -from app.models import ComposeAttachment, Draft -from app.outbox.schemas import DraftIn, DraftOut, SendRequest, SendResponse +from app.models import BodyPart, ComposeAttachment, Draft, Mailbox, Message +from app.outbox.schemas import ( + DraftIn, + DraftOut, + RemoteDraftOut, + SendRequest, + SendResponse, +) from app.outbox.service import DraftError, cancel_outbox, create_outbox, upsert_draft from app.queue import get_arq_pool @@ -102,6 +108,104 @@ async def list_drafts(user: CurrentUser, db: DbSession) -> list[DraftOut]: return [_draft_out(d) for d in drafts] +def _fmt_addr(addr: dict[str, str]) -> str: + email = addr.get("email", "") + name = addr.get("name", "") + return f"{name} <{email}>" if name else email + + +async def _own_draft_uids(db: AsyncSession, user_id: uuid.UUID) -> set[tuple[uuid.UUID, int]]: + """(account_id, imap_uid) of drafts we mirrored — excluded from the remote list.""" + rows = await db.execute( + select(Draft.account_id, Draft.imap_uid).where( + Draft.user_id == user_id, Draft.imap_uid.isnot(None) + ) + ) + return {(r.account_id, r.imap_uid) for r in rows} + + +@router.get("/drafts/remote", response_model=list[RemoteDraftOut]) +async def list_remote_drafts(user: CurrentUser, db: DbSession) -> list[RemoteDraftOut]: + """Drafts sitting in the IMAP Drafts folder that we haven't already adopted.""" + own = await _own_draft_uids(db, user.id) + messages = await db.scalars( + select(Message) + .join(Mailbox, Mailbox.id == Message.mailbox_id) + .where(Message.user_id == user.id, Mailbox.special_use == "drafts") + .order_by(Message.internal_date.desc()) + ) + out: list[RemoteDraftOut] = [] + for m in messages: + if (m.account_id, m.uid) in own: + continue + out.append( + RemoteDraftOut( + message_id=m.id, + account_id=m.account_id, + imap_uid=m.uid, + subject=m.subject, + to=[_fmt_addr(a) for a in m.to_addr], + cc=[_fmt_addr(a) for a in m.cc_addr], + bcc=[_fmt_addr(a) for a in m.bcc_addr], + snippet=m.snippet, + updated_at=(m.date_hdr or m.internal_date).isoformat(), + ) + ) + return out + + +@router.post("/drafts/adopt/{message_id}", response_model=DraftOut) +async def adopt_remote_draft( + message_id: uuid.UUID, user: CurrentUser, db: DbSession +) -> DraftOut: + """Turn a Drafts-folder message into an editable local draft (linked by UID).""" + msg = await db.scalar( + select(Message) + .join(Mailbox, Mailbox.id == Message.mailbox_id) + .where( + Message.id == message_id, + Message.user_id == user.id, + Mailbox.special_use == "drafts", + ) + ) + if msg is None: + raise_api_error(404, "not_found", "draft message not found") + + # Idempotent: if already adopted (a local draft links this UID), return it. + existing = await db.scalar( + select(Draft).where( + Draft.user_id == user.id, + Draft.account_id == msg.account_id, + Draft.imap_uid == msg.uid, + ) + ) + if existing is not None: + return _draft_out(existing) + + parts = list(await db.scalars(select(BodyPart).where(BodyPart.message_id == msg.id))) + html = next((p.content for p in parts if p.kind == "html_sanitized"), "") + text = next((p.content for p in parts if p.kind == "text"), "") + payload = { + "to": [_fmt_addr(a) for a in msg.to_addr], + "cc": [_fmt_addr(a) for a in msg.cc_addr], + "bcc": [_fmt_addr(a) for a in msg.bcc_addr], + "subject": msg.subject, + "html": html, + "text": text, + "attachment_ids": [], + } + draft = Draft( + user_id=user.id, + account_id=msg.account_id, + kind="new", + payload=payload, + imap_uid=msg.uid, + ) + db.add(draft) + await db.commit() + return _draft_out(draft) + + @router.post("/drafts", response_model=DraftOut) async def create_draft(body: DraftIn, user: CurrentUser, db: DbSession) -> DraftOut: try: @@ -125,13 +229,29 @@ async def update_draft( return _draft_out(draft) +@router.post("/drafts/{draft_id}/publish") +async def publish_draft(draft_id: uuid.UUID, user: CurrentUser, db: DbSession) -> dict[str, str]: + """Mirror the draft to the account's IMAP Drafts folder (continue on any client).""" + draft = await db.scalar(select(Draft).where(Draft.id == draft_id, Draft.user_id == user.id)) + if draft is None: + raise_api_error(404, "not_found", "draft not found") + pool = await get_arq_pool() + await pool.enqueue_job("push_draft_to_imap_job", str(draft_id)) + return {"status": "queued"} + + @router.delete("/drafts/{draft_id}") async def delete_draft(draft_id: uuid.UUID, user: CurrentUser, db: DbSession) -> dict[str, str]: draft = await db.scalar(select(Draft).where(Draft.id == draft_id, Draft.user_id == user.id)) if draft is None: raise_api_error(404, "not_found", "draft not found") + account_id, imap_uid = draft.account_id, draft.imap_uid await db.delete(draft) await db.commit() + # Remove the mirrored copy from the server Drafts folder too. + if imap_uid: + pool = await get_arq_pool() + await pool.enqueue_job("remove_imap_draft_job", str(account_id), imap_uid) return {"status": "deleted"} diff --git a/backend/app/api/schemas.py b/backend/app/api/schemas.py index 1e90cd7..43b6fe7 100644 --- a/backend/app/api/schemas.py +++ b/backend/app/api/schemas.py @@ -47,6 +47,7 @@ class MessageEnvelope(BaseModel): from_addr: list[Address] to_addr: list[Address] cc_addr: list[Address] + bcc_addr: list[Address] date: dt.datetime flags: list[str] is_unread: bool @@ -79,6 +80,7 @@ class AccountOut(BaseModel): display_name: str color: str state: str + signature: str = "" class SearchThreadHit(BaseModel): diff --git a/backend/app/api/settings.py b/backend/app/api/settings.py index 62383e9..49f618f 100644 --- a/backend/app/api/settings.py +++ b/backend/app/api/settings.py @@ -6,11 +6,12 @@ from typing import Annotated from fastapi import APIRouter, Depends from pydantic import BaseModel +from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.db import get_session from app.identity.deps import CurrentUser, require_csrf -from app.models import User +from app.models import Message, User router = APIRouter(prefix="/settings", tags=["settings"]) @@ -30,6 +31,11 @@ class SettingsPatch(BaseModel): tz: str | None = None +class QuotaOut(BaseModel): + used_bytes: int + quota_bytes: int + + def allowed_image_senders(user: User) -> set[str]: value = user.settings.get("allowed_image_senders", []) if isinstance(value, list): @@ -59,6 +65,15 @@ async def get_settings_endpoint(user: CurrentUser) -> SettingsOut: return _settings_out(user) +@router.get("/quota", response_model=QuotaOut) +async def get_quota(user: CurrentUser, db: DbSession) -> QuotaOut: + """Storage quota and current usage (sum of stored message sizes).""" + used = await db.scalar( + select(func.coalesce(func.sum(Message.size_bytes), 0)).where(Message.user_id == user.id) + ) + return QuotaOut(used_bytes=int(used or 0), quota_bytes=user.quota_bytes) + + @router.patch("", response_model=SettingsOut, dependencies=[Depends(require_csrf)]) async def patch_settings(body: SettingsPatch, user: CurrentUser, db: DbSession) -> SettingsOut: updates = dict(user.settings) diff --git a/backend/app/api/threads.py b/backend/app/api/threads.py index b4c1c6b..684d929 100644 --- a/backend/app/api/threads.py +++ b/backend/app/api/threads.py @@ -56,6 +56,7 @@ def _envelope(msg: Message) -> MessageEnvelope: from_addr=_addresses(msg.from_addr), to_addr=_addresses(msg.to_addr), cc_addr=_addresses(msg.cc_addr), + bcc_addr=_addresses(msg.bcc_addr), date=msg.date_hdr or msg.internal_date, flags=list(msg.flags), is_unread="\\Seen" not in msg.flags, diff --git a/backend/app/indexer/indexer.py b/backend/app/indexer/indexer.py index d66e0aa..9698588 100644 --- a/backend/app/indexer/indexer.py +++ b/backend/app/indexer/indexer.py @@ -150,6 +150,7 @@ async def persist_message( from_addr=parsed.from_addr, to_addr=parsed.to_addr, cc_addr=parsed.cc_addr, + bcc_addr=parsed.bcc_addr, date_hdr=parsed.date, internal_date=remote.internal_date or datetime.now(UTC), flags=sorted(remote.flags), @@ -192,7 +193,10 @@ async def persist_message( ) message.has_remote_images = has_remote_images - await thread_message(session, message) + # Drafts are not conversation messages: keep them out of threads so they don't + # pollute the reading pane or thread list. They surface only via the drafts UI. + if mailbox_special_use != "drafts": + await thread_message(session, message) if mailbox_special_use not in _NO_RECIPIENT_HARVEST: await _harvest_recipient(session, message, parsed) diff --git a/backend/app/indexer/mime.py b/backend/app/indexer/mime.py index f7030a6..63e0178 100644 --- a/backend/app/indexer/mime.py +++ b/backend/app/indexer/mime.py @@ -37,6 +37,7 @@ class ParsedEmail: from_addr: list[dict[str, str]] to_addr: list[dict[str, str]] cc_addr: list[dict[str, str]] + bcc_addr: list[dict[str, str]] date: datetime | None text_body: str html_body: str | None @@ -140,6 +141,7 @@ def parse_message(raw: bytes) -> ParsedEmail: from_addr=_addresses(msg, "From"), to_addr=_addresses(msg, "To"), cc_addr=_addresses(msg, "Cc"), + bcc_addr=_addresses(msg, "Bcc"), date=date, text_body=text_body or "", html_body=html_body, diff --git a/backend/app/models.py b/backend/app/models.py index 2081091..ad021be 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -10,6 +10,7 @@ import datetime as dt import uuid from sqlalchemy import ( + BigInteger, ForeignKey, Index, Integer, @@ -54,6 +55,11 @@ class User(Base): settings: Mapped[dict[str, object]] = mapped_column( JSONB, nullable=False, server_default=text("'{}'") ) + # Storage quota in bytes; per-user so an admin can override it later. + # Default 5 GiB (5 * 1024^3). + quota_bytes: Mapped[int] = mapped_column( + BigInteger, nullable=False, server_default=text("5368709120") + ) created_at: Mapped[dt.datetime] = _now() @@ -68,6 +74,8 @@ class Account(Base): email: Mapped[str] = mapped_column(CITEXT, nullable=False) display_name: Mapped[str] = mapped_column(Text, nullable=False, server_default=text("''")) color: Mapped[str] = mapped_column(Text, nullable=False, server_default=text("'#888888'")) + # Per-account HTML signature, inserted into new messages (and via compose menu). + signature: Mapped[str] = mapped_column(Text, nullable=False, server_default=text("''")) imap_config: Mapped[dict[str, object]] = mapped_column(JSONB, nullable=False) smtp_config: Mapped[dict[str, object]] = mapped_column(JSONB, nullable=False) secret_ct: Mapped[bytes] = mapped_column(BYTEA, nullable=False) @@ -158,6 +166,9 @@ class Message(Base): cc_addr: Mapped[list[dict[str, str]]] = mapped_column( JSONB, nullable=False, server_default=text("'[]'") ) + bcc_addr: Mapped[list[dict[str, str]]] = mapped_column( + JSONB, nullable=False, server_default=text("'[]'") + ) date_hdr: Mapped[dt.datetime | None] = mapped_column(TIMESTAMP(timezone=True)) internal_date: Mapped[dt.datetime] = mapped_column(TIMESTAMP(timezone=True), nullable=False) flags: Mapped[list[str]] = mapped_column( @@ -233,6 +244,9 @@ class Draft(Base): ) kind: Mapped[str] = mapped_column(Text, nullable=False, server_default=text("'reply'")) payload: Mapped[dict[str, object]] = mapped_column(JSONB, nullable=False) + # UID of the mirrored copy in the account's IMAP Drafts folder (so the draft + # is visible/continuable on other mail clients). Replaced on each edit. + imap_uid: Mapped[int | None] = mapped_column(Integer) updated_at: Mapped[dt.datetime] = _now() diff --git a/backend/app/outbox/attachments.py b/backend/app/outbox/attachments.py new file mode 100644 index 0000000..3ae1f09 --- /dev/null +++ b/backend/app/outbox/attachments.py @@ -0,0 +1,40 @@ +"""Resolve a draft's compose-attachment ids into raw (filename, mime, data) tuples.""" + +from __future__ import annotations + +import uuid + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.indexer import blobstore +from app.models import ComposeAttachment, Draft + + +async def load_attachments( + session: AsyncSession, user_id: uuid.UUID, draft: Draft +) -> list[tuple[str, str, bytes]]: + """Return each of the draft's compose attachments as ``(filename, mime, data)``.""" + raw_ids = draft.payload.get("attachment_ids") or [] + if not isinstance(raw_ids, list) or not raw_ids: + return [] + ids: list[uuid.UUID] = [] + for value in raw_ids: + try: + ids.append(uuid.UUID(str(value))) + except ValueError: + continue + if not ids: + return [] + rows = await session.scalars( + select(ComposeAttachment).where( + ComposeAttachment.id.in_(ids), ComposeAttachment.user_id == user_id + ) + ) + by_id = {r.id: r for r in rows} + out: list[tuple[str, str, bytes]] = [] + for i in ids: + att = by_id.get(i) + if att is not None: + out.append((att.filename, att.mime_type, blobstore.load(user_id, att.blob_sha256))) + return out diff --git a/backend/app/outbox/draft_sync.py b/backend/app/outbox/draft_sync.py new file mode 100644 index 0000000..7e7763a --- /dev/null +++ b/backend/app/outbox/draft_sync.py @@ -0,0 +1,120 @@ +"""Mirror local drafts to the account's IMAP Drafts folder (SPEC §6.5 extension). + +Drafts are stored server-side as ``\\Draft`` messages so they can be continued on +any standard mail client. IMAP messages are immutable, so each edit APPENDs a new +copy and expunges the previous one (tracked by ``drafts.imap_uid``). Runs in the +worker (credential decryption is worker-only, §10.2). +""" + +from __future__ import annotations + +import contextlib +import logging +import uuid +from typing import Any + +from sqlalchemy import select + +from app.db import session_scope +from app.models import Account, Draft, Mailbox, Message +from app.outbox.attachments import load_attachments +from app.outbox.mime_build import build_mime +from app.sync.provider_factory import build_provider + +logger = logging.getLogger(__name__) + +_DRAFT_FLAGS = frozenset({"\\Draft", "\\Seen"}) + + +async def _ensure_drafts_folder(provider: Any, account: Account, user_id: uuid.UUID) -> str: + """Return the account's Drafts folder path, creating one if it is missing.""" + path = "Drafts" + await provider.create_mailbox(path) + remote = await provider.list_mailboxes() + uidvalidity = next((r.uidvalidity for r in remote if r.path == path), 0) + async with session_scope() as session: + existing = await session.scalar( + select(Mailbox).where( + Mailbox.account_id == account.id, Mailbox.special_use == "drafts" + ) + ) + if existing is not None: + return existing.path + session.add( + Mailbox( + account_id=account.id, + user_id=user_id, + path=path, + special_use="drafts", + uidvalidity=uidvalidity, + ) + ) + return path + + +async def push_draft_to_imap_job(ctx: dict[str, Any], draft_id: str) -> None: + """APPEND the draft to the Drafts folder and expunge the previous copy.""" + did = uuid.UUID(draft_id) + async with session_scope() as session: + draft = await session.get(Draft, did) + if draft is None: + return + account = await session.get(Account, draft.account_id) + if account is None: + return + user_id = draft.user_id + old_uid = draft.imap_uid + reply_to = ( + await session.get(Message, draft.reply_to_message_id) + if draft.reply_to_message_id + else None + ) + attachments = await load_attachments(session, user_id, draft) + _, sent_raw, _, _ = build_mime(account, draft, reply_to, attachments) + drafts_mb = await session.scalar( + select(Mailbox).where( + Mailbox.account_id == account.id, Mailbox.special_use == "drafts" + ) + ) + drafts_path = drafts_mb.path if drafts_mb else None + account_obj = account + + provider = build_provider(account_obj) + new_uid = 0 + try: + if drafts_path is None: + drafts_path = await _ensure_drafts_folder(provider, account_obj, user_id) + new_uid = await provider.append(drafts_path, sent_raw, _DRAFT_FLAGS) + if old_uid: + with contextlib.suppress(Exception): + await provider.delete_messages(drafts_path, [old_uid]) + finally: + await provider.close() + + if new_uid: + async with session_scope() as session: + draft = await session.get(Draft, did) + if draft is not None: + draft.imap_uid = new_uid + + +async def remove_imap_draft_job(ctx: dict[str, Any], account_id: str, uid: int) -> None: + """Expunge a draft copy from the account's Drafts folder (on discard).""" + aid = uuid.UUID(account_id) + async with session_scope() as session: + account = await session.get(Account, aid) + if account is None: + return + drafts_mb = await session.scalar( + select(Mailbox).where(Mailbox.account_id == aid, Mailbox.special_use == "drafts") + ) + drafts_path = drafts_mb.path if drafts_mb else None + account_obj = account + if drafts_path is None: + return + provider = build_provider(account_obj) + try: + with contextlib.suppress(Exception): + await provider.delete_messages(drafts_path, [int(uid)]) + finally: + await provider.close() diff --git a/backend/app/outbox/jobs.py b/backend/app/outbox/jobs.py index e9504d0..48cd58c 100644 --- a/backend/app/outbox/jobs.py +++ b/backend/app/outbox/jobs.py @@ -8,6 +8,7 @@ to Sent (skipped for Gmail, which self-appends), harvest recipients into from __future__ import annotations +import contextlib import logging import uuid from datetime import UTC, datetime @@ -19,17 +20,12 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.db import session_scope from app.events import get_event_bus -from app.indexer import blobstore -from app.models import ( - Account, - ComposeAttachment, - Draft, - KnownRecipient, - Mailbox, - Message, - Outbox, -) +from app.indexer.indexer import persist_message +from app.models import Account, Draft, KnownRecipient, Mailbox, Message, Outbox +from app.outbox.attachments import load_attachments from app.outbox.mime_build import build_mime +from app.providers.base import RemoteMessage +from app.search.factory import get_search_backend from app.sync.provider_factory import build_provider logger = logging.getLogger(__name__) @@ -56,33 +52,56 @@ async def _harvest_recipients(session: AsyncSession, user_id: uuid.UUID, emails: await session.execute(stmt) -async def _load_attachments( - session: AsyncSession, user_id: uuid.UUID, draft: Draft -) -> list[tuple[str, str, bytes]]: - """Resolve a draft's compose-attachment ids into (filename, mime, data) tuples.""" - raw_ids = draft.payload.get("attachment_ids") or [] - if not isinstance(raw_ids, list) or not raw_ids: - return [] - ids: list[uuid.UUID] = [] - for value in raw_ids: - try: - ids.append(uuid.UUID(str(value))) - except ValueError: - continue - if not ids: - return [] - rows = await session.scalars( - select(ComposeAttachment).where( - ComposeAttachment.id.in_(ids), ComposeAttachment.user_id == user_id +async def _persist_sent_copy( + user_id: uuid.UUID, account: Account, raw: bytes, uid: int +) -> None: + """Store the just-sent message in the DB (Sent mailbox) and notify the UI. + + No-op without a UIDPLUS append UID (uid <= 0); in that case a future Sent sync + would pick it up. persist_message dedupes on (mailbox_id, uid). + """ + if uid <= 0: + return + async with session_scope() as session: + sent_mb = await session.scalar( + select(Mailbox).where( + Mailbox.account_id == account.id, Mailbox.special_use == "sent" + ) ) + if sent_mb is None: + return + remote = RemoteMessage( + uid=uid, raw=raw, flags=frozenset({"\\Seen"}), internal_date=datetime.now(UTC) + ) + result = await persist_message( + session, + user_id=user_id, + account_id=account.id, + mailbox_id=sent_mb.id, + mailbox_special_use="sent", + remote=remote, + ) + if result is None: + return + message_id = result.message.id + thread_id = result.message.thread_id + search_doc = result.search_doc + + await get_search_backend().index(search_doc) + bus = get_event_bus() + await bus.publish( + "message.new", + { + "user_id": str(user_id), + "account_id": str(account.id), + "message_id": str(message_id), + "thread_id": str(thread_id) if thread_id else None, + }, ) - by_id = {r.id: r for r in rows} - out: list[tuple[str, str, bytes]] = [] - for i in ids: - att = by_id.get(i) - if att is not None: - out.append((att.filename, att.mime_type, blobstore.load(user_id, att.blob_sha256))) - return out + if thread_id is not None: + await bus.publish( + "thread.updated", {"user_id": str(user_id), "thread_id": str(thread_id)} + ) async def send_job(ctx: dict[str, Any], outbox_id: str) -> None: @@ -109,21 +128,34 @@ async def send_job(ctx: dict[str, Any], outbox_id: str) -> None: outbox.error = "account missing" return user_id = outbox.user_id - attachments = await _load_attachments(session, user_id, draft) - raw, envelope_from, envelope_to = build_mime(account, draft, reply_to, attachments) + attachments = await load_attachments(session, user_id, draft) + transmit_raw, sent_raw, envelope_from, envelope_to = build_mime( + account, draft, reply_to, attachments + ) sent_path = await session.scalar( select(Mailbox.path).where( Mailbox.account_id == account.id, Mailbox.special_use == "sent" ) ) + drafts_path = await session.scalar( + select(Mailbox.path).where( + Mailbox.account_id == account.id, Mailbox.special_use == "drafts" + ) + ) + draft_imap_uid = draft.imap_uid gmail = _is_gmail(account) account_obj = account provider = build_provider(account_obj) + appended_uid = 0 try: - await provider.send(raw, envelope_from, envelope_to) + await provider.send(transmit_raw, envelope_from, envelope_to) if sent_path and not gmail: - await provider.append(sent_path, raw, frozenset({"\\Seen"})) + appended_uid = await provider.append(sent_path, sent_raw, frozenset({"\\Seen"})) + # Remove the mirrored Drafts-folder copy now that it has been sent. + if drafts_path and draft_imap_uid: + with contextlib.suppress(Exception): + await provider.delete_messages(drafts_path, [draft_imap_uid]) except Exception as exc: # noqa: BLE001 - record and notify, keep the draft async with session_scope() as session: ob = await session.get(Outbox, oid) @@ -139,6 +171,10 @@ async def send_job(ctx: dict[str, Any], outbox_id: str) -> None: finally: await provider.close() + # Persist the sent copy (with Bcc) ourselves so it shows in Sent and threads + # immediately; the periodic Sent poll would also catch it (dedup by UID). + await _persist_sent_copy(user_id, account_obj, sent_raw, appended_uid) + async with session_scope() as session: ob = await session.get(Outbox, oid) if ob is not None: diff --git a/backend/app/outbox/mime_build.py b/backend/app/outbox/mime_build.py index 942cde9..1684c64 100644 --- a/backend/app/outbox/mime_build.py +++ b/backend/app/outbox/mime_build.py @@ -49,8 +49,13 @@ def build_mime( draft: Draft, reply_to: Message | None, attachments: list[tuple[str, str, bytes]] | None = None, -) -> tuple[bytes, str, list[str]]: - """Return ``(raw_rfc822, envelope_from, envelope_to)`` for ``draft``. +) -> tuple[bytes, bytes, str, list[str]]: + """Return ``(transmit_raw, sent_raw, envelope_from, envelope_to)`` for ``draft``. + + ``transmit_raw`` is sent to the SMTP recipients and carries NO ``Bcc`` header. + ``sent_raw`` is the copy filed in Sent; it additionally includes a ``Bcc`` + header so the sender keeps a record of blind recipients (standard client + behavior). They are identical when there is no Bcc. ``attachments`` is a list of ``(filename, mime_type, data)`` uploaded via the compose Attach action; each is added as a file attachment part. @@ -99,4 +104,10 @@ def build_mime( ) envelope_to = [_email_only(a) for a in (to + cc + bcc)] - return msg.as_bytes(), account.email, envelope_to + transmit_raw = msg.as_bytes() # no Bcc header -> safe to transmit + if bcc: + msg["Bcc"] = ", ".join(bcc) + sent_raw = msg.as_bytes() + else: + sent_raw = transmit_raw + return transmit_raw, sent_raw, account.email, envelope_to diff --git a/backend/app/outbox/schemas.py b/backend/app/outbox/schemas.py index 144f8a3..0ed58a9 100644 --- a/backend/app/outbox/schemas.py +++ b/backend/app/outbox/schemas.py @@ -35,6 +35,20 @@ class DraftOut(BaseModel): updated_at: str +class RemoteDraftOut(BaseModel): + """A draft found in the account's IMAP Drafts folder (created on another client).""" + + message_id: uuid.UUID + account_id: uuid.UUID + imap_uid: int + subject: str + to: list[str] + cc: list[str] + bcc: list[str] + snippet: str + updated_at: str + + class SendRequest(BaseModel): draft_id: uuid.UUID diff --git a/backend/app/sync/engine.py b/backend/app/sync/engine.py index e81578b..09a1fbc 100644 --- a/backend/app/sync/engine.py +++ b/backend/app/sync/engine.py @@ -3,8 +3,10 @@ from __future__ import annotations import asyncio +import contextlib import logging import uuid +from typing import Any from sqlalchemy import delete, select, update from sqlalchemy.ext.asyncio import AsyncSession @@ -274,3 +276,73 @@ async def live_loop( await apply_delta(provider, account_obj, mailbox_obj, delta) finally: await provider.close() + + +async def poll_folders_once(account_id: uuid.UUID, *, include_inbox: bool) -> None: + """One CONDSTORE poll pass over an account's special-use folders. + + ``include_inbox`` also polls INBOX (used by the manual Refresh); the periodic + secondary loop leaves INBOX to its dedicated IDLE loop. Custom (non special-use) + folders are not polled. Drafts are polled so drafts made in other clients appear + (persisted un-threaded). + """ + from app.db import session_scope + + async with session_scope() as session: + account = await _load_account(session, account_id) + account_obj = account + stmt = select(Mailbox.id).where( + Mailbox.account_id == account_id, Mailbox.special_use.isnot(None) + ) + if not include_inbox: + stmt = stmt.where(Mailbox.special_use != "inbox") + mailbox_ids = list(await session.scalars(stmt)) + if not mailbox_ids: + return + + provider = build_provider(account_obj) + try: + for mailbox_id in mailbox_ids: + async with session_scope() as session: + mailbox = await session.get(Mailbox, mailbox_id) + mailbox_obj = mailbox + if mailbox_obj is None: + continue + try: + delta = await provider.poll( + mailbox_obj.path, + last_seen_uid=mailbox_obj.last_seen_uid, + highestmodseq=mailbox_obj.highestmodseq, + ) + await apply_delta(provider, account_obj, mailbox_obj, delta) + except Exception: + logger.exception("poll failed: account=%s mailbox=%s", account_id, mailbox_obj.path) + finally: + await provider.close() + + +async def _poll_secondary_once(account_id: uuid.UUID) -> None: + await poll_folders_once(account_id, include_inbox=False) + + +async def refresh_account_job(ctx: dict[str, Any], account_id: str) -> None: + """Poll every special-use folder (incl. INBOX) once — the manual Refresh action.""" + await poll_folders_once(uuid.UUID(account_id), include_inbox=True) + + +async def secondary_poll_loop(account_id: uuid.UUID, stop: asyncio.Event | None = None) -> None: + """Periodically CONDSTORE-poll non-INBOX folders (Sent/Drafts/Archive/Trash/Junk). + + INBOX has its own IDLE loop (real-time). This keeps the other folders in step + with server-side changes (e.g. Gmail-filed sent mail) and changes made by other + clients. CONDSTORE/QRESYNC makes each pass a cheap MODSEQ delta. + """ + stop = stop or asyncio.Event() + interval = get_settings().poll_interval + while not stop.is_set(): + # Wait first: the initial state was already covered by the backfill. + with contextlib.suppress(TimeoutError): + await asyncio.wait_for(stop.wait(), timeout=interval) + if stop.is_set(): + break + await _poll_secondary_once(account_id) diff --git a/backend/app/sync/supervisor.py b/backend/app/sync/supervisor.py index b4ba0ec..93bbeec 100644 --- a/backend/app/sync/supervisor.py +++ b/backend/app/sync/supervisor.py @@ -20,7 +20,7 @@ from sqlalchemy import select from app.db import session_scope from app.models import Account -from app.sync.engine import live_loop +from app.sync.engine import live_loop, secondary_poll_loop logger = logging.getLogger(__name__) @@ -39,13 +39,29 @@ async def _run_account(account_id: uuid.UUID, stop: asyncio.Event) -> None: await asyncio.wait_for(stop.wait(), timeout=_RECONNECT_BACKOFF) +async def _run_secondary(account_id: uuid.UUID, stop: asyncio.Event) -> None: + while not stop.is_set(): + try: + await secondary_poll_loop(account_id, stop) + except asyncio.CancelledError: + raise + except Exception: + logger.exception("secondary poll loop for %s crashed; retrying", account_id) + with contextlib.suppress(TimeoutError): + await asyncio.wait_for(stop.wait(), timeout=_RECONNECT_BACKOFF) + + async def start_supervisor(ctx: dict[str, Any]) -> None: """Launch a live loop per live account (called from the worker on_startup).""" async with session_scope() as session: account_ids = list(await session.scalars(select(Account.id).where(Account.state == "live"))) stop = asyncio.Event() ctx["supervisor_stop"] = stop - ctx["supervisor_tasks"] = [asyncio.create_task(_run_account(aid, stop)) for aid in account_ids] + tasks: list[asyncio.Task[None]] = [] + for aid in account_ids: + tasks.append(asyncio.create_task(_run_account(aid, stop))) # INBOX IDLE + tasks.append(asyncio.create_task(_run_secondary(aid, stop))) # other folders poll + ctx["supervisor_tasks"] = tasks logger.info("live supervisor started for %d account(s)", len(account_ids)) diff --git a/backend/migrations/versions/0006_user_quota.py b/backend/migrations/versions/0006_user_quota.py new file mode 100644 index 0000000..ec75e72 --- /dev/null +++ b/backend/migrations/versions/0006_user_quota.py @@ -0,0 +1,30 @@ +"""add users.quota_bytes + +Per-user storage quota (bytes) so an administrator can define/override it later. +Defaults to 5 GiB for existing and new users. + +Revision ID: 0006 +Revises: 0005 +Create Date: 2026-07-18 +""" + +from __future__ import annotations + +from collections.abc import Sequence + +from alembic import op + +revision: str = "0006" +down_revision: str | None = "0005" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute( + "ALTER TABLE users ADD COLUMN quota_bytes bigint NOT NULL DEFAULT 5368709120" + ) + + +def downgrade() -> None: + op.execute("ALTER TABLE users DROP COLUMN IF EXISTS quota_bytes") diff --git a/backend/migrations/versions/0007_message_bcc.py b/backend/migrations/versions/0007_message_bcc.py new file mode 100644 index 0000000..901d472 --- /dev/null +++ b/backend/migrations/versions/0007_message_bcc.py @@ -0,0 +1,29 @@ +"""add messages.bcc_addr + +The Sent copy of an outgoing message includes a Bcc header (standard client +behavior) so the sender keeps a record of blind recipients; store it structured +alongside to/cc for display. + +Revision ID: 0007 +Revises: 0006 +Create Date: 2026-07-18 +""" + +from __future__ import annotations + +from collections.abc import Sequence + +from alembic import op + +revision: str = "0007" +down_revision: str | None = "0006" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute("ALTER TABLE messages ADD COLUMN bcc_addr jsonb NOT NULL DEFAULT '[]'") + + +def downgrade() -> None: + op.execute("ALTER TABLE messages DROP COLUMN IF EXISTS bcc_addr") diff --git a/backend/migrations/versions/0008_draft_imap_uid.py b/backend/migrations/versions/0008_draft_imap_uid.py new file mode 100644 index 0000000..5169af5 --- /dev/null +++ b/backend/migrations/versions/0008_draft_imap_uid.py @@ -0,0 +1,29 @@ +"""add drafts.imap_uid + +Drafts are mirrored to the account's IMAP Drafts folder (as \\Draft messages) so +they can be continued on any standard mail client. This stores the UID of the +current server copy so it can be replaced/removed. + +Revision ID: 0008 +Revises: 0007 +Create Date: 2026-07-18 +""" + +from __future__ import annotations + +from collections.abc import Sequence + +from alembic import op + +revision: str = "0008" +down_revision: str | None = "0007" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute("ALTER TABLE drafts ADD COLUMN imap_uid integer") + + +def downgrade() -> None: + op.execute("ALTER TABLE drafts DROP COLUMN IF EXISTS imap_uid") diff --git a/backend/migrations/versions/0009_account_signature.py b/backend/migrations/versions/0009_account_signature.py new file mode 100644 index 0000000..b1e3733 --- /dev/null +++ b/backend/migrations/versions/0009_account_signature.py @@ -0,0 +1,28 @@ +"""add accounts.signature + +Per-account HTML signature, configured in Settings → Accounts and inserted into +outgoing messages by the composer. + +Revision ID: 0009 +Revises: 0008 +Create Date: 2026-07-18 +""" + +from __future__ import annotations + +from collections.abc import Sequence + +from alembic import op + +revision: str = "0009" +down_revision: str | None = "0008" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + op.execute("ALTER TABLE accounts ADD COLUMN signature text NOT NULL DEFAULT ''") + + +def downgrade() -> None: + op.execute("ALTER TABLE accounts DROP COLUMN IF EXISTS signature") diff --git a/backend/tests/accounts/test_account_api.py b/backend/tests/accounts/test_account_api.py index aa3963b..94e32b9 100644 --- a/backend/tests/accounts/test_account_api.py +++ b/backend/tests/accounts/test_account_api.py @@ -146,6 +146,114 @@ async def test_create_account_enqueues_sync(ctx: Ctx, monkeypatch) -> None: # t assert enqueued == [("sync_bootstrap_account", body["id"])] +async def _make_account(ctx: Ctx, monkeypatch) -> str: # type: ignore[no-untyped-def] + async def fake_test(**_kw: object) -> None: + return None + + class FakePool: + async def enqueue_job(self, name: str, arg: str) -> None: + return None + + async def fake_pool() -> FakePool: + return FakePool() + + monkeypatch.setattr(accounts_api, "test_account", fake_test) + monkeypatch.setattr(accounts_api, "get_arq_pool", fake_pool) + resp = await ctx.client.post( + "/api/accounts", + json={**GOOD_CFG, "email": "me@example.com", "display_name": "Me", "password": "secret"}, + headers=_hdr(), + ) + assert resp.status_code == 200, resp.text + return str(resp.json()["id"]) + + +async def test_sync_all_enqueues_refresh_per_account(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + aid = await _make_account(ctx, monkeypatch) + + enqueued: list[tuple[str, str]] = [] + + class FakePool: + async def enqueue_job(self, name: str, arg: str) -> None: + enqueued.append((name, arg)) + + async def fake_pool() -> FakePool: + return FakePool() + + monkeypatch.setattr(accounts_api, "get_arq_pool", fake_pool) + resp = await ctx.client.post("/api/accounts/sync", headers=_hdr()) + assert resp.status_code == 200 + assert enqueued == [("refresh_account_job", aid)] + + +async def test_update_display_and_color_no_resync(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + aid = await _make_account(ctx, monkeypatch) + resp = await ctx.client.patch( + f"/api/accounts/{aid}", + json={"display_name": "New Name", "color": "#00ff00"}, + headers=_hdr(), + ) + assert resp.status_code == 200, resp.text + body = resp.json() + assert body["display_name"] == "New Name" and body["color"] == "#00ff00" + + +async def test_update_signature(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + aid = await _make_account(ctx, monkeypatch) + resp = await ctx.client.patch( + f"/api/accounts/{aid}", json={"signature": "

Best,
Me

"}, headers=_hdr() + ) + assert resp.status_code == 200 + assert resp.json()["signature"] == "

Best,
Me

" + # The accounts list also carries the signature (used by the composer). + listing = await ctx.client.get("/api/accounts") + acct = next(a for a in listing.json() if a["id"] == aid) + assert acct["signature"] == "

Best,
Me

" + + +async def test_update_password_reencrypts_and_resyncs(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + aid = await _make_account(ctx, monkeypatch) + acct = await ctx.session.scalar(select(Account).where(Account.id == uuid.UUID(aid))) + assert acct is not None + await ctx.session.refresh(acct) + old_secret = bytes(acct.secret_ct) + + enqueued: list[tuple[str, str]] = [] + + class FakePool: + async def enqueue_job(self, name: str, arg: str) -> None: + enqueued.append((name, arg)) + + async def fake_pool() -> FakePool: + return FakePool() + + async def fake_test(**_kw: object) -> None: + return None + + monkeypatch.setattr(accounts_api, "test_account", fake_test) + monkeypatch.setattr(accounts_api, "get_arq_pool", fake_pool) + + resp = await ctx.client.patch( + f"/api/accounts/{aid}", json={"password": "newsecret"}, headers=_hdr() + ) + assert resp.status_code == 200, resp.text + assert resp.json()["state"] == "backfilling" + await ctx.session.refresh(acct) + assert bytes(acct.secret_ct) != old_secret # re-encrypted + assert enqueued == [("sync_bootstrap_account", aid)] + + +async def test_update_server_change_requires_password(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + aid = await _make_account(ctx, monkeypatch) + resp = await ctx.client.patch( + f"/api/accounts/{aid}", + json={"imap": {"host": "imap2.example.com", "port": 993, "tls": "ssl"}}, + headers=_hdr(), + ) + assert resp.status_code == 400 + assert resp.json()["error"]["code"] == "password_required" + + async def test_delete_account(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] async def fake_test(**_kw: object) -> None: return None diff --git a/backend/tests/api/test_api.py b/backend/tests/api/test_api.py index b6b3a4e..3092eeb 100644 --- a/backend/tests/api/test_api.py +++ b/backend/tests/api/test_api.py @@ -234,6 +234,14 @@ async def test_attachments_list_and_zip(api: ApiCtx) -> None: assert archive.read("notes.txt") == b"hello attachment" +async def test_quota_reports_usage_and_default(api: ApiCtx) -> None: + resp = await api.client.get("/api/settings/quota") + assert resp.status_code == 200 + body = resp.json() + assert body["quota_bytes"] == 5 * 1024**3 # default 5 GiB + assert body["used_bytes"] > 0 # seeded messages have a size + + async def test_thread_detail_messages_ascending(api: ApiCtx) -> None: # find the kickoff thread (2 messages) resp = await api.client.get("/api/threads") diff --git a/backend/tests/outbox/test_draft_sync.py b/backend/tests/outbox/test_draft_sync.py new file mode 100644 index 0000000..9fd38bf --- /dev/null +++ b/backend/tests/outbox/test_draft_sync.py @@ -0,0 +1,188 @@ +"""Mirroring local drafts to the IMAP Drafts folder (continue on any client).""" + +from __future__ import annotations + +import uuid +from collections.abc import AsyncIterator +from dataclasses import dataclass + +import pytest_asyncio +from sqlalchemy import delete, select +from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine +from sqlalchemy.pool import NullPool + +from app.config import get_settings +from app.db import session_scope +from app.identity.passwords import hash_password +from app.models import Account, Draft, Mailbox, User +from app.outbox import draft_sync + + +@dataclass +class Ctx: + session: AsyncSession + user_id: uuid.UUID + account_id: uuid.UUID + + +@pytest_asyncio.fixture +async def ctx() -> AsyncIterator[Ctx]: + engine = create_async_engine(get_settings().database_url, poolclass=NullPool) + sm = async_sessionmaker(engine, expire_on_commit=False) + session = sm() + user = User(handle=f"drf{uuid.uuid4().hex[:8]}@test.local", password_hash=hash_password("pw")) + session.add(user) + await session.flush() + account = Account( + user_id=user.id, + email="me@example.com", + display_name="Me", + imap_config={}, + smtp_config={}, + secret_ct=b"", + discovery_src="manual", + ) + session.add(account) + await session.flush() + session.add( + Mailbox(account_id=account.id, user_id=user.id, path="DRAFTS", special_use="drafts") + ) + await session.commit() + try: + yield Ctx(session=session, user_id=user.id, account_id=account.id) + finally: + await session.execute(delete(User).where(User.id == user.id)) + await session.commit() + await session.close() + await engine.dispose() + + +class FakeProvider: + def __init__(self) -> None: + self.appended: list[tuple[str, frozenset[str]]] = [] + self.deleted: list[tuple[str, list[int]]] = [] + self._uid = 41 + + async def append(self, mailbox: str, raw: bytes, flags: frozenset[str]) -> int: + self.appended.append((mailbox, flags)) + self._uid += 1 + return self._uid + + async def delete_messages(self, mailbox: str, uids: list[int]) -> None: + self.deleted.append((mailbox, list(uids))) + + async def close(self) -> None: + return None + + +async def _make_draft(ctx: Ctx) -> uuid.UUID: + draft = Draft( + user_id=ctx.user_id, + account_id=ctx.account_id, + kind="new", + payload={"to": ["bob@example.com"], "subject": "Hi", "html": "

hi

", "text": ""}, + ) + ctx.session.add(draft) + await ctx.session.commit() + return draft.id + + +async def test_push_draft_appends_with_draft_flag_and_replaces(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + did = await _make_draft(ctx) + fake = FakeProvider() + monkeypatch.setattr(draft_sync, "build_provider", lambda _a: fake) + + await draft_sync.push_draft_to_imap_job({}, str(did)) + + # appended once to DRAFTS with the \Draft flag; UID recorded on the draft + assert len(fake.appended) == 1 + assert fake.appended[0][0] == "DRAFTS" + assert "\\Draft" in fake.appended[0][1] + assert fake.deleted == [] # nothing to replace yet + async with session_scope() as s: + assert (await s.get(Draft, did)).imap_uid == 42 # type: ignore[union-attr] + + # A second push (edit) appends a new copy and expunges the previous UID. + await draft_sync.push_draft_to_imap_job({}, str(did)) + assert len(fake.appended) == 2 + assert fake.deleted == [("DRAFTS", [42])] + async with session_scope() as s: + assert (await s.get(Draft, did)).imap_uid == 43 # type: ignore[union-attr] + + +async def test_draft_messages_are_not_threaded(ctx: Ctx) -> None: + from datetime import UTC, datetime + from email.message import EmailMessage + + from app.indexer.indexer import persist_message + from app.providers.base import RemoteMessage + + m = EmailMessage() + m["Subject"] = "A draft reply" + m["From"] = "me@example.com" + m["To"] = "bob@example.com" + m["Message-ID"] = "" + m["In-Reply-To"] = "" # would normally thread it + m["Date"] = "Mon, 09 Mar 2026 08:36:37 +0100" + m.set_content("body") + + drafts_mb = await ctx.session.scalar( + select(Mailbox).where( + Mailbox.account_id == ctx.account_id, Mailbox.special_use == "drafts" + ) + ) + assert drafts_mb is not None + remote = RemoteMessage( + uid=71, raw=m.as_bytes(), flags=frozenset({"\\Draft"}), internal_date=datetime.now(UTC) + ) + result = await persist_message( + ctx.session, + user_id=ctx.user_id, + account_id=ctx.account_id, + mailbox_id=drafts_mb.id, + mailbox_special_use="drafts", + remote=remote, + ) + await ctx.session.commit() + assert result is not None + assert result.message.thread_id is None # drafts stay out of conversations + + +async def test_remove_imap_draft_expunges(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + fake = FakeProvider() + monkeypatch.setattr(draft_sync, "build_provider", lambda _a: fake) + await draft_sync.remove_imap_draft_job({}, str(ctx.account_id), 7) + assert fake.deleted == [("DRAFTS", [7])] + + +async def test_no_drafts_mailbox_creates_one(ctx: Ctx, monkeypatch) -> None: # type: ignore[no-untyped-def] + # Drop the drafts mailbox so the job has to create it. + await ctx.session.execute( + delete(Mailbox).where(Mailbox.account_id == ctx.account_id, Mailbox.special_use == "drafts") + ) + await ctx.session.commit() + did = await _make_draft(ctx) + + created: list[str] = [] + + class CreatingProvider(FakeProvider): + async def create_mailbox(self, path: str) -> None: + created.append(path) + + async def list_mailboxes(self): # type: ignore[no-untyped-def] + from app.providers.base import RemoteMailbox + + return [RemoteMailbox(path="Drafts", special_use="drafts", uidvalidity=1)] + + fake = CreatingProvider() + monkeypatch.setattr(draft_sync, "build_provider", lambda _a: fake) + + await draft_sync.push_draft_to_imap_job({}, str(did)) + assert created == ["Drafts"] + async with session_scope() as s: + mb = await s.scalar( + select(Mailbox).where( + Mailbox.account_id == ctx.account_id, Mailbox.special_use == "drafts" + ) + ) + assert mb is not None and mb.path == "Drafts" diff --git a/backend/tests/outbox/test_outbox.py b/backend/tests/outbox/test_outbox.py index 0cd4a7a..c90444e 100644 --- a/backend/tests/outbox/test_outbox.py +++ b/backend/tests/outbox/test_outbox.py @@ -65,14 +65,18 @@ def test_build_mime_sets_threading_and_alternative() -> None: "text": "", }, ) - raw, env_from, env_to = build_mime(account, draft, parent) + transmit_raw, sent_raw, env_from, env_to = build_mime(account, draft, parent) assert env_from == "me@example.com" assert set(env_to) == {"bob@example.com", "c@example.com", "secret@example.com"} - msg = email.message_from_bytes(raw, policy=default_policy) + msg = email.message_from_bytes(transmit_raw, policy=default_policy) assert msg["From"] == "Me " assert msg["To"] == "bob@example.com" - assert "secret@example.com" not in (raw.decode()) # bcc not in headers + assert msg["Bcc"] is None # transmitted copy carries no Bcc + assert "secret@example.com" not in transmit_raw.decode() # bcc not transmitted + # ...but the Sent copy records the Bcc so the sender keeps the blind recipient. + sent_msg = email.message_from_bytes(sent_raw, policy=default_policy) + assert sent_msg["Bcc"] == "secret@example.com" assert msg["In-Reply-To"] == "" assert "" in msg["References"] and "" in msg["References"] # multipart/alternative with an auto-generated text part @@ -96,7 +100,7 @@ def test_build_mime_includes_attachments() -> None: kind="new", payload={"to": ["bob@example.com"], "subject": "Files", "html": "

hi

", "text": ""}, ) - raw, _from, _to = build_mime( + raw, _sent, _from, _to = build_mime( account, draft, None, [("report.pdf", "application/pdf", b"%PDF-1.4 data")] ) msg = email.message_from_bytes(raw, policy=default_policy) @@ -219,6 +223,79 @@ async def test_draft_crud(ctx: Ctx) -> None: assert deleted.status_code == 200 +async def test_remote_drafts_listed_and_adopted(ctx: Ctx) -> None: + from datetime import UTC, datetime + + from app.models import BodyPart + + # A "foreign" draft (as if created in another client) in the Drafts folder. + drafts_mb = Mailbox( + account_id=ctx.account_id, user_id=ctx.user_id, path="DRAFTS", special_use="drafts" + ) + ctx.session.add(drafts_mb) + await ctx.session.flush() + msg = Message( + user_id=ctx.user_id, + account_id=ctx.account_id, + mailbox_id=drafts_mb.id, + uid=94, + subject="Home draft", + to_addr=[{"name": "", "email": "bob@example.com"}], + cc_addr=[], + bcc_addr=[], + internal_date=datetime.now(UTC), + blob_sha256="x" * 64, + snippet="hello there", + ) + ctx.session.add(msg) + await ctx.session.flush() + ctx.session.add(BodyPart(message_id=msg.id, kind="html_sanitized", content="

hello

")) + ctx.session.add(BodyPart(message_id=msg.id, kind="text", content="hello there")) + await ctx.session.commit() + + # It shows in the remote drafts list. + listing = await ctx.client.get("/api/drafts/remote") + assert listing.status_code == 200 + assert any(i["message_id"] == str(msg.id) and i["imap_uid"] == 94 for i in listing.json()) + + # Adopting turns it into an editable local draft (linked by UID). + adopted = await ctx.client.post(f"/api/drafts/adopt/{msg.id}", headers=_hdr()) + assert adopted.status_code == 200, adopted.text + draft = adopted.json() + assert draft["payload"]["subject"] == "Home draft" + assert draft["payload"]["to"] == ["bob@example.com"] + assert draft["payload"]["html"] == "

hello

" + + # Now it's excluded from the remote list (we own that UID)... + listing2 = await ctx.client.get("/api/drafts/remote") + assert all(i["message_id"] != str(msg.id) for i in listing2.json()) + # ...and adopting again returns the same local draft (idempotent). + again = await ctx.client.post(f"/api/drafts/adopt/{msg.id}", headers=_hdr()) + assert again.json()["id"] == draft["id"] + + +async def test_publish_draft_enqueues_imap_mirror(ctx: Ctx) -> None: + did = (await ctx.client.post("/api/drafts", json=_draft_body(ctx), headers=_hdr())).json()["id"] + ctx.enqueued.clear() + resp = await ctx.client.post(f"/api/drafts/{did}/publish", headers=_hdr()) + assert resp.status_code == 200 + assert ctx.enqueued[-1][0] == ("push_draft_to_imap_job", did) + + +async def test_delete_draft_expunges_mirror_when_present(ctx: Ctx) -> None: + did = (await ctx.client.post("/api/drafts", json=_draft_body(ctx), headers=_hdr())).json()["id"] + # Simulate a previously mirrored copy (imap_uid set). + draft = await ctx.session.get(Draft, uuid.UUID(did)) + assert draft is not None + draft.imap_uid = 88 + await ctx.session.commit() + + ctx.enqueued.clear() + resp = await ctx.client.request("DELETE", f"/api/drafts/{did}", headers=_hdr()) + assert resp.status_code == 200 + assert ctx.enqueued[-1][0] == ("remove_imap_draft_job", str(ctx.account_id), 88) + + async def test_upload_and_list_compose_attachment(ctx: Ctx) -> None: resp = await ctx.client.post( "/api/attachments", @@ -332,6 +409,17 @@ async def test_send_job_success(ctx: Ctx, monkeypatch) -> None: # type: ignore[ ctx.session.expunge_all() async with session_scope() as verify: assert await verify.get(Draft, draft_id) is None + # The sent copy is persisted into the Sent mailbox (append UID 99). + sent_mb = await verify.scalar( + select(Mailbox).where( + Mailbox.account_id == ctx.account_id, Mailbox.special_use == "sent" + ) + ) + assert sent_mb is not None + sent_msg = await verify.scalar( + select(Message).where(Message.mailbox_id == sent_mb.id, Message.uid == 99) + ) + assert sent_msg is not None and sent_msg.subject == "Re: Hi" kr = await ctx.session.scalar( select(KnownRecipient).where( KnownRecipient.user_id == ctx.user_id, KnownRecipient.email == "bob@example.com" diff --git a/backend/tests/sync/test_secondary_poll.py b/backend/tests/sync/test_secondary_poll.py new file mode 100644 index 0000000..5a389a4 --- /dev/null +++ b/backend/tests/sync/test_secondary_poll.py @@ -0,0 +1,99 @@ +"""Secondary (non-INBOX) folder polling — multi-folder CONDSTORE sync (SPEC §6.3).""" + +from __future__ import annotations + +import uuid +from datetime import UTC, datetime +from email.message import EmailMessage + +from sqlalchemy import delete, func, select +from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine +from sqlalchemy.pool import NullPool + +from app.config import get_settings +from app.db import session_scope +from app.identity.passwords import hash_password +from app.models import Account, Mailbox, Message, User +from app.providers.base import MailboxDelta, RemoteMessage +from app.sync import engine as sync_engine + + +def _raw(subject: str, mid: str) -> bytes: + m = EmailMessage() + m["Subject"] = subject + m["From"] = "me@example.com" + m["To"] = "bob@example.com" + m["Message-ID"] = mid + m["Date"] = "Mon, 09 Mar 2026 08:36:37 +0100" + m.set_content("body") + return m.as_bytes() + + +async def test_secondary_poll_syncs_special_folders_not_inbox(monkeypatch) -> None: # type: ignore[no-untyped-def] + engine = create_async_engine(get_settings().database_url, poolclass=NullPool) + sm = async_sessionmaker(engine, expire_on_commit=False) + session = sm() + user = User(handle=f"sec{uuid.uuid4().hex[:8]}@test.local", password_hash=hash_password("pw")) + session.add(user) + await session.flush() + account = Account( + user_id=user.id, + email="me@example.com", + imap_config={}, + smtp_config={}, + secret_ct=b"", + discovery_src="manual", + ) + session.add(account) + await session.flush() + inbox = Mailbox(account_id=account.id, user_id=user.id, path="INBOX", special_use="inbox") + sent = Mailbox(account_id=account.id, user_id=user.id, path="SENT", special_use="sent") + custom = Mailbox(account_id=account.id, user_id=user.id, path="Notes", special_use=None) + session.add_all([inbox, sent, custom]) + await session.commit() + + polled: list[str] = [] + + class FakeProvider: + async def poll(self, mailbox: str, *, last_seen_uid: int, highestmodseq: int | None): # type: ignore[no-untyped-def] + polled.append(mailbox) + if mailbox == "SENT": + return MailboxDelta( + [ + RemoteMessage( + uid=5, + raw=_raw("Sent one", ""), + flags=frozenset({"\\Seen"}), + internal_date=datetime.now(UTC), + ) + ], + [], + [], + None, + None, + ) + return MailboxDelta([], [], [], None, None) + + async def close(self) -> None: + return None + + monkeypatch.setattr(sync_engine, "build_provider", lambda _a: FakeProvider()) + + try: + await sync_engine._poll_secondary_once(account.id) + + # Only the non-INBOX special-use folder is polled (SENT); INBOX and the + # custom folder (no special_use) are skipped. + assert polled == ["SENT"] + + # The delta was applied: the sent message is now in the DB under SENT. + session.expunge_all() + n = await session.scalar( + select(func.count()).select_from(Message).where(Message.mailbox_id == sent.id) + ) + assert n == 1 + finally: + async with session_scope() as cleanup: + await cleanup.execute(delete(User).where(User.id == user.id)) + await session.close() + await engine.dispose() diff --git a/backend/workers/worker.py b/backend/workers/worker.py index b13ef58..01199e1 100644 --- a/backend/workers/worker.py +++ b/backend/workers/worker.py @@ -10,6 +10,7 @@ import uuid from typing import Any from app.config import get_settings +from app.outbox.draft_sync import push_draft_to_imap_job, remove_imap_draft_job from app.outbox.jobs import send_job from app.queue import redis_settings as arq_redis_settings from app.sync.actions import ( @@ -18,7 +19,7 @@ from app.sync.actions import ( move_thread_to_folder_job, push_flags_job, ) -from app.sync.engine import bootstrap_and_backfill +from app.sync.engine import bootstrap_and_backfill, refresh_account_job logger = logging.getLogger(__name__) @@ -60,6 +61,9 @@ class WorkerSettings: move_thread_to_folder_job, delete_thread_job, send_job, + push_draft_to_imap_job, + remove_imap_draft_job, + refresh_account_job, ] on_startup = on_startup on_shutdown = on_shutdown diff --git a/frontend/src/components/compose/Composer.tsx b/frontend/src/components/compose/Composer.tsx index d2545a6..f09512b 100644 --- a/frontend/src/components/compose/Composer.tsx +++ b/frontend/src/components/compose/Composer.tsx @@ -1,12 +1,12 @@ import { useQuery } from "@tanstack/react-query"; -import { useEffect, useMemo, useRef, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useT } from "../../i18n"; import { api, ApiError } from "../../lib/api"; import type { AccountOut, AttachmentOut, DraftInput, DraftOut } from "../../lib/types"; import { Icon } from "../Icon"; import { RecipientChips } from "./RecipientChips"; -import { RichTextEditor } from "./RichTextEditor"; +import { RichTextEditor, type RichTextEditorHandle } from "./RichTextEditor"; const MAX_ATTACHMENT_BYTES = 25 * 1024 * 1024; // 25 MB per file @@ -142,12 +142,26 @@ export function Composer({ const [status, setStatus] = useState<"" | "saving" | "saved" | "sending" | "error">(""); const [undo, setUndo] = useState<{ outboxId: string } | null>(null); const draftId = useRef(init.draftId ?? null); + const sentRef = useRef(false); // send initiated -> don't mirror to Drafts on close const undoTimer = useRef(null); const fileInputRef = useRef(null); + const editorRef = useRef(null); const account = accounts.find((a) => a.id === accountId); const fromName = account?.display_name || ""; const fromEmail = account?.email ?? ""; + const signature = account?.signature ?? ""; + + // When the From account changes, swap the signature block for the new one. + const firstAccount = useRef(true); + useEffect(() => { + if (firstAccount.current) { + firstAccount.current = false; + return; + } + editorRef.current?.replaceSignature(accounts.find((a) => a.id === accountId)?.signature ?? ""); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [accountId]); // Fetch the original message's sanitized body to quote in a reply/forward. useEffect(() => { @@ -208,24 +222,24 @@ export function Composer({ const removeAttachment = (id: string) => setAttachments((prev) => prev.filter((a) => a.id !== id)); - // The editor's seed content: an empty line to type into, then (for replies) - // the attribution line and the quoted original inside a blockquote. - const initialHtml = useMemo(() => { + // The editor's seed content. New messages get the account signature (2 blank + // lines above it); replies keep the quoted original in a marked block so the + // signature can later be inserted above it. + const initialHtml = (() => { if (init.html) return init.html; if (init.text) return textToHtml(init.text); if (init.quote) { return ( `

` + + `
` + `
${escapeHtml(init.quote.attribution)}
` + - `
${quoteHtml}
` + `
${quoteHtml}
` ); } - return `

`; - // Only the quote resolving should (re)compute this; it mounts the editor once. - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [quoteResolved]); + return `


${signature}
`; + })(); - const bodyReady = quoteResolved; + const bodyReady = quoteResolved && accountsQuery.data !== undefined; const payload = (): DraftInput => { const html = bodyHtml || initialHtml; @@ -269,12 +283,18 @@ export function Composer({ useEffect( () => () => { if (undoTimer.current) window.clearTimeout(undoTimer.current); + // On close, mirror the draft to the IMAP Drafts folder so it can be + // continued on any mail client (skip if it was sent or discarded). + if (draftId.current && !sentRef.current) { + void api.publishDraft(draftId.current).catch(() => {}); + } }, [], ); const send = async () => { setStatus("sending"); + sentRef.current = true; // don't also mirror to Drafts on close try { if (!draftId.current) draftId.current = (await api.createDraft(payload())).id; else await api.updateDraft(draftId.current, payload()); @@ -282,6 +302,7 @@ export function Composer({ setUndo({ outboxId: res.outbox_id }); undoTimer.current = window.setTimeout(onClose, 10000); } catch (e) { + sentRef.current = false; setStatus("error"); if (!(e instanceof ApiError)) throw e; } @@ -295,6 +316,7 @@ export function Composer({ /* too late */ } if (undoTimer.current) window.clearTimeout(undoTimer.current); + sentRef.current = false; // back to a draft; mirror it on close setUndo(null); setStatus(""); }; @@ -403,6 +425,16 @@ export function Composer({ > {t("compose.cc")} / {t("compose.bcc")} + + ); +} + +// The Drafts folder lists local drafts (the `drafts` table) plus drafts found in +// the account's IMAP Drafts folder that were created on another client. export function DraftsList({ drafts, + remoteDrafts, onOpen, + onOpenRemote, }: { drafts: DraftOut[]; + remoteDrafts: RemoteDraftOut[]; onOpen: (draft: DraftOut) => void; + onOpenRemote: (draft: RemoteDraftOut) => void; }) { const t = useT(); - if (drafts.length === 0) { + if (drafts.length === 0 && remoteDrafts.length === 0) { return
{t("compose.noDrafts")}
; } + + // Merge local + remote drafts into one list sorted by date (newest first). + type Row = { + key: string; + date: string; + recipients: string; + subject: string; + preview: string; + badge?: string; + onClick: () => void; + }; + const rows: Row[] = [ + ...drafts.map((d) => ({ + key: `l-${d.id}`, + date: d.updated_at, + recipients: d.payload.to.join(", ") || t("compose.noRecipient"), + subject: d.payload.subject || t("compose.noSubject"), + preview: d.payload.text.trim(), + onClick: () => onOpen(d), + })), + ...remoteDrafts.map((d) => ({ + key: `r-${d.message_id}`, + date: d.updated_at, + recipients: d.to.join(", ") || t("compose.noRecipient"), + subject: d.subject || t("compose.noSubject"), + preview: d.snippet.trim(), + badge: t("compose.otherClient"), + onClick: () => onOpenRemote(d), + })), + ].sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); + return (
- {drafts.map((draft) => { - const recipients = draft.payload.to.join(", ") || t("compose.noRecipient"); - const preview = draft.payload.text.trim(); - return ( - - ); - })} + {rows.map((row) => ( + + ))}
); } diff --git a/frontend/src/components/list/MessageList.tsx b/frontend/src/components/list/MessageList.tsx index 8fb4f22..5276630 100644 --- a/frontend/src/components/list/MessageList.tsx +++ b/frontend/src/components/list/MessageList.tsx @@ -61,18 +61,13 @@ export function MessageList({ height: item.size, transform: `translateY(${item.start}px)`, }} - className={`flex flex-col gap-1 border-b border-app-border px-3 py-2.5 text-left ${ + className={`flex flex-col gap-1 border-b border-app-border px-6 py-2.5 text-left ${ selected ? "bg-app-active" : "hover:bg-app-hover" }`} >
- {unread ? ( - - ) : ( - - )} {thread.account_ids.map((id) => ( {timeLabel(thread.last_message_at)}
-
+
{thread.subject} {thread.has_attachments && 📎}
-
{thread.snippet}
+
{thread.snippet}
); })} diff --git a/frontend/src/components/thread/ThreadView.tsx b/frontend/src/components/thread/ThreadView.tsx index d35778f..dcfc986 100644 --- a/frontend/src/components/thread/ThreadView.tsx +++ b/frontend/src/components/thread/ThreadView.tsx @@ -120,6 +120,9 @@ function MessageItem({ {message.cc_addr.length > 0 && ( · cc: {formatList(message.cc_addr)} )} + {message.bcc_addr.length > 0 && ( + · bcc: {formatList(message.bcc_addr)} + )} {new Date(message.date).toLocaleString()} @@ -193,7 +196,7 @@ export function ThreadView({ subject, messages, order, replyKindSignal }: Thread return (
-
+

{subject || "(no subject)"}

+ {quotaQuery.data && ( +
+ {quotaLabel(quotaQuery.data)} +
+ )}
@@ -240,7 +298,7 @@ export function MailLayout() { style={{ width: listW }} className="flex shrink-0 flex-col border-r border-app-border bg-app-surface" > -
+
{!isDrafts && ( -
+
setFilter("all")}> {t("filter.all")} @@ -261,7 +319,7 @@ export function MailLayout() { {t("filter.pinned")}
+
+ + {!isDrafts && total > 0 ? ( +
+ + {pageStart + 1}–{pageEnd} of {total} + +
+ setPage(curPage - 1)} + label={t("pager.prev")} + dir="left" + /> + = total} + onClick={() => setPage(curPage + 1)} + label={t("pager.next")} + dir="right" + /> +
+
+ ) : ( + )}
@@ -291,7 +392,7 @@ export function MailLayout() {
{threadId && detailQuery.data ? (
-
+
{currentFolder === "archive" ? ( <> @@ -369,6 +470,7 @@ export function MailLayout() { setComposing(null); setComposerExpanded(false); queryClient.invalidateQueries({ queryKey: ["drafts"] }); + queryClient.invalidateQueries({ queryKey: ["drafts-remote"] }); }} />
@@ -401,6 +503,52 @@ function FilterTab({ ); } +function PagerButton({ + disabled, + onClick, + label, + dir, +}: { + disabled: boolean; + onClick: () => void; + label: string; + dir: "left" | "right"; +}) { + return ( + + ); +} + +function RefreshIcon({ spinning }: { spinning: boolean }) { + return ( + + + + + ); +} + function SortIcon() { return ( +

{t("settings.profile")}

@@ -114,7 +115,7 @@ function SecuritySection() { }); return ( -
+

{t("settings.twoFactor")}

{enabled ? ( @@ -217,13 +218,21 @@ function AccountsSection() { const navigate = useNavigate(); const queryClient = useQueryClient(); const accounts = useQuery({ queryKey: ["accounts"], queryFn: api.accounts }); + const [editing, setEditing] = useState<{ id: string; mode: "account" | "signature" } | null>( + null, + ); const remove = useMutation({ mutationFn: (id: string) => api.deleteAccount(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ["accounts"] }), }); + const close = () => { + setEditing(null); + queryClient.invalidateQueries({ queryKey: ["accounts"] }); + }; + return ( -
+

{t("settings.accounts")}

+
  • + {editing?.id === a.id && editing.mode === "account" ? ( + setEditing(null)} onSaved={close} /> + ) : editing?.id === a.id && editing.mode === "signature" ? ( + setEditing(null)} onSaved={close} /> + ) : ( +
    + + + {a.email} + + {t("settings.syncState", { state: a.state })} + + + + + + + +
    + )}
  • ))} @@ -256,6 +289,243 @@ function AccountsSection() { ); } +function AccountEditor({ + accountId, + onCancel, + onSaved, +}: { + accountId: string; + onCancel: () => void; + onSaved: () => void; +}) { + const t = useT(); + const detail = useQuery({ queryKey: ["account", accountId], queryFn: () => api.accountDetail(accountId) }); + const [displayName, setDisplayName] = useState(""); + const [color, setColor] = useState("#888888"); + const [showServer, setShowServer] = useState(false); + const [imapHost, setImapHost] = useState(""); + const [imapPort, setImapPort] = useState("993"); + const [imapTls, setImapTls] = useState("ssl"); + const [smtpHost, setSmtpHost] = useState(""); + const [smtpPort, setSmtpPort] = useState("465"); + const [smtpTls, setSmtpTls] = useState("ssl"); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); + + useEffect(() => { + const d = detail.data; + if (!d) return; + setDisplayName(d.display_name); + setColor(d.color); + setImapHost(String(d.imap_config.host ?? "")); + setImapPort(String(d.imap_config.port ?? "993")); + setImapTls(String(d.imap_config.tls ?? "ssl")); + setSmtpHost(String(d.smtp_config.host ?? "")); + setSmtpPort(String(d.smtp_config.port ?? "465")); + setSmtpTls(String(d.smtp_config.tls ?? "ssl")); + }, [detail.data]); + + const save = useMutation({ + mutationFn: () => { + const patch: Parameters[1] = { + display_name: displayName, + color, + }; + if (showServer) { + patch.imap = { host: imapHost, port: Number(imapPort), tls: imapTls, auth: "password" }; + patch.smtp = { host: smtpHost, port: Number(smtpPort), tls: smtpTls, auth: "password" }; + patch.password = password; + } + return api.updateAccount(accountId, patch); + }, + onSuccess: onSaved, + onError: (e) => setError(e instanceof ApiError ? e.message : "Save failed"), + }); + + if (!detail.data) return
    {t("common.loading")}
    ; + + const canSave = !save.isPending && (!showServer || password.length > 0); + + return ( +
    +
    + setColor(e.target.value)} + aria-label={t("settings.color")} + /> + setDisplayName(e.target.value)} + /> +
    + + {!showServer ? ( + + ) : ( +
    +

    {t("settings.serverSettingsHint")}

    + + + setPassword(e.target.value)} + /> +
    + )} + + {error &&

    {error}

    } +
    + + +
    +
    + ); +} + +function SignatureEditor({ + accountId, + onCancel, + onSaved, +}: { + accountId: string; + onCancel: () => void; + onSaved: () => void; +}) { + const t = useT(); + const detail = useQuery({ + queryKey: ["account", accountId], + queryFn: () => api.accountDetail(accountId), + }); + const [signature, setSignature] = useState(""); + const [error, setError] = useState(""); + + useEffect(() => { + if (detail.data) setSignature(detail.data.signature); + }, [detail.data]); + + const save = useMutation({ + mutationFn: () => api.updateAccount(accountId, { signature }), + onSuccess: onSaved, + onError: (e) => setError(e instanceof ApiError ? e.message : "Save failed"), + }); + + if (!detail.data) return
    {t("common.loading")}
    ; + + return ( +
    +
    + {t("settings.signature")} — {detail.data.email} +
    +
    + +
    + {error &&

    {error}

    } +
    + + +
    +
    + ); +} + +function ServerRow({ + label, + host, + port, + tls, + onHost, + onPort, + onTls, +}: { + label: string; + host: string; + port: string; + tls: string; + onHost: (v: string) => void; + onPort: (v: string) => void; + onTls: (v: string) => void; +}) { + const t = useT(); + return ( +
    + {label} + onHost(e.target.value)} + /> + onPort(e.target.value)} + /> + +
    + ); +} + function AppearanceSection() { const t = useT(); const queryClient = useQueryClient(); @@ -267,7 +537,7 @@ function AppearanceSection() { }); return ( -
    +

    {t("settings.appearance")}

    {t("settings.theme")} diff --git a/frontend/src/test/ThreadView.test.tsx b/frontend/src/test/ThreadView.test.tsx index c9fa5a2..d50963a 100644 --- a/frontend/src/test/ThreadView.test.tsx +++ b/frontend/src/test/ThreadView.test.tsx @@ -17,6 +17,7 @@ function msg(id: string, minutes: number, unread = false): MessageEnvelope { from_addr: [{ name: `Sender ${id}`, email: `${id}@x.com` }], to_addr: [], cc_addr: [], + bcc_addr: [], date: new Date(2026, 0, 1, 12, minutes).toISOString(), flags: unread ? [] : ["\\Seen"], is_unread: unread, diff --git a/screenshots/mail_list_alignement.png b/screenshots/mail_list_alignement.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9938d12e6ca7fb1b3ba3943fd414ca40f19530 GIT binary patch literal 173390 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 literal 0 HcmV?d00001