accounts/docs/dashboard-mail-module-plan.md

8.4 KiB
Raw Blame History

Dashboard Mail Module Planning / Dashboard 邮件模块规划

Overview / 概览

This document outlines the proposed dashboard mail module that integrates a multi-tenant email experience with tenant-scoped AI assistance. The design aligns with the user's requirement of keeping the mail capabilities cohesive inside the dashboard and enforcing tenant isolation end-to-end. / 本文档概述了在 Dashboard 中集成多租户邮件体验和租户级 AI 助手的规划方案,满足“邮件子模块”高内聚的目标,并在前后端全链路落实租户隔离。

Frontend Structure (Next.js) / 前端目录结构Next.js

dashboard/app/
│  ├ mail/
│  ├─ (tenant)/[tenantId]/mail/
│  │  ├─ page.tsx                # Inbox view 列表 + 过滤 + 分页
│  │  ├─ compose/page.tsx        # Compose / Reply / Forward
│  │  ├─ settings/page.tsx       # Account mapping, signatures, aliases, keys
│  │  └─ message/[id]/page.tsx   # Message detail with AI summary & smart reply
│  └─ api/
│     └─ mail/                   # Edge proxy or upload signature (optional)
├─ components/mail/
│  ├─ Inbox.tsx
│  ├─ MessageItem.tsx
│  ├─ MessageView.tsx
│  ├─ ComposeForm.tsx
│  └─ Toolbar.tsx
├─ lib/
│  ├─ apiClient.ts               # Fetch helper with tenant context
│  ├─ auth.ts                    # OIDC/JWT parsing, inject tenantId/userId
│  └─ types.ts                   # Shared TS types (Message, Thread, Label, etc.)
└─ store/
   └─ mail.store.ts              # Lightweight state for query/filter/page

Frontend Guidelines / 前端要点

  • URL paths carry the tenantId explicitly and are validated against the tid field in the authenticated JWT. / URL 显式携带 tenantId 并与 JWT 中的 tid 校验一致。
  • Every backend request attaches an x-tenant-id header; the backend re-checks the header against JWT claims. / 所有后端请求都加 x-tenant-id 头部,后端二次比对。
  • Large attachments use S3 direct uploads. The frontend obtains a pre-signed URL from the backend, then performs a PUT directly to S3 to avoid saturating the backend. / 大附件通过后端获取预签名 URL 后直接 PUT 到 S3减少后端带宽占用。
  • Components keep AI-specific render logic (summary, reply suggestions) inside MessageView while surfacing controls via Toolbar. / AI 摘要与智能回复逻辑在 MessageView 内封装,通过 Toolbar 暴露交互控件。

Backend Service Layout (Go) / 后端服务目录结构Go

cmd/mailapi/main.go
internal/
  auth/
    middleware.go          # JWT/OIDC validation, inject tid/uid into context
  imap/
    client.go              # Dovecot IMAPS (emersion/go-imap)
    fetch.go               # Listing, fetch, read-state updates
    flags.go               # Star, archive, delete
  smtp/
    sender.go              # SMTPS 465 (emersion/go-smtp or SMTP AUTH)
  s3/
    presign.go             # Upload/download presigned URLs
  ai/
    summarizer.go          # Summaries, highlights, action items
    classifier.go          # Auto labeling & priority tagging
    reply_suggest.go       # Smart replies (few-shot prompts)
    namespace.go           # Tenant-scoped models, quotas, vector stores, logs
  search/
    indexer.go             # Optional metadata indexing (PG/Meilisearch)
  http/
    server.go              # chi/fiber/gin wrapper
    handlers.go            # HTTP route registration
  core/
    types.go               # Message, Thread, Attachment, AIResult, etc.
    config.go              # TLS/S3/IMAP/SMTP/AI configuration
    logger.go              # Shared structured logging helpers

Backend Operations / 后端运行模型

  • Communicate with Dovecot via IMAPS (port 993) and with Postfix via SMTPS (port 465 or 587 + STARTTLS). / 与 Dovecot 通过 IMAPS:993Postfix 通过 SMTPS:465 或 587+STARTTLS。
  • The backend never exposes raw IMAP/SMTP credentials to the frontend; all mail access is proxied through the API. / 后端不向前端泄露 IMAP/SMTP 凭证,通过 API 统一代理。
  • Each tenant receives an isolated AI namespace managed in ai/namespace.go, covering model choice, temperature, rate limits, vector indices, and audit logging. / 每个租户在 ai/namespace.go 中拥有独立的模型、温度、速率限制、向量索引与日志策略。
  • Tenant and user boundaries are enforced in auth/middleware.go by validating tid and uid claims on every request. / auth/middleware.go 统一校验 tiduid,保证权限边界。

