技术 · 标准
遵循标准。列明缺口。
FOLD 使用的每一种协议都由 RFC 定义。本页列出衡量邮件客户端所依据的那些 RFC,并逐一说明代码目前的状态:已实现、部分实现、尚未实现或有意不实现,以及原因。
已于 2026-09-23 对照代码核实
- 已实现
- 58
- 已实现并投入使用。
- 部分实现
- 8
- 部分可用;备注说明是哪一部分。
- 尚未实现
- 10
- 尚未实现。
- 有意不实现
- 6
- 有意不实现;备注给出原因。
邮件格式
邮件如何构建、读取和显示。
| RFC | 标准 | 状态 | 在 FOLD 中 |
|---|---|---|---|
| RFC 5322 | Internet Message Format | 已实现 | 写入时严格;读取时容忍裸 LF 换行、8 位邮件头和各种日期格式变体。 |
| RFC 2045-2049 | MIME | 已实现 | FOLD 下载完整邮件,并在设备上构建 MIME 树。 |
| RFC 2047 | MIME Encoded-Words | 已实现 | 邮件头中的非 ASCII 文本,支持解码和编码。 |
| RFC 2231 | MIME Parameter Value and Encoded Word Extensions | 部分实现 | 可读取长文件名和非 ASCII 文件名;发送时 FOLD 尚不以这种形式写入。 |
| RFC 2183 | Content-Disposition | 已实现 | 区分内嵌与附件,并处理文件名。 |
| RFC 2387 | multipart/related | 已实现 | 带内嵌图像的邮件,可读可写。 |
| RFC 2392 | Content-ID and Message-ID URLs | 已实现 | 指向内嵌图像的 cid: 链接在邮件内部解析。 |
| RFC 6532 | Internationalized Email Headers | 已实现 | 始终读取 UTF-8 邮件头;FOLD 仅为国际化地址写入 UTF-8 邮件头,且仅在服务器提供 SMTPUTF8 或 UTF8=ACCEPT 时。自 2026-09-21 起 |
| RFC 3676 | The Text/Plain Format and DelSp Parameters | 尚未实现 | format=flowed 文本尚不会重新排版,FOLD 也不发送这种格式。 |
| RFC 2369 | List Commands in Header Fields | 已实现 | List-Unsubscribe 作为操作:FOLD 自行发送退订邮件请求,网页链接在浏览器中打开。 |
| RFC 2919 | List-Id | 已实现 | 识别邮件列表,使其常见的签名失效不会被显示为伪造。 |
| RFC 8058 | One-Click Unsubscribe | 尚未实现 | 能识别该邮件头,但 FOLD 不发送一键退订请求;退订通过邮件或网页进行。 |
| RFC 8098 | Message Disposition Notification | 部分实现 | FOLD 发送时可以请求已读回执,但自己有意从不发送回执。 |
读取与同步(IMAP)
FOLD 会询问服务器支持哪些功能,登录后再询问一次;每项扩展仅在服务器声明支持时才启用,否则退回更简单的方式。
| RFC | 标准 | 状态 | 在 FOLD 中 |
|---|---|---|---|
| RFC 3501 | IMAP4rev1 | 已实现 | 所有服务器都支持的基线,包括不回退到明文的 STARTTLS。 |
| RFC 9051 | IMAP4rev2 | 有意不实现 | 可识别,但未启用:目标范围内没有服务器要求它;FOLD 改用 rev1 的扩展。 |
| RFC 2177 | IDLE | 已实现 | FOLD 在每个账户的收件箱上保持 IDLE,每 25 分钟续期一次;其他文件夹通过轮询获取,在 iPhone 和 iPad 上仅在 App 打开时进行。 |
| RFC 4315 | UIDPLUS | 已实现 | UID EXPUNGE,确保 FOLD 只删除自己的邮件。 |
| RFC 6851 | MOVE | 已实现 | 以 COPY 加 EXPUNGE 作为回退;执行 MOVE 后,FOLD 会检查源文件夹中还留下了什么。 |
| RFC 7162 | CONDSTORE and QRESYNC | 已实现 | 增量同步,包括 VANISHED (EARLIER)。 |
| RFC 5161 | ENABLE | 已实现 | 只有服务器以 ENABLED 确认后,开关才算生效。 |
| RFC 6154 | SPECIAL-USE | 已实现 | 文件夹角色取自服务器的标记,常见名称仅作回退,缺失的文件夹会按其角色创建。 |
| RFC 9208 | QUOTA | 已实现 | 在 Mac 上显示邮箱用量。 |
| RFC 7888 | LITERAL+ and LITERAL- | 已实现 | 上传时减少往返次数。 |
| RFC 4959 | SASL-IR | 已实现 | 一次往返即可完成登录。 |
| RFC 5530 | IMAP Response Codes | 已实现 | 能区分密码错误和服务器暂时不可用。 |
| RFC 4731 | ESEARCH | 已实现 | 在 iPhone 和 iPad 上为服务器端搜索返回紧凑结果;不支持 ESEARCH 的服务器使用传统的 SEARCH。自 2026-09-21 起 |
| RFC 5258 | LIST-EXTENDED | 已实现 | 一条命令即可获取文件夹及其角色。自 2026-09-21 起 |
| RFC 5819 | LIST-STATUS | 已实现 | 在同一条 LIST 中获取文件夹计数,无需逐个选择文件夹。自 2026-09-21 起 |
| RFC 6855 | UTF8=ACCEPT | 已实现 | UTF-8 文件夹名和邮件头;文件夹名的编码在一处统一切换。自 2026-09-21 起 |
| RFC 2342 | NAMESPACE | 尚未实现 | 能识别服务器的这项能力声明,但从不发送该命令。 |
| RFC 2971 | ID | 尚未实现 | 部分 Yahoo 服务器要求在登录前发送 ID。 |
| RFC 4978 | COMPRESS=DEFLATE | 尚未实现 | 已推迟:它需要部分刷新(partial flush),而 Apple 的 Compression 框架不支持;计划直接使用 zlib。 |
| RFC 8474 | OBJECTID | 尚未实现 | 重命名后仍保持稳定的 ID;尚未使用。 |
| RFC 8970 | PREVIEW | 尚未实现 | 预览在设备上根据已加载的邮件生成。 |
| RFC 8508 | REPLACE | 尚未实现 | 草稿在撰写时保存在设备上,关闭撰写窗口时上传一次;服务器上较早的副本不会被替换。 |
| RFC 3516 | BINARY | 有意不实现 | 不需要:FOLD 自行解码 MIME 树。 |
| RFC 5256 | SORT and THREAD | 有意不实现 | FOLD 在本地根据 References 和 In-Reply-To 构建对话,在任何服务器上都一样。 |
| RFC 5465 | NOTIFY | 有意不实现 | 目标范围内几乎没有服务器提供它。 |
发送(SMTP)
FOLD 如何把邮件交给你的服务器。
| RFC | 标准 | 状态 | 在 FOLD 中 |
|---|---|---|---|
| RFC 5321 | Simple Mail Transfer Protocol | 已实现 | 包括正确的点填充(dot-stuffing)。 |
| RFC 6409 | Message Submission for Mail | 已实现 | 发送前始终先登录,使用 587 或 465 端口。 |
| RFC 4954 | SMTP Service Extension for Authentication | 已实现 | 支持带初始响应的登录,某种登录方式失败时干净地中止。 |
| RFC 1870 | SIZE | 已实现 | 服务器声明上限时会告知邮件大小,超出上限的邮件在上传前即被拒绝。 |
| RFC 2920 | PIPELINING | 已实现 | 发件人和收件人分组发送;所有信封应答返回后才发送 DATA,因此邮件要么发给全部收件人,要么一个也不发。自 2026-09-21 起 |
| RFC 6152 | 8BITMIME | 已实现 | 邮件含 8 位数据时予以声明;服务器不支持时,FOLD 不发送 8 位数据。自 2026-09-21 起 |
| RFC 6531 | SMTPUTF8 | 已实现 | 国际化地址和 UTF-8 邮件头;服务器不支持时,FOLD 会停止并给出清晰的提示。自 2026-09-21 起 |
| RFC 3463 | Enhanced Mail System Status Codes | 已实现 | 用通俗的语言解释拒收原因,而不是只给出服务器代码(配合 RFC 2034)。自 2026-09-21 起 |
| RFC 3461 | Delivery Status Notifications | 尚未实现 | 尚未实现按请求提供的投递报告。 |
| RFC 3030 | CHUNKING (BDAT) | 有意不实现 | 可识别,但不使用;DATA 足以应对所有情况。 |
| RFC 8689 | REQUIRETLS | 有意不实现 | 目前几乎没有服务器支持它。 |
连接与登录
连接加密、登录方式和自动设置。
| RFC | 标准 | 状态 | 在 FOLD 中 |
|---|---|---|---|
| RFC 8314 | Cleartext Considered Obsolete | 已实现 | FOLD 从不在没有 TLS 的情况下连接;当 DNS 两种方式都提供时,优先使用隐式 TLS。 |
| RFC 3207 | SMTP over TLS (STARTTLS) | 已实现 | 如果服务器不提供 STARTTLS,FOLD 会停止,而不是以明文发送。 |
| RFC 7817 | TLS Server Identity Check for Email | 已实现 | 证书链和主机名由系统对照所配置的服务器进行检查。 |
| RFC 4422 | SASL | 已实现 | 下列所有登录方式的框架。 |
| RFC 7677 | SCRAM-SHA-256 | 部分实现 | 发送(SMTP)时优先使用,并校验服务器签名;IMAP 登录仍使用 PLAIN。 |
| RFC 4616 | PLAIN | 已实现 | 仅在 TLS 内使用,绝不以明文传输(有意比 RFC 更严格)。 |
| RFC 6749 | OAuth 2.0 | 已实现 | 使用 Google 登录;IMAP 和 SMTP 使用 XOAUTH2,即各大服务商采用的方式。 |
| RFC 7636 | PKCE | 已实现 | 每次 OAuth 登录都使用,仅限 S256;App 中不含客户端密钥。 |
| RFC 8252 | OAuth 2.0 for Native Apps | 已实现 | 在系统浏览器中登录,绝不在嵌入式网页视图中登录。 |
| RFC 7628 | OAUTHBEARER | 尚未实现 | 目标范围内没有服务商要求它;XOAUTH2 已覆盖这些服务商。 |
| RFC 6186 | SRV Records for Email Submission and Access | 已实现 | 自动设置的来源之一。 |
加密与签名
S/MIME 和 OpenPGP,以及它们背后的构件。
| RFC | 标准 | 状态 | 在 FOLD 中 |
|---|---|---|---|
| RFC 5652 | Cryptographic Message Syntax | 已实现 | S/MIME 的容器格式,在 iPhone 和 iPad 上为自研实现,在 Mac 上使用系统实现。 |
| RFC 8551 | S/MIME 4.0 | 部分实现 | 使用 RSA 证书和 AES-CBC 进行签名、验证、加密和解密;S/MIME 4.0 所要求的 AES-GCM 尚不支持。 |
| RFC 1847 | Security Multiparts for MIME | 已实现 | 签名邮件和加密邮件的封装。 |
| RFC 3565 | AES in CMS | 已实现 | 用于 S/MIME 加密的 AES。 |
| RFC 5754 | SHA-2 in CMS | 已实现 | S/MIME 签名使用 SHA-256 及更强的算法。 |
| RFC 5280 | X.509 Certificates | 已实现 | 证书路径由系统的信任评估检查;吊销检查为可选项。 |
| RFC 9580 | OpenPGP | 部分实现 | 第 4 版密钥(Ed25519、Curve25519、RSA),配合 AES-256 和完整性校验,已对照 gpg 测试;第 6 版密钥和 AEAD 加密尚不支持。 |
| RFC 6637 | Elliptic Curve Cryptography in OpenPGP | 已实现 | Curve25519 加密密钥,即 FOLD 生成并使用的格式。 |
| RFC 3156 | MIME Security with OpenPGP | 已实现 | 用于签名邮件和加密邮件的 PGP/MIME。 |
| RFC 3394 | AES Key Wrap | 已实现 | 为使用 Curve25519 的收件人封装会话密钥。 |
| RFC 7253 | OCB Authenticated Encryption | 已实现 | 基于系统 AES 的自研实现,已对照 RFC 测试向量检验;用于读取 GnuPG 以 OCB 加密的邮件。 |
| RFC 9106 | Argon2 | 已实现 | Fortress 模式的密钥派生,已对照 RFC 测试向量检验。 |
| RFC 7693 | BLAKE2 | 已实现 | 用于 Argon2 内部,自研实现,已对照 openssl 检验。 |
| RFC 5869 | HKDF | 已实现 | 来自 CryptoKit,用于 Fortress 模式。 |
发件人真实性
FOLD 如何核实邮件的真正发件人。
| RFC | 标准 | 状态 | 在 FOLD 中 |
|---|---|---|---|
| RFC 6376 | DKIM Signatures | 已实现 | 在设备上验证:重新计算正文哈希和签名。 |
| RFC 8463 | Ed25519 for DKIM | 已实现 | 已对照 RFC 中的示例邮件检验。 |
| RFC 8301 | DKIM Crypto Algorithm Usage | 已实现 | 拒绝短于 1024 位的密钥和 rsa-sha1 签名。 |
| RFC 8601 | Authentication-Results | 部分实现 | 只信任以账户 IMAP 主机名标记的结果;使用其他名称标记的服务商(包括 Gmail)暂时得不到结果。 |
| RFC 7489 | DMARC | 部分实现 | FOLD 使用你的服务器记录的 DMARC 结果,并自行检查对齐;仅在显示品牌标志前才查询已发布的策略。 |
| RFC 7208 | SPF | 部分实现 | SPF 需要发件方的 IP 地址;FOLD 读取你的服务器记录的结果。 |
| BIMI | Brand Indicators for Message Identification (Internet-Draft) | 已实现 | 仅当 DMARC 在强制策略下通过且标志证书已验证时才显示标志;每封邮件只获取一次,并随邮件保存。 |
| RFC 9399 | Logotypes in X.509 Certificates | 已实现 | 品牌标志取自已验证的标志证书。 |
方法
本页如何维护
状态来自 FOLD 的一致性规则,以及对照 RFC 对邮件协议栈所做的审计。每一行在出现在本页之前都会对照源代码核实,代码变化时本页也随之更新。代码中共引用了 95 个不同的 RFC;本页列出的是那些决定邮件客户端能否与真实服务器良好协作的 RFC。