mcpField
F
falzmarke

falzmarke

本地服务
falzmarke.com生产力1今天更新

关于 falzmarke

falzmarke 将 Markdown 内容排版为符合 DIN 5008 的 PDF/A 商务信函,并测量最终 PDF 是否符合版式要求。它适用于通过命令行、Claude 技能或兼容 MCP 的客户端制作可重复且可验证的商务文书。

主要功能

  1. 01Markdown 转 PDF/A 商务信函
  2. 02DIN 5008 版式排版
  3. 03测量最终 PDF 的几何尺寸
  4. 04机器可读报告与退出码
  5. 05可复用品牌信息的发件人配置
  6. 06命令行、Claude 技能与 MCP 接入

适用场景

  1. 01从 Markdown 生成商务信函
  2. 02打印前检查折线和地址栏位置
  3. 03在 CI 中渲染并验证信函
  4. 04通过兼容 MCP 的客户端创建信函

MCP 相关

通过 stdio 提供 MCP 服务,让客户端渲染和验证信函。可通过 `falzmarke mcp` 命令启动。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"blitzsicht-falzmarke": {
"command": "uvx",
"args": [
"falzmarke"
]
}
}
}
启动命令uvx falzmarke

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypifalzmarke0.10.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

falzmarke — 用 AI 写信,依据规范,而非感觉。将 Markdown 转换为符合 DIN 5008 的信函,排版为 PDF/A,并精确到毫米地检查。

CI Release License: MIT Python 3.11+ DIN 5008


其他工具会生成 PDF。falzmarke 会检查结果。

你用 Markdown 编写内容。falzmarke 会据此排版一封符合 DIN 5008:2020 的商务信函,并生成 PDF/A,然后测量最终的 PDF。如果折线标记没有位于 105.0 mm 处,运行就会报错,而不是生成一封仅仅差不多合规的信函。

falzmarke.com — 无需终端的使用指南 · ⬇ 下载为 Claude 技能 · 60 秒内试用 · 查看示例信函

Linux · macOS · Windows · 每页 35 项尺寸测量 · PDF/A-2b · MIT

English overview


动态演示

终端中先显示以 Markdown 编写的示例信函,接着运行 falzmarke render:生成 PDF 和预览,然后运行测量报告,并以统计合规尺寸数量的行结束。

使用真实的 CLI,通过 vhs 录制; 录制脚本见 docs/marke/video/readme.tape。 有一项测试会将录制内容与全新运行的结果进行比对,确保这里展示的终端并非虚构 (tests/test_tape.py)。


最终效果

信头、地址栏、信息块和主题

接下来会进行检查——以下是每次运行都会输出的报告摘录:

OK    Falzmarke 1, y: soll 105.00 ist 105.00 (tol ±0.3)
OK    Infoblock, x-links: soll 125.00 ist 125.00 (tol ±0.5)
OK    Betreff, y-Oberkante: soll 98.47 ist 97.91 (tol -1.75/+0.6)
OK    Abstand Betreff → Anrede (2 Leerzeilen): soll 12.70 ist 12.70 (tol ±0.2)

这是几何报告中 34 行里的 4 行。影片展示了其余内容的生成过程:一条线从上到下扫过页面,并在每个测得的高度处停下。它停在测量结果所指的位置——在这些检查中,测量值就是位置。

一封示例信,旁边是一个文本框。一条绿色水平线从上到下扫过页面,依次停在八处:46.26 毫米处的退信地址、50.34 毫米处的信息块、62.69 毫米处的地址首行和 77.86 毫米处的末行、98.45 毫米处的主题、105.00 毫米处的折痕标记、148.50 毫米处的打孔标记,以及 210.00 毫米处的第二个折痕标记。每次停下时,旁边都会显示检查名称、目标值、测量值、容差和“符合”字样。最后,八条线同时落在页面上,旁边显示:34 项检查全部符合。

34 项几何检查中,有八项会标出页面上的高度;其余检查宽度、间距和不涉及页面位置的属性。上文提到的 35 项检查多出一项:render 之后,CLI 还会检查 PDF/A 合规性,而这与毫米位置无关。两个数字都没错,只是统计的内容不同。

