Commit Graph

107 Commits

Author SHA1 Message Date
LanQin_ d28ed4adcc feat(admin): 增加 Maildir 同步健康状态
- 新增后端健康检查接口与同步追踪,记录运行状态、最近结果、错误摘要和统计信息。
- 前端管理页在存储设置中展示 Maildir 同步健康卡片,并支持手动刷新。
- 补充相关类型定义与测试,覆盖未配置和同步成功两类场景。
2026-06-24 16:08:48 +08:00
LanQin_ b36adfdac2 fix(maildir): 同步 IMAP 移动、标记与删除状态
- 让 maildir 同步在消息移动到其他文件夹时更新 `folder_id` 和 `raw_path`。
- 根据文件名中的 maildir 标记同步已读、星标状态。
- 增加缺失消息清理,避免数据库残留已被删除的 maildir 邮件。
- 补充回归测试覆盖移动、重复副本、标记更新和删除场景。
2026-06-24 15:46:17 +08:00
LanQin_ 632a8a4896 fix(maildir): 同步邮件已读状态到 maildir 标记
- 读取邮件时同步更新 maildir 的 `S` 标记,避免数据库已读状态与文件名不同步。
- 写入邮件到 `maildir` 时保留已有非托管标记,并确保已读/星标标记正确拼接。
- 补充测试,校验已发送邮件和草稿的原始路径包含已读标记。
2026-06-24 15:33:56 +08:00
LanQin_ f8d058f7e4 fix(maildir): 同步消息标记到 Maildir
- 标记已读、加星时同步重写 `raw_path`,保持数据库与文件系统状态一致。
- 新增 Maildir 标记路径计算与迁移逻辑,支持读/星标变化后调整目录和文件名。
- 补充测试覆盖已读、未读、加星场景的 Maildir 路径变化。
2026-06-24 15:27:30 +08:00
LanQin_ 1788d49a59 feat(maildir): 支持邮件写入与同步联动
- 为已发送邮件、草稿、收件与规则移动增加 maildir 文件写入、重写和删除流程。
- 补充 SQLite 仅有消息的回填逻辑,并在同步时补齐现有 raw_path。
- 调整 Dovecot 共享邮箱行为为订阅方式,避免重复创建文件夹。
- 新增覆盖发送、草稿、移动、删除和回填场景的测试。
2026-06-24 15:18:06 +08:00
LanQin_ adcc822c9a fix(mail): 优化邮件 HTML 与样式保留
Docker Release / Check web and api (push) Waiting to run
Docker Release / Resolve release tag (push) Blocked by required conditions
Docker Release / Build and publish all-in-one (push) Blocked by required conditions
Docker Release / Build and publish api (push) Blocked by required conditions
Docker Release / Build and publish web (push) Blocked by required conditions
Docker Release / Build and publish dovecot (push) Blocked by required conditions
Docker Release / Build and publish postfix (push) Blocked by required conditions
Docker Release / Build and publish rspamd (push) Blocked by required conditions
Docker Release / Create GitHub release (push) Blocked by required conditions
- 支持整页邮件文档的清洗与渲染,保留 `<html>`、`<head>`、`<body>` 和 `<style>` 等结构。
- 提取并校验安全的邮件样式块,阻止包含外链、脚本式内容的 CSS。
- 补充 `dompurify` 类型声明以支持 `WHOLE_DOCUMENT` 配置。
v0.1.4
2026-06-24 14:19:31 +08:00
LanQin_ 18db36d937 feat(mail): 优化邮件正文渲染与样式保留
- 邮件正文改为在 `iframe` 中渲染,提升排版隔离和显示稳定性。
- 扩展前端清洗配置,保留邮件常见布局样式与表格属性。
- 收紧后端 HTML 策略的样式白名单,兼顾邮件样式保留与安全过滤。
- 补充测试,验证邮件布局样式可保留且危险内容仍会被拦截。
2026-06-24 13:55:09 +08:00
LanQin_ 295a34881d Merge pull request #5 from LanQin996/feature/lanqin-submission
Feature/lanqin submission
2026-06-24 13:37:09 +08:00
LanQin_ 65e4c4f6b5 fix(send_queue): 修复已投递标记恢复逻辑
- 新增投递标记文件持久化,避免重启后重复发送已投递的队列项。
- 在恢复卡住的发送任务时,识别已存在的投递标记并直接修复数据库状态。
- 同步补充回归测试,覆盖陈旧投递标记不应触发重发的场景。
2026-06-24 13:35:37 +08:00
LanQin_ d3bee62acd refactor(submission): 重构发件入库的去重流程。
- 将发件消息插入与附件保存改为事务内执行,避免去重键存在但消息缺失时产生脏数据。
- 抽出可注入的数据库执行器,便于在同一事务中复用消息与附件写入逻辑。
- 补充异常场景测试,覆盖“去重键存在但未命中消息”的失败行为。
2026-06-24 13:26:53 +08:00
LanQin_ d1876691dd fix(submission): 调整 SMTP 提交与发件授权逻辑。
- 启用 SMTP submission 时改为强制使用可读证书文件,并禁止使用容器自带测试证书。
- 收紧发件人校验,拒绝未授权的 From 地址,并支持别名多目标授权。
- 优化发送队列重入与重复消息处理,避免重复记录冲突。
- 让提交证书按需热加载,并稳定 MIME 头序列化顺序。
- 更新部署示例与文档,明确 submission 的证书配置要求。
2026-06-24 13:10:24 +08:00
LanQin_ 2476fe0c19 fix(send_queue): 修复重复消息 ID 的失败重排并清理 MIME
- 投递成功后清空 `mime_base64`,避免已投递队列项保留原始 MIME。
- 当同一 `message_id` 的旧队列项已达到最大失败次数时,允许复用并重新入队。
- 补充测试覆盖已投递项清理与终态失败重排场景。
2026-06-24 11:33:40 +08:00
LanQin_ 7b0717412c feat(app): 引入发送队列与可授权发件人
- Webmail/API 与第三方提交统一先写入已发送,再入发送队列异步投递。
- 新增队列重试、失败审计、陈旧任务恢复与发送状态追踪。
- 支持本人邮箱、启用别名和 `send_as_grants` 显式授权的 send-as。
- 更新 README 与部署文档,说明新的外发流程和排障方式。
2026-06-24 11:27:32 +08:00
LanQin_ 5c9bea075a chore(deploy): 优化 split stack 的 SMTP 配置
- 为 `docker-compose.stack.yml` 的 API 容器默认注入 `LANQIN_SMTP_HOST/PORT`,避免 Webmail 发信配置漂移。
- 补充 `.env.example` 和 `README`,说明 split stack 默认走 `postfix`,以及外部 SMTP 的覆盖方式。
- 新增 `sent_message_dedupe_keys` 表和相关读写逻辑,确保已发送消息去重可回收,并补充对应测试。
2026-06-24 11:03:01 +08:00
LanQin_ fa450c9f9b feat(mail): 支持 SMTP Submission 由 API 接管
- 新增 `465/587` 提交服务与 TLS 配置,支持 StartTLS 和隐式 TLS。
- 提交时校验认证邮箱、权限和 `From` 一致性,先写入 `Sent` 再转发到后端 SMTP。
- 增加 `Message-ID` 去重与失败回滚,避免重复保存发送副本。
- 调整部署与文档,移除 Postfix 的 submission 监听,改由 LanQin API 对外提供提交端口。
2026-06-24 10:47:16 +08:00
LanQin_ f2457c63ee refactor(mail): 统一邮件认证策略请求与返回格式。
- 将 `auth-policy` 调整为读取 `login`、`remote` 等字段,并返回数值型 `status`。
- 支持按邮箱定位用户与邮箱箱体,补充 IMAP/POP3 认证策略校验。
- 更新 Dovecot 与 Postfix 配置,移除原有的发件人 BCC 依赖。
- 补充相关测试并同步部署说明。
2026-06-23 21:52:05 +08:00
LanQin_ 8d434b9ca8 chore(app): 修正 maildir 目录配置读取
Docker Release / Check web and api (push) Waiting to run
Docker Release / Resolve release tag (push) Blocked by required conditions
Docker Release / Build and publish all-in-one (push) Blocked by required conditions
Docker Release / Build and publish api (push) Blocked by required conditions
Docker Release / Build and publish web (push) Blocked by required conditions
Docker Release / Build and publish dovecot (push) Blocked by required conditions
Docker Release / Build and publish postfix (push) Blocked by required conditions
Docker Release / Build and publish rspamd (push) Blocked by required conditions
Docker Release / Create GitHub release (push) Blocked by required conditions
- 启动 maildir worker 时改为读取 `a.cfg.MaildirRoot`,避免使用未确认的入参值。
v0.1.3
2026-06-23 15:32:12 +08:00
LanQin_ ce9d705df0 chore(deploy): 统一初始化 Dovecot 认证策略随机数
- 在部署入口脚本中生成并持久化 `auth_policy_hash_nonce`,避免每次启动变更。
- 同步更新 Dovecot 配置项为 `auth_policy_request_attributes`,并注入随机数值。
2026-06-23 15:07:15 +08:00
LanQin_ b309368225 feat(admin): 增加版本更新检查
- 在关于页检查 GitHub 最新发布版本。
- 发现新版本时提示并提供跳转查看链接。
2026-06-23 14:07:20 +08:00
LanQin_ 1373479973 chore(dovecot): 优化邮箱别名与默认文件夹创建
- 添加 `recipient_delimiter = +` 以支持加号别名。
- 为 Drafts、Sent、Trash、Archive、Spam 配置自动创建。
2026-06-23 11:32:14 +08:00
LanQin_ 23b04bd343 feat(mail): 增强邮件限流与配额配置
- 新增 IMAP/POP3 事件表与清理任务,并接入 Dovecot auth policy。
- 暴露默认权限限额接口,前端权限组页面改为动态读取。
- 为 Dovecot 配置用户配额、连接数限制和 auth policy。
2026-06-23 11:25:38 +08:00
LanQin_ 36b4c4c60f feat(权限组): 增加账号配额与邮件发送限制
- 为权限组与用户新增配额字段,支持附件大小、SMTP/IMAP/POP3 频率限制。
- 后端补充权限组配额校验、迁移与 SMTP 发送限流,邮件发送/定时发送时统一生效。
- 前端在管理页、邮件撰写页和个人资料页展示并编辑配额信息。
2026-06-23 11:09:36 +08:00
LanQin_ 34d35e8f04 Merge pull request #4 from killerprojecte/main
Docker Release / Check web and api (push) Waiting to run
Docker Release / Resolve release tag (push) Blocked by required conditions
Docker Release / Build and publish all-in-one (push) Blocked by required conditions
Docker Release / Build and publish api (push) Blocked by required conditions
Docker Release / Build and publish web (push) Blocked by required conditions
Docker Release / Build and publish dovecot (push) Blocked by required conditions
Docker Release / Build and publish postfix (push) Blocked by required conditions
Docker Release / Build and publish rspamd (push) Blocked by required conditions
Docker Release / Create GitHub release (push) Blocked by required conditions
fix: delete label without mailboxId caused 404 error on non-default mailbox
v0.1.2
2026-06-22 21:11:23 +08:00
killerprojecte 2d7625a751 Merge branch 'main' of https://github.com/killerprojecte/LanQin-Email 2026-06-22 21:08:33 +08:00
killerprojecte 3eebc1c358 fix: delete label without mailboxId caused 404 error on non-default mailbox 2026-06-22 21:08:11 +08:00
LanQin b320fee622 docs(README): 重写项目说明与部署文档
- 更新技术栈徽标与项目简介,补充 TypeScript、Dovecot 等信息。
- 重构功能特性、目录结构、环境要求、快速开始和首次部署清单。
- 补充关键环境变量、架构说明、邮件流转、开发验证与生产注意事项。
2026-06-22 20:50:06 +08:00
LanQin_ 67ced8b3f8 Merge pull request #3 from killerprojecte/main
feat: better tag system & fix layout problem when width under 640px
2026-06-22 20:32:10 +08:00
AnserJim 0b4b4441c0 chore: use activeMailboxId instead of selectedMailboxId
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-06-22 20:23:20 +08:00
killerprojecte c8dff253cc chore: optimize code 2026-06-22 20:20:44 +08:00
killerprojecte 77187e76ce fix: wrong code syntax 2026-06-22 20:12:56 +08:00
killerprojecte 84cc47e3cf chore: revert some wrong changes 2026-06-22 20:04:11 +08:00
killerprojecte 8d29dbd126 chore: improve label status handling 2026-06-22 20:04:11 +08:00
killerprojecte 94ab94eceb chore: improve label error handling 2026-06-22 20:04:10 +08:00
killerprojecte 74f456ef7d chore: improve tag delete 2026-06-22 20:04:10 +08:00
killerprojecte 7720b6b404 feat: better tag system & fix layout problem when width under 640px 2026-06-22 20:04:09 +08:00
LanQin_ 0b982a5ff4 feat(mail): 重构邮箱权限体系并细化前台能力控制
- 新增邮箱前台权限与默认普通用户权限迁移,拆分读信、发信、草稿、定时、整理、标签、附件、联系人等能力。
- 收紧后端路由与处理逻辑,按权限限制邮箱前台、个人中心和定时发送相关接口。
- 前端根据权限动态隐藏或禁用邮件、个人中心中的对应功能入口与操作。
- 补充权限迁移与访问控制测试,覆盖普通用户邮箱前台、发信和定时发送的权限校验。
2026-06-22 15:54:15 +08:00
LanQin_ 5571dcc511 fix(app): 清理旧版系统权限组
- 将旧版默认权限组 ID 纳入清理列表,确保初始化时自动删除遗留数据。
- 补充测试验证旧版权限组会在默认权限组修复流程中被移除。
2026-06-22 15:02:25 +08:00
LanQin_ acdf298811 fix(permission): 调整默认权限组与用户权限继承
- 将“普通用户”权限组纳入默认权限继承,创建和更新用户时自动合并其权限。
- 放宽“普通用户”系统组的可编辑性,但仍禁止删除;继续限制超级管理员组被修改。
- 更新管理端权限组操作状态,避免对不可删除或不可编辑项提供错误入口。
- 补充相关测试,覆盖默认权限组编辑、删除与用户权限继承场景。
2026-06-22 14:42:37 +08:00
LanQin_ 8cbcc22a74 refactor(permissions): 精简默认权限组初始化逻辑
- 将固定默认权限组收敛为基础组,并新增对历史默认权限组的清理流程。
- 兼容保留已被用户引用的旧权限组,避免误删现有授权关系。
- 更新测试以覆盖新权限组创建与旧权限组迁移场景。
2026-06-22 14:34:57 +08:00
LanQin_ 31435c1e97 feat(admin): 引入细粒度权限组管理
- 新增权限目录、系统权限组与用户权限组分配,后台路由改为按权限粒度控制。
- 支持创建、编辑、查看和删除自定义权限组,并为用户绑定权限组。
- 前端后台界面按权限动态展示菜单与操作项,补充用户/权限组相关类型与交互。
2026-06-22 14:31:10 +08:00
LanQin_ e35b0985ee ci(.github/workflows): 扩展 AI PR Review 触发方式
- 新增 `issue_comment` 和 `workflow_dispatch` 触发入口,支持通过评论或手动指定 PR 运行审查。
- 调整并发键与权限配置,兼容多事件场景并补充 `issues: write`。
- 收紧执行条件,仅在仓库内 PR、手动触发或授权评论指令下执行,并按事件类型动态注入 `PR_NUMBER` 与 `PR_HEAD_SHA`。
2026-06-22 14:12:48 +08:00
LanQin 002c097def ci(.github): 自动生成并发布 GitHub Release
- 新增 `.github/release.yml`,统一分类发布说明中的变更类型。
- 扩展 Docker 发布工作流,生成基于 tag 的发布说明并创建或更新 GitHub Release。
- 同步补充镜像列表、使用文档和回退逻辑,提升发布信息完整性。
2026-06-21 02:49:06 +08:00
LanQin e7e4f43691 ci(.github/workflows): 拆分 CI 与发布流程。
Docker Release / Check web and api (push) Waiting to run
Docker Release / Resolve release tag (push) Blocked by required conditions
Docker Release / Build and publish all-in-one (push) Blocked by required conditions
Docker Release / Build and publish api (push) Blocked by required conditions
Docker Release / Build and publish web (push) Blocked by required conditions
Docker Release / Build and publish dovecot (push) Blocked by required conditions
Docker Release / Build and publish postfix (push) Blocked by required conditions
Docker Release / Build and publish rspamd (push) Blocked by required conditions
- 新增独立的 CI 工作流,覆盖前端检查、构建和后端测试。
- 调整 Docker 工作流为仅负责标签发布与镜像构建。
- 同步优化管理页 Issues 图标颜色。
v0.1.1
2026-06-21 02:30:01 +08:00
LanQin c872ed559d feat(admin): 增加关于页与发布版本信息
- 在系统设置中新增“关于”标签页,提供版本、仓库、Issues、文档和开源协议入口。
- 通过 Docker 构建参数注入版本号与发布链接,并在前端展示当前发布版本。
- 调整 GitHub Actions 与镜像构建流程,仅在 tag 发布时构建并发布带版本标识的镜像。
2026-06-21 02:23:40 +08:00
LanQin 99fe3cc57c feat(mail): 重构邮件详情元信息展示
CI and Docker / Check web and api (push) Waiting to run
CI and Docker / Build and publish all-in-one (push) Blocked by required conditions
CI and Docker / Build and publish api (push) Blocked by required conditions
CI and Docker / Build and publish web (push) Blocked by required conditions
CI and Docker / Build and publish dovecot (push) Blocked by required conditions
CI and Docker / Build and publish postfix (push) Blocked by required conditions
CI and Docker / Build and publish rspamd (push) Blocked by required conditions
- 抽离 `MessageMetaPanel` 统一展示发件人、收件人、抄送、密送和时间信息。
- 补充地址解析与列表渲染,提升详情页信息完整度和可读性。
v0.1.0
2026-06-21 01:51:05 +08:00
LanQin 7e4599ae00 Merge branch 'main' of https://github.com/LanQin996/LanQin-Email 2026-06-21 01:04:17 +08:00
LanQin d586cc25b5 docs(README): 补充项目许可证说明。
- 新增 `LICENSE` 文件,声明为 MIT 许可证。
- 在 `README.md` 中加入 `License` 小节并链接到许可证文件。
2026-06-21 01:04:11 +08:00
LanQin_ 4b0e30e1d0 Merge pull request #2 from LanQin996/feat/mobile-responsive
feat(web): 优化移动端响应式体验
2026-06-21 00:19:43 +08:00
LanQin 936d3c4819 style(web): 统一移动端视口与编辑器样式
- 将邮件、个人中心与规则弹窗从 `100dvh` 调整为 `h-svh`,减少移动端视口抖动。
- 优化邮件正文编辑器的基础布局与滚动样式,提升输入区可用性。
- 移除 `protected-layout` 中切换路由时自动关闭移动侧栏的逻辑。
2026-06-21 00:02:30 +08:00
LanQin 41386363df ci(.github/workflows): 支持配置 AI 审查推理参数
- 为 AI PR 审查流程新增 `OPENAI_REASONING_EFFORT` 和 `OPENAI_REASONING_SUMMARY` 可选环境变量。
- 允许通过仓库变量调整推理强度与摘要输出。
2026-06-20 23:57:06 +08:00