HTTP API Contract / HTTP API 设计

All endpoints require Authorization: Bearer <JWT> and x-tenant-id headers, where the header must match the JWT tid. / 所有请求必须携带 Authorization: Bearer <JWT>x-tenant-id,且后者需与 JWT 中的 tid 一致。

Mail Core / 邮件核心

  • GET /v1/mail/inbox?cursor=&pageSize=&label=&q= — Returns a paginated inbox with light summaries and unread counts. / 返回分页收件箱、摘要与未读计数。
  • GET /v1/mail/message/:id — Returns message body (HTML/text), attachments, cached AI summaries. / 返回邮件正文、附件元信息及缓存的 AI 摘要。
  • POST /v1/mail/send — Sends mail through SMTPS and persists to the Sent folder. / 通过 SMTPS 发送邮件并写入已发送。
  • DELETE /v1/mail/message/:id — Moves to trash or marks deleted. / 标记删除或移动到废纸篓。

Attachment Flows / 附件直传

  • POST /v1/mail/attachments/presign — Request S3 upload URL for large attachments. / 获取大附件直传 S3 的预签名 URL。
  • GET /v1/mail/attachments/:key/presign — Fetch download URLs for existing attachments. / 获取附件下载签名 URL。

AI Namespace APIs / AI 命名空间接口

  • POST /v1/ai/mail/summarize — Summaries, bullet points, actions, tone analysis. / 输出摘要、要点、行动项与语气分析。
  • POST /v1/ai/mail/reply-suggest — Generates three draft replies given style and language preferences. / 根据风格与语言返回三条智能草稿。
  • POST /v1/ai/mail/classify — Applies tenant-tuned labels such as Billing or Incident. / 自动打标签(计费、故障、人力、垃圾等)。
  • POST /v1/ai/mail/thread-digest — Produces a thread-level digest with timeline. / 输出会话摘要与时间线要点。
  • GET /v1/ai/namespace — Returns the tenant's AI configuration and quota status. / 查看租户 AI 配置与配额。
  • PUT /v1/ai/namespace — Tenant admins update model, temperature, max tokens, and policies (e.g., sensitive-word restrictions). / 租户管理员修改模型、温度、最大 Token 与 敏感词策略。

Infrastructure Notes / 基础设施要点

  • Domain separation: smtp.svc.plus, imap.svc.plus, mail.svc.plus, with wildcard TLS (*.svc.plus) via Lets Encrypt or imported certificates. / 域名分离:smtp.svc.plus, imap.svc.plus, mail.svc.plusTLS 使用 *.svc.plus 通配符证书。
  • Adjust stalwart.toml to map SMTP/IMAP hostnames and keep DNS A records aligned for all three domains. / 在 stalwart.toml 中区分 SMTP/IMAP 主机名,并保持 DNS A 记录同步。
  • The Web UI remains dashboard-driven; stalwarts native UI stays disabled as a placeholder. / WebUI 以 Dashboard 为中心stalwart 原生界面保持关闭占位状态。

Integration Checklist / 集成检查清单

  1. Implement the Next.js routes and components following the tenant-aware structure. / 按租户结构实现 Next.js 路由与组件。
  2. Wire apiClient.ts to automatically inject Authorization and x-tenant-id headers. / apiClient.ts 自动注入认证与租户头部。
  3. Stand up the Go mail API with middleware enforcing tenant isolation and TLS-only upstream connections. / 部署 Go 邮件 API确保中间件与 TLS-only 上游链路。
  4. Configure S3 buckets, IAM roles, and stalwart connectors for attachment handling. / 配置 S3、IAM 与 stalwart 附件处理。
  5. Provision AI namespace defaults per tenant (model, temperature, quotas) and surface the settings page for admins. / 为每个租户设置 AI 命名空间默认值,并在设置页展示给管理员。
  6. Validate end-to-end flows: inbox load, message view with AI summary, compose/send, attachments, and AI reply/classification actions. / 验证全链路收件箱、AI 摘要、写信发送、 附件、智能回复与分类。