影片中的数字都不是手工录入的——它们全部来自 verify --json,而 tests/test_messfilm.py 会将影片与最新的测量结果进行核对。如果有人将折痕标记移动 2 mm,相关的停顿就必须变成红色;如果没有,测试就会失败。

上方报告的第一行提到了一条在预览图中几乎看不见的线——它只有 0.25 pt 粗。放大后,该处如下所示:

一封信左边缘的局部放大图,尺寸为 6 × 4 毫米:一条绿色虚线辅助线标出 105.00 毫米处的目标位置,并在同一高度与一条短黑色折痕标记相接,该标记略微占据图像宽度的一半。旁边是缩小显示的整页信件,框出了放大位置。下方标注测量位置为 105.00 毫米。

纸张会在此处折叠,使地址出现在窗口信封的窗口内。标记位置不对,整叠信纸就会折错——而这要等打印后才会发现。

问题

信件模板无法检查成品是否正确。模板被复制后,有人移动了一行,错误要等整叠信件完成后才会被发现:地址不再位于窗口范围内,所有信件都必须重新打印并装入信封——而使用自动化优惠寄件的人,还会失去这次寄件的优惠。

大模型让情况更糟。它们擅长写作,却无法将文本精确放置在 45.0 mm 处。让 AI 写信的人,得到的内容往往不错,版面却不可靠。

渲染器也可能出错——包括这个渲染器。

因此,falzmarke 将三件事分开处理:内容以 Markdown 格式提供,便于阅读和版本管理。版面由渲染器排布,确保每次结果一致。检查则测量最终的 PDF,而不是盲目信任渲染器。

为什么不直接用 Word 或提示词?

这里比较的是典型工作流程,而不是工具本身——精心维护的模板也能实现其中许多功能。

Word / LibreOffice 模板直接让 AI 写信falzmarke
来源可比较差异并进行版本管理部分支持很少支持 — Markdown 和 YAML
布局可复现取决于模板和环境不保证支持 — 使用相同的渲染器,输出相同
测量生成的 PDF否否是 — 35 项测量,每页都检查,偏差即为错误
发件人配置手动维护不一致支持 — 创建一次,随处使用
检查报告可供机器读取否否支持 — --json 和退出码
默认生成 PDF/A不会自动生成不保证支持 — 无需额外标志

你能从中获得什么

  • 信件能准确落入窗口信封 — 通信地址栏、折叠标记和打孔标记会在生成的 PDF 中测量,而不是在排版时估算。
  • 更改始终有迹可循 — Markdown 和 YAML 都是文本文件。差异对比能显示更改内容;PDF 是结果,而非来源。
  • 一种风格,适用于多封信件 — 配置文件集中管理信头、页脚、徽标、颜色和默认设置。签名也可以按信件覆盖。
  • 错误可供机器读取 — 为输入、几何尺寸和环境错误提供专用退出码,并支持 --json。因此可用于 CI 和自动化流程。
  • 适用于长期归档 — 通常无需额外标志即可生成 PDF/A-2b;如果嵌入了文件——每张发票都会这样做——则会生成 PDF/A-3b (ADR 0033)。 该文件是否真正符合所声明的级别,不由此工具判断,而由 veraPDF 判断——它是 PDF Association 的参考实现,并在 CI 中于每次推送时运行。也可通过 --pdfua 生成 PDF/UA-1,同样会在那里检查。
  • 在对话中或终端里使用 — 可作为 Claude 技能或 CLI 使用,无需安装到系统中。

如何判断结果正确

