首页/新闻资讯/正文详情

从源码构建你自己的 Tuta 邮件客户端:Web、Android 与桌面端完整构建指南

发布时间:2026/9/26 23:23:08 来源:云帆数科 栏目:资讯中心
从源码构建你自己的 Tuta 邮件客户端:Web、Android 与桌面端完整构建指南
协同办公密码学【免费下载链接】tutanotaTuta is an email service with a strong focus on security and privacy that lets you encrypt emails, contacts and calendar entries on all your devices.项目地址https://gitcode.com/gh_mirrors/tu/tutanota点击查看免费下载TutaTutanota是一套以端到端加密为核心的开源邮件、日历与通讯录解决方案。本文基于仓库根目录下的 doc/BUILDING.md 官方构建文档结合仓库内的实际构建脚本webapp.js、android.js、desktop.js 与 buildSrc 目录下的构建工具链完整讲解如何从源码自行构建Web 网页客户端、Android APK 与桌面客户端三大平台产物。读完本文你将掌握各平台构建的前置条件、完整命令、签名参数、常见报错排查以及构建过程背后真实的源码级执行链路能够独立产出可本地运行的 Tuta 客户端。前提须知自行构建的客户端不会自动更新。如果你需要自动更新体验请使用官方托管的客户端Web 端为 app.tuta.comAndroid 端可选用 Google Play / F-Droid桌面端可从官方发布渠道获取。自建版本的维护责任完全在你自己。所有平台通用的准备步骤无论是构建 Web、Android 还是桌面客户端前三步都是一样的拉取代码、切到对应发布标签、同步子模块。前置条件构建工具链横跨 TypeScript / Rust / C / C 多种语言官方要求以下工具齐全工具要求说明Git较新的版本用于克隆仓库与同步子模块Node.js版本以 package.json 的engines字段为准当前仓库要求node 24.17.0、npm 10.0.0Emscripten3.1.59用于把 C 代码编译为 WASMWASM2JS随 binaryen 附带有时随 emscripten 一起提供用于把 WASM 转换/回退为 JSCargo Rust1.80 及以上用于构建 Rust 编写的原生加密组件与 mimimi SDK仓库根目录的 package.json 明确声明了 Node 与 npm 的最低版本构建前请先执行node --version与npm --version确认环境达标。克隆、切标签与子模块初始化构建的起点始终是仓库根目录并按目标平台切换到对应的发布标签# 1. 克隆仓库本项目为 GitHub 加速镜像可直接克隆 git clone https://gitcode.com/gh_mirrors/tu/tutanota.git # 2. 进入仓库目录 cd tutanota # 3. 切到目标发布标签Web 与桌面用 web 标签Android 用 android 标签 # Web/桌面git checkout tutanota-release-xxx # Android git checkout tutanota-android-release-xxx # 4. 初始化 liboqs 与 argon2 两个子模块 git submodule init # 5. 同步递归子模块 git submodule sync --recursive # 6. 拉取子模块内容 git submodule update # 7. 安装依赖使用 lockfile 精确锁定版本 npm ci为什么子模块如此关键Tuta 的端到端加密与 PoW工作量证明依赖两个 WASM 模块liboqs量子安全 KEM 加密原语见 libs/webassembly/Makefile_liboqs和argon2密钥派生见 libs/webassembly/Makefile_argon2。它们的源码以 Git 子模块形式挂在libs/webassembly/下。跳过git submodule init/sync/update构建 Web 端时会在加载KyberFacade时直接失败详见下文常见错误。构建 Web 网页客户端构建命令# 8. 构建 Web 部分默认产出 release 版本 node webapp prod # 9. 进入构建产物目录 cd build # 10. 用任意静态服务器托管二选一即可 npx serve build -s -p 9000 # 或 python -m SimpleHTTPServer 9000然后在浏览器打开localhost:9000即可使用。官方在 Firefox、Chrome/Chromium、Safari 上测试过。构建脚本背后发生了什么node webapp prod的入口是 webapp.js它用 commander 解析参数默认 stage 为prod随后调用 buildSrc/buildWebapp.js 中的buildWebapp()。整个生产构建按步骤依次执行清理构建目录清空build/mail 应用或build-calendar-app/calendar 应用、build-drive-app/drive 应用目录映射见 buildSrc/DevBuild.js 的buildDirForApp()打包 polyfill把 src/polyfill.js 打成 iife 格式的polyfill.js拷贝静态资源图片、favicon、PDF 模板、词库、braintree.html等构建 Rust 加密原语在 src/platform-kit/crypto 下执行node make构建 mimimi在 src/app-kit/mimimi 下执行node make --releaseRust 编写的原生桥接 SDKTypeScript 类型检查并产出声明构建 Argon2 与 liboqs 的 WASM先make clean再由 buildSrc/buildWasm.js 分别执行make -f Makefile_liboqs build与make -f Makefile_argon2 build把liboqs.wasm与argon2.wasm输出到构建目录Rollup 打包以 mail-app / calendar-app / drive-app 的入口与 worker 入口为 input配合 TypeScript 插件、terser 压缩minify为 true 时、manualChunks 手动分包产出[name]-[hash].js分块生成 worker-bootstrap 与 Service Worker写入worker-bootstrap.js并生成带版本号、文件缓存清单的sw.js。其中第 7 步对应的 Makefile 值得展开liboqs 通过emcc编译-s TOTAL_MEMORY48MB控制 WASM 内存上限如遇内存溢出且非泄漏导致可调大该值并导出_OQS_KEM_new、_OQS_KEM_keypair、_TUTA_KEM_encaps、_TUTA_KEM_decaps等函数argon2 则只导出_argon2id_hash_raw等少量符号libs/webassembly/Makefile_liboqs、libs/webassembly/Makefile_argon2。这两个 WASM 最终由应用层的加密门面如src/applications/common/api/worker/facades/KyberFacade.ts动态加载使用。webapp的 stage 与可选参数webapp.js 支持多个 stage 与选项生产构建之外的用法包括参数含义test连接测试服务器https://app.test.tuta.comprod连接生产服务器https://app.tuta.com默认local连接http://hostname:9000本地服务host url指定任意后端地址release构建不绑定具体后端的发布版本--app app构建哪个应用mail默认/calendar/drive--disable-minify关闭压缩混淆--out-dir outDir指定产物输出目录--mobile-build标记本次构建面向移动 App后端地址映射的具体实现见 buildSrc/buildWebapp.js 的restUrl选择逻辑。常见错误liboqs.wasm 加载失败如果跳过子模块初始化直接构建会看到如下报错Build error: Error: Could not load wasm-loader:liboqs.wasm (imported by src/applications/common/api/worker/facades/KyberFacade.ts): Command failed: make -f Makefile_liboqs build liboqs/src/kem/kem.c:12:10: fatal error: oqs/oqs.h file not found根因是libs/webassembly/liboqs子模块未初始化导致oqs/oqs.h头文件缺失。官方给出的修复办法是删除libs/webassembly/include目录后重新构建该目录是构建过程的中间产物Makefile 的clean目标会一并清理见 libs/webassembly/Makefile_liboqs。构建 Android 客户端前置条件在通用前置条件之上Android 构建还要求较新版本的Android SDK构建工具链可运行 Gradle推荐直接使用 Android Studio或任何能跑 Gradle 的环境。HACKING 文档还提到 NDK版本如 28.2.13676358用于原生加密库。构建步骤# 8. 生成签名用的 keystore若已存在可跳过 keytool -genkey -noprompt -keystore MyKeystore.jks -alias tutaKey \ -keyalg RSA -keysize 2048 -validity 10000 -deststoretype pkcs12 \ -storepass CHANGEME -keypass CHANGEME -dname CNcom.example # 9. 传入签名环境变量并执行构建 APK_SIGN_ALIAStutaKey \ APK_SIGN_STOREMyKeystore.jks \ APK_SIGN_STORE_PASSCHANGEME \ APK_SIGN_KEY_PASSCHANGEME \ node android # 10. 安装到设备APK 路径由构建脚本打印 adb install -r path-to-apk签名环境变量说明android.js 头部注释明确列出了构建脚本要求的全部签名参数。注意keystore 中的密码、别名与上一条keytool命令必须一致否则 Gradle 签名阶段会失败环境变量作用APK_SIGN_ALIASkeystore 中的密钥别名上例为tutaKeyAPK_SIGN_STOREkeystore 文件路径上例为MyKeystore.jksAPK_SIGN_STORE_PASSkeystore 存储密码APK_SIGN_KEY_PASS密钥密码ANDROID_HOMEAndroid SDK 路径未显式设置时脚本依赖该环境变量定位 SDK构建脚本的进阶选项android.js 还提供了以下参数方便定制构建参数说明-a, --app type构建应用mail默认/calendar/drive-b, --buildtype typeGradle 构建类型debug配合 Android Studio 调试、release默认、releaseTest与 release 相同的代码但不同 appId可并排安装-i, --install构建后自动执行adb install部署到设备/模拟器-w, --webclient client选择 Web 客户端构建方式make更快、更易调试或dist生产形态默认-e, --existing复用已有的 Web 客户端产物跳过耗时的 Web 构建开发 Kotlin 代码时常用构建流程与产物位置node android的执行链路android.js是先构建 Web 客户端make走开发构建、dist走 buildWebapp 生产构建→ 调用 buildSrc/prepareMobileBuild.js 清理移动端不需要的产物删除 WASM 目录、source map 与 index.html因为移动端使用原生加密桥接而非浏览器 WASM→ 切换到app-android/目录执行./gradlew :module:assembleTutaoBuildType。APK 产物最终会统一拷贝到artifacts/app-android/目录mail 对应 Gradle 模块appcalendar 对应calendardrive 对应drive见 android.js。脚本结束时打印的路径即为adb install -r所需的path-to-apk。若构建 calendar / drive则分别执行node android -a calendar/node android -a drive。构建桌面客户端前置条件与准备桌面构建在通用前置条件之外无特殊要求Node.js 版本仍以 package.json 的engines为准但要注意自建桌面客户端不会自动更新。# 0. 打开终端 # 1-7. 与通用步骤完全一致克隆 → cd → 切 tutanota-release-xxx 标签 → 子模块初始化/同步/更新 → npm ci构建命令node desktop --custom-desktop-release该命令的关键参数是--custom-desktop-release。从 desktop.js 的选项注释可以看到手动从源码构建桌面客户端时必须加上它否则构建脚本会尝试接入官方自动更新通道updateUrl指向官方服务且默认开启 notarize 公证。加上该参数后desktop.js 会把平台强制设为当前系统平台并关闭自动更新配置updateUrl置空、notarize关闭只保留有新版发布时提示的能力。构建完成后当前平台的客户端位于artifacts/desktop/。免安装运行--unpacked在构建命令后追加--unpacked可以跳过安装包打包node desktop --custom-desktop-release --unpacked这会直接在build/desktop/下生成一个无需安装即可运行的客户端目录对应 desktop.js 中-u,--unpacked选项。其余可用选项还包括-p, --platform linux|win|mac、-a, --architecture x64|arm_64|universal、-e, --existing复用build/下已有的 Web 产物与-o, --out-dir平台与架构组合会在 buildSrc/buildUtils.js 的checkArchitectureIsSupported()中校验。关于 Windows 的 MAPI 原生依赖Windows 版客户端依赖一个原生模块来启用MAPI 支持Outlook 集成其源码位于独立的mapirs项目。有两种方式满足该依赖自行编译并放在特定目录结构下构建器会自动拾取父目录 ├── mapirs └── tutanota-3否则构建器会自动从mapirs项目的 Releases 页面拉取当前最新发布版本。调试版本与进阶开发本文介绍的命令产出的是release 版本。如果你需要调试版本未压缩、带 source map、可配合断点调试请参阅 doc/HACKING.md其中覆盖了项目目录结构src/、app-android/、app-ios/、libs/、test/的职责划分开发构建命令node make与node make prodWeb / Android / iOS 三端调试构建流程、测试命令npm test、node test -f name、浏览器内测试等代码分块chunking规则并可通过node webapp local校验导入是否违反分块约束。常见问题速查问题解决方案oqs/oqs.h file not found子模块未初始化删除libs/webassembly/include后重新执行git submodule init/sync/update再构建WASM 内存不足liboqs/argon2增大 Makefile 中的TOTAL_MEMORY默认 48MB见 libs/webassembly/Makefile_liboqs自建客户端不更新属预期行为需要自动更新请使用官方客户端Android 签名失败核对APK_SIGN_ALIAS/APK_SIGN_STORE/APK_SIGN_STORE_PASS/APK_SIGN_KEY_PASS与 keytool 生成时是否一致只想改 Kotlin 代码不想重编 WebAndroid 构建加-e, --existing复用已有 Web 产物总结从零构建 Tuta 客户端的完整链路可以概括为初始化子模块liboqs argon2→npm ci→ 按平台调用构建脚本。Web 端执行node webapp prod后由 buildSrc/buildWebapp.js 完成 polyfill、Rust 原生库、WASM 加密模块与 Rollup 分包的全流程Android 端执行node android需先备好 keystore 与四个APK_SIGN_*环境变量最终产物落在artifacts/app-android/桌面端执行node desktop --custom-desktop-release产物落在artifacts/desktop/需要免安装运行可追加--unpacked。牢记自建客户端不会自动更新生产使用请认准官方渠道。赞分享协同办公密码学【免费下载链接】tutanotaTuta is an email service with a strong focus on security and privacy that lets you encrypt emails, contacts and calendar entries on all your devices.项目地址https://gitcode.com/gh_mirrors/tu/tutanota点击查看免费下载相关推荐如何从源码构建Tuta Mail客户端Web/Android/桌面版全指南如何从源码构建Tuta Mail客户端Web/Android/桌面版全指南 前言 Tuta Mail原名Tutanota是一款注重隐私安全的开源电子邮件服协同办公密码学Tutanota开发者指南如何从源码构建自己的邮件客户端Tutanota开发者指南如何从源码构建自己的邮件客户端 Tutanota是一款专注于安全隐私的端到端加密邮件服务让你在所有设备上都能加密邮件、联系人及日历协同办公密码学WebUI多客户端支持构建Web应用和桌面软件的完整指南WebUI多客户端支持构建Web应用和桌面软件的完整指南 WebUI是一款轻量级跨平台框架它允许开发者使用任何Web浏览器作为GUI界面后端采用自己偏好的创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

