TEMPO Mail 是面向 Stalwart 自托管服务的 iOS 邮件客户端与移动管理端。
- TypeScript/React Native:账户流程、邮件内容、管理页、设置和业务状态,可通过 EAS Update OTA 更新。
- iOS 原生界面:Expo Router Native Tabs、原生 Stack 搜索、
@expo/ui的 Menu/Button/Picker。iOS 26 由系统绘制 Liquid Glass。 runtimeVersion固定为独立的原生兼容版本(当前为native-2),不再绑定 App 版本号或 IPA build number。- 只有 Swift、权限、Expo 原生依赖或其他原生兼容面变化时才升级
runtimeVersion并重新发 IPA;纯 TypeScript 更新始终复用productionOTA 通道。
- 首次进入显示 TEMPO Mail 欢迎页,默认提供
@darker.one注册入口和邮箱登录,自定义 Stalwart/JMAP 服务作为次级入口。 - 默认邮箱服务、邮箱域名和注册地址分别由
EXPO_PUBLIC_DEFAULT_MAIL_SERVER、EXPO_PUBLIC_DEFAULT_MAIL_DOMAIN、EXPO_PUBLIC_REGISTRATION_URL配置;未开放公开注册时,客户端不会伪造可用入口。 - 欢迎页提供“不登录,预览界面”,只读取本地示例数据,不保存凭据也不触发网络权限。
- 顶部账户按钮展开原生小窗,列出已登录账户和“添加账户”。
- 普通邮箱显示收件箱、设置和独立搜索入口。
- 拥有
sysAccountGet与sysAccountQuery的邮箱额外显示“概览”底部导航;原网页端的账户、域名、投递、日志、安全与服务器配置统一进入“设置”。 - 管理页面从服务器
/api/schema读取当前版本的对象、表单、列表和权限,不在客户端写死一套容易过期的控制台。 - 管理权限来自服务器,客户端不会伪造管理员身份。
协议、列表、缓存、状态和内容组件优先使用维护中的 GitHub 开源项目,详见 OPEN_SOURCE.md。TEMPO 自己只实现 Stalwart 管理扩展适配与产品编排。
npm ci
npm run typecheck
npx expo prebuild --platform ios --cleanBuild native iOS runtime:仅在原生兼容面发生变化时生成当前兼容版本的无签名 IPA,供你使用自己的证书重签。Publish TypeScript OTA:TypeScript 路由或src/**变化时先类型检查,再发布到production通道。- OTA 发布需要仓库 Secrets:
EXPO_TOKEN与EXPO_PROJECT_ID。未配置时工作流仍会完成类型检查并明确跳过发布。
无签名 IPA 不能直接安装;必须用包含当前设备 UDID 的有效描述文件和对应证书完整重签整个 App bundle。