承诺是否兑现,关键就在这一部分——因此它排在安装说明之前。

  • 测量的是最终生成的 PDF,而不是输入。verify 使用 pdfplumber 读取生成的文档,并将区域、标记和间距与预期值进行比较。

  • 每项关键检查都有一个反证测试。 测试会针对故意偏移的布局运行,并且必须检测出偏差——永远不会失败的检测手段算不上证明。顶部的图片也是如此:它会生成两次,一次使用交付的布局,一次使用标记向下偏移 2 mm 的布局。

    同一局部画面的动态对比。第一种状态下,折痕标记位于 105.00 毫米处的虚线预期位置,下面显示 105.00 毫米,并注明这是交付版本。第二种状态下,标记明显下移,预期位置线保持不变,下面显示 107.00 毫米,并注明 verify 会在此处检测出偏差。

    如果这两个局部画面没有区别,说明画面根本没有显示标记——那么上面的图片就毫无价值,tests/test_detailbild.py 也会失败。

  • 每次推送都会在 Linux、macOS 和 Windows 上运行 CI。

  • 全新安装测试会实际运行本 README 中的命令。这里没有任何未经验证的命令。

  • 所有示例信件都会在 CI 中渲染并进行测量。

  • PDF 符合性由外部工具确认。 列表中的其他检查都使用生成 PDF 的同一份代码进行测量——这只能证明自身一致性,不能证明符合标准。 veraPDF 没有编写这封信,也没有与渲染器共享任何代码。它会检查文件自身声明的内容,针对实际交付的文件进行检查并比对校验和——还有一项反证测试,确保不符合要求的 PDF 会被判定为失败(scripts/pdf_konformitaet.py)。

  • 布局基础已 vendort 并受校验和保护 — vendor/README.md。

项目会区分两种容易混淆的说法:

预期值有专业依据和验证器能够检测出与该值的偏差是两回事。第二点已得到证明。第一点则有其局限。

预期值的来源: 尺寸和书写规则依据公开文档来源(列表见 skill/references/din5008.md);与 DIN 5008:2020-03 原文(包括更正 1:2020-07)的比对尚未完成。仅基于单个来源的规则只会产生警告。每条规则的依据见各项规则的来源情况;由此产生的法律后果见 docs/recht.md。

python3 -m pytest -q

安全性

只陈述代码中已有且经过验证的内容。falzmarke 未经独立审计——如有安全相关问题,请按 SECURITY.md 处理,不要作为 Issue 提交。

  • 处理过程始终在本地进行。 渲染路径不会导入网络库。
  • YAML 只通过 safe_load 读取——任何位置都如此,包括嵌入式配置文件。
  • Markdown 按节点类型的白名单处理。 不在白名单中的内容会报错并指出行号——绝不会静默放行。
  • 信件正文永远不会变成 Typst 代码。 发射器会将其作为经过转义的字符串传递;特殊字符无法脱离结构。
  • 配置文件和信件文件都留在各自的目录中。 Logo、签名和自定义信头不得指向目录之外,符号链接会被解析 (反例测试)。
  • Typst 被限制在专用根目录中运行,并且禁用系统字体。
  • 程序的所有依赖项均采用宽松许可证 — THIRD_PARTY_LICENSES.md。
  • CI 操作均固定到完整的提交 SHA,而不是可变动的标签。

可以验证发布资产的来源:

gh attestation verify falzmarke.skill --repo blitzsicht/falzmarke

这能证明文件来自哪个运行和哪个提交——不能证明文件没有错误。SHA-256 校验和列在发布说明中,旁边还有 falzmarke.skill.sha256 文件。

60 秒上手

有四种方式,各自的能力并不相同:

方式离线渲染大小用途
上传 falzmarke.skill否,首次运行时会下载~0,8 MBclaude.ai — 上传对话框最多接受 30 MB
falzmarke-offline.skill是 — 内含 Typst 编译器~34 MB无法访问 PyPI 的沙箱;超过上传对话框的大小限制
pipx / uvx否,首次运行时会下载~1 MB终端
克隆仓库否,首次运行时会下载~1 MB参与工具开发

两个 Skill 包只相差一个文件:离线包在 vendor/ 中包含 typst wheel,轻量包则没有。为何分成两个包,而不是合并为一个,详见 skill/vendor/README.md。

使用 Claude
  1. 下载 falzmarke.skill
  2. 在 Claude 的设置 › Capabilities 中上传(需要支持代码执行的套餐)。 对于 Claude Code,只需创建符号链接:
    ln -s "$PWD/skill" ~/.claude/skills/falzmarke
    
  3. “给 Muster GmbH 写一封信,报价……"
在终端中使用
uvx falzmarke init brief.md --profil example --betreff "Angebot Nr. 2026-0815"

或者永久安装,之后只需运行 falzmarke render brief.md --png:

pipx install falzmarke

该包托管在 PyPI。如果要使用尚未发布的 main 分支版本,仍可使用以下地址:

