| Files | Last commit | Last update |
|---|---|---|
feat(mail): 邮件列表显示入站安全校验徽标 列表每封邮件的主题行首加一个圆形徽标,四档: 已验证 ✓ / 存疑 ! / 未通过 ✕ / 未验证 ? 悬停用原生 tooltip 显示原因,如「SPF 通过 · DKIM 通过 · DMARC 未通过」。 结论来自收件服务器写在 Authentication-Results 头里的判断(微软、谷歌在收信 那一刻做的),本程序自己不做验证——SPF 的输入是发信 IP,客户端拿不到这个 信息,只有接收方能在 SMTP 会话里看到。 为什么必须先解析:原始头最长 2000 字符,50 封就是 100KB,不能跟着列表一起 返回。所以同步时就解析成 AuthVerdict(枚举)+ AuthSummary(中文摘要), 列表只返回这两个小字段。 取值规则(AuthResultsParser): - 只认 spf / dkim / dmarc。compauth= 等各家私有字段没有公开语义,跳过—— 微软那类代发邮件 compauth=fail 但三项全过,照样是已验证 - 一封信常有多个 DKIM 签名,任意一个通过即算通过,全部 fail 才算失败 - 明确 fail 优先;其次 DMARC 通过(它要求 SPF 或 DKIM 至少一项对齐); 再次 softfail / neutral / policy 归存疑;temperror / permerror 归未验证 - 拿不准一律归未验证。宁可少给结论,也不给错误的安全感 SPF 软失败但 DKIM+DMARC 通过时算已验证:这是代发的正常形态,发送平台用 自己的 IP 发信,SPF 本就对不上,业界也照常投递。软失败这一细节仍留在摘要 里,悬停可见。没有 DMARC 兜底时才算存疑。 历史邮件必须补算:同步只处理新邮件,不补算的话升级前那些邮件的徽标会永远 停在「未验证」,看上去像功能没生效。启动时在后台分批补算,筛选条件是 AuthSummary 为空,补完自然收敛,重启也能接着上次的进度继续。 生成迁移时踩的坑,记在这里:ef 工具不读 appsettings 的 Database:Provider, 默认按 Sqlite 生成。第一次产出 126 个 AlterColumn,把 varchar(64) 改成 TEXT、tinyint(1) 改成 INTEGER,应用到生产 MySQL 库就是灾难。最后用一个 独立的临时启动项目给 ef 提供钉住 MySql 的工厂才得到正确结果(只有 2 个 AddColumn)。以后再生成迁移要沿用这个办法。 验证: - 解析器按真实格式跑 16 组:微软(两重 DKIM)、谷歌、SPF+DMARC 失败、 DKIM 签名验证失败、软失败(有/无 DMARC)、各项均为 none、头不存在、 空串、无法识别的内容、compauth=fail、两重 DKIM 一过一败、只有一项通过、 临时/永久错误,全部相符 - 端到端:起实库,插入 4 封「结论字段留空」的邮件模拟升级前的历史数据, 启动后由后台补算,列表接口返回的三档结论与摘要全部正确 - app.js 过 node --check,编译无错。浏览器里的徽标观感未验证 | 23 days ago | |
feat: 单用户多账号 Web 邮件客户端初始实现 后端 .NET 10 + ASP.NET Core Minimal API,前端零依赖原生 JS。 - 邮件:MailKit/MimeKit 实现 IMAP 定时拉取与 SMTP 发送。 遵循「用完即断」:同步时临时建连、拉完即断,不使用 IDLE、不做连接池; 按 LastUid 增量同步,UIDVALIDITY 变化时重置基线,插入前查 (FolderId, Uid) 保证幂等。 - 数据:SQLite + EF Core。模型层严格 Provider 无关(禁用 HasColumnType、 索引列一律限长),运行时按 Database:Provider 切换;因迁移产物绑定方言, 切换需通过 tools/switch-db.sh 重新生成。 - 安全:凭据经 Data Protection 加密落库,正文经 HtmlSanitizer 消毒, 远程图片降级为 data-src 默认不加载,附件强制 attachment 下载, 入站安全结论直接读 Authentication-Results 头。 - 通讯录:收发件人自动沉淀 + 手动增删改。 | 1 month ago | |
feat: 单用户多账号 Web 邮件客户端初始实现 后端 .NET 10 + ASP.NET Core Minimal API,前端零依赖原生 JS。 - 邮件:MailKit/MimeKit 实现 IMAP 定时拉取与 SMTP 发送。 遵循「用完即断」:同步时临时建连、拉完即断,不使用 IDLE、不做连接池; 按 LastUid 增量同步,UIDVALIDITY 变化时重置基线,插入前查 (FolderId, Uid) 保证幂等。 - 数据:SQLite + EF Core。模型层严格 Provider 无关(禁用 HasColumnType、 索引列一律限长),运行时按 Database:Provider 切换;因迁移产物绑定方言, 切换需通过 tools/switch-db.sh 重新生成。 - 安全:凭据经 Data Protection 加密落库,正文经 HtmlSanitizer 消毒, 远程图片降级为 data-src 默认不加载,附件强制 attachment 下载, 入站安全结论直接读 Authentication-Results 头。 - 通讯录:收发件人自动沉淀 + 手动增删改。 | 1 month ago |
| Files | Last commit | Last update |
|---|---|---|
| 23 days ago | ||
| 1 month ago | ||
| 1 month ago |