宇道ruoyi-vue-pro数据库工程实践:SQL初始化、多库适配与安全加固
宇道ruoyi-vue-pro数据库工程实践:SQL初始化、多库适配与安全加固

简介:本资源是面向Java全栈开发者与企业级系统运维人员的「芋道ruoyi-vue-pro最新最全SQL脚本集」,聚焦Spring BootVue前后端分离架构下的数据库初始化、模块化建库建表及业务数据支撑,解决项目快速部署、多模块(BPM、CRM、Mall、… · 2026/9/26 23:23:08

7B专用事实核查器击败30B通用评审员:RAG知识库防误删实战
7B专用事实核查器击败30B通用评审员:RAG知识库防误删实战

你有没有遇到过这种情况:系统明明从知识库里检索到了正确答案,生成了一段有理有据的回复,却被审核环节判成“事实错误”,还反过来被改写成一句正确但毫无价值的废话。我遇到过,而且不止一次。我们团队原本在生产环境用… · 2026/9/26 23:23:02

自托管 LLM 实战:从硬件选型到软件开发流程接入
自托管 LLM 实战:从硬件选型到软件开发流程接入

过去大半年,我几乎每周都会被朋友问到同一个问题:你们做软件开发辅助的那套 LLM,到底跑在哪?问的人多数已经在用 ChatGPT 或各类代码助手的订阅版,但一听到我们把十几个模型部署在自己服务器上,第一反应都是… · 2026/9/26 23:23:02

Cortex 集群架构与工作负载部署指南:EKS、专用 VPC、双负载均衡器与四类 ML 工作负载全解析
Cortex 集群架构与工作负载部署指南:EKS、专用 VPC、双负载均衡器与四类 ML 工作负载全解析

后端云原生模型推理服务MLOps人工智能 【免费下载链接】cortex Production infrastructure for machine learning at scale 项目地址: https://gitcode.com/gh_mirrors/co/cortex 点击查看 免费下载 Cortex 是一个面向大规模机器学习场景的生产级基础设施平台&… · 2026/9/27 1:46:36

江苏建设准考证打印在哪个网站避坑指南
江苏建设准考证打印在哪个网站避坑指南

江苏建设准考证打印在哪个网站避坑指南 不会代码想做网站,最怕被坑。很多老板想做个企业站或报名辅助工具,结果被外包忽悠,要么功能缺失,要么后期维护天价。今天聊点实在的,关于【江苏建设准考证打印在哪个网站】这类高频搜索词背后的技术实现与避坑逻辑… · 2026/9/27 1:46:36

拼多多爬虫全攻略:anti-content 参数逆向与工程化采集实践
拼多多爬虫全攻略:anti-content 参数逆向与工程化采集实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:46:30

YOLOv11在地平线RDK-X5上的边缘部署实战
YOLOv11在地平线RDK-X5上的边缘部署实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:46:30

个人网址资源管理指南:从收藏夹到高效知识入口
个人网址资源管理指南:从收藏夹到高效知识入口

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:46:30

工业控制器分级存储设计:STM32+FPGA协同架构实战
工业控制器分级存储设计:STM32+FPGA协同架构实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:46:23

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码