pipx install git+https://github.com/blitzsicht/falzmarke

Typst 编译器随 Python wheel 一同提供:无需系统级安装,无需 LaTeX、wkhtmltopdf,也无需安装字体。

在存放大量信件的仓库中使用

如果你会对信件进行版本控制,可以在每次推送时自动排版并测量:

- uses: blitzsicht/falzmarke@main
  with:
    briefe: "briefe/*.md"
    profile: "profile"

完成后,PDF 会作为运行产物附加到该次运行中。如果信件不符合尺寸要求,运行会标记为失败,并指出文件和尺寸——这样,系列信件归档中的主题行错位会在推送时而非收件人收到时被发现。输入参数见 action.yml;该操作会从 PyPI 安装 falzmarke,不会另建一套安装流程。若要确保运行可复现,请指定固定版本:paket: "falzmarke==0.7.3"。

在另一个 AI 客户端中

falzmarke 使用 MCP,因此不熟悉 Claude 技能的客户端也能撰写信件。

pip install 'mcp>=2,<3'          # das SDK ist nicht in der Grundausstattung
falzmarke mcp                    # Server über stdio

该服务位于官方 MCP Registry中, 名称为 io.github.blitzsicht/falzmarke。上方注释中的那一行并非装饰:Registry 会据此验证此 PyPI 软件包是否属于该服务名称——它会读取 PyPI 上的项目说明,而项目说明就是这个文件。

四个工具:brief_rendern、email_setzen、brief_pruefen、profile_auflisten。 每次渲染都会附带测量报告——如果某项服务返回 PDF,却不说明尺寸是否正确,那它就和其他 PDF 生成器没什么两样。

在容器中运行——MCP 目录也是这样构建的,Dockerfile 位于根目录:

git clone https://github.com/blitzsicht/falzmarke.git && cd falzmarke
docker build -t falzmarke-mcp .
docker run --rm -i falzmarke-mcp   # `-i` ist nötig: der Server liest von stdin

发件人档案可以作为对象放在调用中。无法访问服务文件系统的客户端可以这样提供自己的发件人信息,而不必使用那里碰巧已有的档案。

此服务不会做的事:发送、存档、投递。它只负责撰写和检查 (ADR 0029)。

从克隆仓库直接运行,无需安装
git clone https://github.com/blitzsicht/falzmarke.git
cd falzmarke
python3 skill/scripts/bootstrap.py
python3 skill/scripts/falzmarke.py render examples/brief-form-b.md --png

撰写一封信

---
profil: example
empfaenger:
  - Muster GmbH
  - Frau Erika Muster
  - Musterstraße 1
  - 12345 Musterstadt
datum: 2026-08-25
betreff: Angebot Nr. 2026-0815 über die Neugestaltung Ihrer Website
anrede: Sehr geehrte Frau Muster,
anlagen:
  - Angebot 2026-0815
---
vielen Dank für Ihre Anfrage vom 20. August 2026. Anbei erhalten Sie unser Angebot.

Die Umsetzung dauert ab Ihrer Freigabe **sieben Werktage**.
python3 skill/scripts/falzmarke.py render brief.md --png

所有字段都列在数据契约中。任何未列出的字段都会导致程序报错,并指出行号和修改建议——绝不会静默丢弃。

信件正文中允许的内容

Frontmatter 下方的文本使用falzmarke-Markdown,这是CommonMark的一个有文档说明的子集:

可以使用falzmarke 会自动处理
段落、**粗体**、*斜体*将 § 5 中的空格替换为不换行空格
无序列表和有序列表将 -- 转换为短破折号 – 如此
在行尾使用 \ 强制换行将 "词语" 转换为 „词语“
带对齐方式的管道表格

缩写(z. B.)、日期(25. August)、单位(10 %、5 kg)以及数值前的缩写(Tel.、Nr.)不会由 falzmarke 自动处理:没有任何一条规则有多个来源支持——缩写和日期只有 Wikipedia 提供依据,第二个完整来源并未提及(#31)。因此,lint 会发出警告,而不是替换。它会报告位置和行号——然后你可以自行添加空格,使用 &nbsp;(5&nbsp;km)。哪些规则有多个来源支持,请参阅各规则的来源情况表格。

链接、图片和 HTML 都是错误——会指出行号、原因和修正方式,绝不会静默处理。纸上没有链接,而正文中的图片会改变之后要测量的版面几何形状。

较长的信件可以使用小标题(# 到 ####)、更深层级的列表、块引用和逐字摘录:在 Frontmatter 中设置 dialekt: "1.1" 即可启用。摘录会逐字保留——不做排版替换、不换行、不着色,其中的内容也不会被执行。未设置此字段时,使用 1.0 版本,现有信件的渲染结果保持不变。

完整列表请见:falzmarke-Markdown。

同一文件也是邮件

在 Frontmatter 中写有 typ: email 的信函不会生成 PDF 页面,而是生成 .eml—— 同一份源文件、同一套配置、同一个签名。

falzmarke email nachricht.md --html
OK  geschrieben: nachricht.eml
OK  geschrieben: nachricht.html
OK  verify: 22/22 Prüfungen bestanden

.eml 会打开邮件程序,.html 会打开浏览器。使用 --oeffnen 时,falzmarke 会在 macOS 上直接创建一封草稿——在 Thunderbird 中填写发件人、收件人、主题、正文和附件,并带有发送按钮,而且只有通过检查后才会创建;Mac 版 Outlook 仅支持 --programm outlook。在尚未验证此方式的平台(Windows、Linux、Apple Mail)上,文件会直接交给相应程序;它会在那里以阅读窗口打开,而不是草稿,这是该格式本身的特性。检查的是最终文件: MIME 结构、format=flowed、空格填充、签名分隔行,以及 HTML 中是否包含不该出现的内容——没有脚本、外部样式表、跟踪像素,也没有用作布局的表格。falzmarke verify --email 也会检查来自其他来源的文件。

falzmarke 不会发送邮件。 它没有发送命令,也没有任何发送选项:生成文件的人对其内容负责;传递文件的人对送达和凭证负责。这是两项承诺,而 falzmarke 只提供第一项 (ADR 0034)。草稿功能不受此限制,也不会更进一步:可以创建草稿,绝不发送——控制脚本中没有发送命令,而且测试会检查整个软件包 (ADR 0038)。

文件的构成、有意省略的内容以及适用边界,详见: 电子邮件版本。四个 示例位于 examples/email/。

发票:ZUGFeRD 和 XRechnung

typ: rechnung 类型的信函会像普通信函一样排版,同时还会附带一份无人阅读的数据记录:发给企业的发票会以嵌入 ZUGFeRD XML 的 PDF 形式发送;发给政府机构的同一张发票则会以纯 XRechnung XML 形式发送,不含 PDF。

falzmarke render rechnung.md                 # PDF/A-3b mit eingebetteter ZUGFeRD-XML
falzmarke xml xrechnung.md -o rechnung.xml   # nur die XML, für eine Behörde

验收结果的不是 falzmarke 本身,而是 CI 中的两个外部工具:Mustang 2.26.0 会根据相应版本的 Schematron 规则检查 PDF 和嵌入的 XML;KoSIT 验证器 1.6.3 则会使用官方配置再次检查 XRechnung。

falzmarke 不会计算账目。 它会从源文件传递明细项、税率和总额,但不会计算这些数据——它不会分配发票编号、记账、催款或发送发票。具体含义以及明确不作出的承诺,详见: 使用 falzmarke 开具发票。

公文:没有地址栏的文件

协议、声明、证明:带有 typ: urkunde 的信函使用标题而非主题,不设地址栏,并带有供手写签名的横线。 信头、页脚、字体和网格与信函使用同一配置文件。

falzmarke render vereinbarung.md   # setzt und misst nach — auch die Unterschriftslinien

正文中还多了两种元素(dialekt: "1.2"):填写栏,即一串下划线,渲染后会变成固定长度的横线;以及不带表头的信息表格。设置 seiten_max: 1 后,如果文件无法排在一页内,运行就会报错。

公文的尺寸是工具设定的,并非 DIN 5008 规定的尺寸——该标准没有规定不带地址栏的页面,而且上文针对信函列出的尺寸在此不适用。falzmarke 不对文件的形式或效力作任何说明;它也不支持任何条款。具体含义请见: falzmarke 公文。 两个示例位于 examples/urkunde/。

示例

标准信函挂号信多页信函
形式 B备注区续页
带信息块的形式 B附加区和备注区页眉和页码

此外还有形式 A、国外地址、表格、带有长信息块的信函,以及一封使用英文标注的信函(sprache: en——德国尺寸,英文文字)—— 所有示例及其完整渲染结果。

限制

  • falzmarke-Markdown(CommonMark 子集):段落、 粗体、斜体、无序列表、有序列表、硬换行、管道符表格。其他所有内容都会报错并指出行号,而不会静默地以其他方式排版。
  • 标准区域尺寸:地址最多 6 行,备注最多 3 行,信息块中的值最多 21 个字符。
  • 正文中不能有图片——Logo 应放在配置文件中。
  • 仅支持 DIN 5008。 瑞士(SN 010130)和奥地利(ÖNORM A 1080)已列入计划 (#10);Frontmatter 字段 norm: 为此预留。
  • 不支持签名。 签名图片只是外观,并非证明。加密签名属于 #14 的讨论范围。

延伸阅读

命令所有子命令、退出代码、检查内容
发件人配置创建配置、搜索顺序、自定义信头
电子邮件版本.eml 的结构、组成部分和限制
使用 falzmarke 处理发票ZUGFeRD、XRechnung、检查内容与不检查的内容
数据约定每个 Frontmatter 字段及示例
falzmarke Markdown信函正文支持的内容
标准尺寸与资料来源目标值及其来源
falzmarke 的声明范围标准声明的界限
仓库结构分层、Vendoring,以及软件包位于 skill/ 下的原因
路线图工作顺序及尚未完成的事项
变更日志 · 发布版本变更内容

参与贡献

欢迎提交错误报告和建议——请参阅 CONTRIBUTING.md。 如果是几何错误,请附上 verify 的输出;没有它,就无法判断是布局还是测量出了问题。

涉及安全的问题,请勿提交为 Issue,而应按照 SECURITY.md 中的说明报告。

来源与致谢

Markdown 于 2004 年由 John Gruber 与 Aaron Swartz 共同 设计。其规范是 CommonMark (John MacFarlane 和贡献者)。falzmarke 实现了其中一个有文档说明的子集 —— falzmarke-Markdown——并在三处有意 作出偏离:HTML 从不直接透传,链接从不设置;没有其他列表项的单独一行 2. Text 会被报告——并保留原始起始编号进行排版,以免静默地重新编号。

页面布局源自 Sematre 的 typst-letter-pro (MIT),并以原样 vendoring 的方式引入——校验和见 vendor/README.md。falzmarke 在此基础上补充了上层部分:数据契约、配置档案、Markdown 输入、测量以及技能。

排版使用 Typst(Apache-2.0),解析使用 markdown-it-py(MIT),测量使用 pdfplumber(MIT)和 pypdf(BSD-3)。字体:Libertinus 和 Source Sans 3 (均为 OFL 1.1)。完整清单以及替换 PyMuPDF(AGPL-3.0)的原因,见 THIRD_PARTY_LICENSES.md。

程序的所有依赖均采用宽松许可证授权——falzmarke 因此也可集成到封闭系统中。唯一不采用宽松许可证的是 Remotion,它用于渲染说明视频:它不参与程序本身,也不会随程序提供。

DIN 5008 是 DIN Deutsches Institut für Normung e. V. 的一项标准。falzmarke 不是 DIN 的产品,与 DIN 没有任何关联,也不声称获得认证。测量尺寸的方法见 docs/normmasse.md。

最近的变化

最近两个版本的原文。由 CHANGELOG.md 生成——在该文件中修改,然后运行 python3 scripts/changelog.py。

v0.10.0 — 25.10.2026
新增
  • 发件人的写作风格现已写入配置档案。 新增的 email.stil: 部分可填写 person:(ich 或 wir)、自定义 floskeln: 和自由填写的 hinweise:。如果 文本使用了另一种人称,或包含自定义列表中的表达,lint 就会发出警告——逐字引用的内容除外。hinweise: 只会检查格式:由负责撰写的模型读取其内容(SKILL.md 第 4 步)。falzmarke 会传递这项要求,但不会强制执行(ADR 0053)。

  • 在 Thunderbird 中创建草稿。 如果已安装,falzmarke email … --oeffnen 现在会通过 Thunderbird 的命令行创建草稿,并使用配置档案中的发件人,以及收件人、抄送、密送、主题、HTML 正文和所有附件。Outlook 现在只能通过选择使用(--programm outlook):它经常已安装,但没有许可证,而且新版 Outlook 不会向程序控制提供账户信息。Thunderbird 不会返回任何状态——退出码 0 表示“已接受”,命令也会说明没有进行确认。如果主题、正文或文件名中有单引号,就会将其替换为撇号 ’;如果附件的文件名中有逗号,则会报错并回退到文件方式。签名徽标会作为 Data-URI 随正文一起传递;超过 900 000 字节的命令不会执行,而是报告其长度(ADR 0049)。

  • --oeffnen 会先检查“已发送”文件夹,草稿则存放在邮箱中。 如果过去 24 小时内曾向同一收件人发送过相同正文、相同版本或相同主题的邮件,falzmarke email … --oeffnen 就不会创建草稿。它会报告 SCHON GESENDET 或 GEÄNDERTE FASSUNG,并以退出码 4 结束;--trotz-gesendet 可跳过此检查。如果本地 IMAP 代理可连接,Thunderbird 草稿现在会作为完整邮件存放在发件人的“草稿”文件夹中,包含所有邮件头,也包括 In-Reply-To。此时不会打开窗口。如果那里已有收件人和主题相同的草稿,就不会再添加第二份(--noch-ein-entwurf)。邮箱中只会存放这一份草稿,绝不会发送、删除或移动任何内容。每个 .eml 还会带有 X-Falzmarke-Fassung,这是对源文件的校验和,不含路径或文件名。Thunderbird 发送时会丢弃这一行,因此在“已发送”文件夹中会根据主题和正文判断。此前退出码 4 表示“渲染器错误”,但从未被返回过(ADR 0051)。

  • 五种邮件情境,以及一份删改清单。 此前的风格参考涵盖的是信件类型——报价、催款、解约、异议,以及另外三种。现在还增加了最常见的邮件情境:跟进报价、回复投诉、价格与折扣、供应商、内部沟通。此外还新增“删改内容”一节,列出九种听起来像机器写的模式,并为每种模式列出一个与其相似但保留的情况——判断标准与套话相同:这句话是否传达了信息。明确没有采纳三条英文去机器化指南中的规则,因为它们不适用于德语商务邮件(不使用破折号、使用直引号、不用三段式结构):排版处理会有意使用半破折号和引号 „…“,并且有一项测试会验证对其的理由。

  • 草稿中的不可见字符现在会被报告。 此前,从剪贴板带入的零宽标记、软连字符、双向文本控制符和变体选择符会未经检查地留在最终的 .eml 和 PDF 中。现在 lint 会指出行号和位置;不会修改任何内容。falzmarke 自行添加不换行空格的位置——z. B.、§ 7、12 kg——仍不会触发报告(ADR 0052)。

    更新注意:lint 现在可能会报错,而此前不会。 没有用途的字符属于错误,而非警告,因此 lint 会以退出码 1 结束。以同一个含有 U+200B 的发票编号文件为例:v0.9.15 下是 0 Fehler,退出码 0;现在是 1 Fehler,退出码 1。该文件此前就已损坏;这个字符一直隐形地存在于 .eml 和 PDF 中。但如果在脚本或 CI 中运行 lint,只有在运行结束后才会发现。因此,此版本提高了版本号的第二位。

已更改
  • 又新增八种空洞表达。 email.floskel 此前识别七种模式,现在增至十五种:“es ist wichtig zu beachten”“zusammenfassend lässt sich sagen”“in der heutigen schnelllebigen Zeit”“jederzeit gerne zur Verfügung”“an dieser Stelle möchte ich”“wie Sie sicher wissen”“im Voraus vielen Dank”和“wir würden uns freuen”。纳入标准依然严格:删掉这一行后,邮件不能因此损失任何内容。因此,“bei Rückfragen stehe ich zur Verfügung”仍不在其中,只有带有“jederzeit”的版本会被纳入——空洞的是这个强调词,而不是愿意答疑这件事。另有两个候选表达被明确拒绝,并在源代码中说明理由:“im Rahmen von”和“nicht nur …, sondern auch”有时承载实际内容,而无法区分这一点的模式会削弱人们对其他模式的信任。它仍只是实践层面的警告,不会更改任何内容。
已修复
  • 邮件会继承邮件程序的颜色。 深色主题下的 Thunderbird 草稿中,整个正文几乎是深灰底上的黑色:每个区块都带有 #1a1a1a,而用于在深色方案下切换的 <style> 区块不会应用到那里。现在正文不再设置文字颜色或背景色,而是使用邮件程序的颜色显示,深色背景上显示浅色文字,浅色背景上显示深色文字。辅助文字只会缩小,不再变灰。分隔线采用中灰色,在白色和深色背景上都清晰可见。附带的签名保持不变。文本部分保持不变。

  • 邮件地址、域名和 URL 在信件中不再被拆开。 已发送的信件中,行尾会出现“ser-”,下一行则是“[email protected]”;“blitzsicht.com/da-”和“tenschutz”也会被拆开,照着输入的人将无法找到正确地址。现在,包含地址的整个单词会移到下一行,连同后面的逗号或句号。其他文字仍会照常断行。此规则适用于最长 60 个字符的地址;公文两端对齐的区块中为 40 个字符。在表格单元格中,地址只是不加连字符,因为不可拆分的单词会把后面的文字挤开。verify 还会报告成品 PDF 中仍然跨行的地址,例如主题、单元格中的地址或跨越边界的 URL;配对时只会匹配同一列的行。

  • falzmarke serie 支持分号分隔的 CSV。 使用 ; 作为分隔符的 Excel 文件会以 TypeError 结束,因为整行表头被当成了单列。现在会根据表头识别分隔符 , 或 ;。如果数据行的字段数仍多于表头,serie 会报告实际读取到的分隔符,而不是崩溃。

  • Thunderbird 不再因签名而提示忘记添加附件。 发送 falzmarke 草稿时,每次都会弹出“您是否忘记添加附件?”。原因是签名提示中含有“Anhänge”一词。现在 HTML 签名位于一个带有 moz-signature 类的元素中,Thunderbird 的附件提醒会忽略这一部分。如果消息正文中写有“anbei”或“Anhang”,Thunderbird 仍会询问,这是预期行为。文本部分此前就已带有签名分隔符 -- (ADR 0051)。

  • 附带的签名会像正文一样继承颜色。 使用 email.signatur_html 时,深色 Thunderbird 草稿中的姓名、电子邮件链接、公司名称和标签会呈现为深色背景上的深色文字,因为签名的深色模式规则位于它自己的 <style> 中,草稿不会应用这些规则。现在插入签名时会移除文字颜色和背景色,并将无法在浅色或深色背景上清晰显示的线条改为中灰色。带有自定义背景色的按钮会变成链接。布局、文字、链接和 Logo 均保持不变,个人资料文件夹中的文件也不会被修改。

  • Thunderbird 草稿中的签名不再重复。 如果 Thunderbird 中发件人地址对应的身份本身带有签名(附件文件或签名文本),falzmarke email … --oeffnen 就会在草稿中省略从个人资料中带入的签名,并用一行文字注明身份和文件。程序只会读取标准个人资料中的 prefs.js 和 user.js;以 user.js 为准。如果无法确定身份,则保持原有行为,并提供提示和原因。.eml 和 .html 仍会包含签名(ADR 0050)。

v0.9.15 — 07.10.2026
已修复
  • “发票”不再触发缩写警告。 lint 之前要求每个“发票”后面都必须有不换行空格,因此“我们的发票用于……”或“发票 Apple”也会触发警告,仿佛这个词是 Nr. 这样的缩写。在随附示例中,这类警告有 11 条,其中 9 条是误报。现在,规则 schreibweise.kuerzel_vor_angabe 只会在真正的缩写后发出警告。“发票 Nr. 2026-0815”仍会触发警告,但触发项是 Nr.,而不是“发票”。(#386)

此前还有 34 个版本——完整历史记录见 CHANGELOG.md。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。