← 返回案例列表
L3· 客户确认NOVAIX 案例国际货运代理 / 跨境物流 — 海运出口订舱客户/货代把订舱托书(Excel/PDF/Word,各家用自制模板)发到业务邮箱私有化

订舱邮件自动化:托书邮件到承运商订舱全链路无人值守

上海某国际贸易公司(自营出口 + 代办订舱)默认脱敏:行业 + 规模区间

业务员每天把客户托书邮件转发到专用邮箱(阿里企业邮)。托书是客户自制表格,字段名、行列、语言各异:航线有的在主题、有的在表格;毛重写法各异;HS 码常与货名同格;合约号没有,只能按货物类别推断。此前流程:逐封打开托书→手工读 9 个字段→登录达飞订舱网站逐项填写→等达飞发来「放舱确认/未接受」邮件,人工比对归档。全程须在装了影刀客户端的 Windows 机器上完成,承运商不提供对外 API。

交付周期
10周
企业规模
华东 · <50 人 · 1-5亿
技术栈
7 类组件
可信度
L3 · 客户确认
孙
孙明明C202609231256319EP
浏览 65
问题
  • 托书格式一票一样且信息残缺:合约号托书里没有,毛重单位写法各异,HS 码常与品名挤在同一格。
  • 把「追客户补字段」当主要补救手段不可靠:41 封字段索取邮件仅 7 封获回填(17%)。
代价:单票 5–10 分钟纯手工录入;箱型/毛重/HS 任一录错会被拒单或要求改单
方案
阶段一 · 规则优先的邮件解析→阶段二 · LLM 兜底 + 硬校验→阶段三 · RPA 承接最后一公里→阶段四 · 闭环、可观测与人工接管

IMAP 每 120 秒轮询收件箱,白名单校验发件人,按主题、托书附件、正文截图三源解析:主题用正则抽航线与箱型箱量,托书用标签锚定加相邻格取数,两源按数值字段托书优先、港口主题优先合并

结果
处理体量:邮件与订舱单
0(全部手工)→89 封托书/通知邮件全部自动处理,自动建立 77 条订舱单(来自 73 封不同邮件、34 个不同托书号);订舱网站录入由 RPA 代填,无人工录单
口径:emails / bookings 逐行计数 · 2026-09-05 ~ 2026-09-23(19 天) · data/emails.db
另有 7 项结果见下方明细

客户当时卡在哪

  • 托书格式一票一样且信息残缺:合约号托书里没有,毛重单位写法各异,HS 码常与品名挤在同一格。不解决的代价:单票 5–10 分钟纯手工录入;箱型/毛重/HS 任一录错会被拒单或要求改单
  • 把「追客户补字段」当主要补救手段不可靠:41 封字段索取邮件仅 7 封获回填(17%)。不解决的代价:41 次客户打扰,往返等待以小时计;平均每 2 票就有 1 票走过发信等回信路径
  • 承运商没有开放 API,订舱只能在 Windows 客户端/网页上人工点,必须有人守在装有影刀的机器前。不解决的代价:订舱时效被坐席在岗时间绑定;夜间到达的托书平均压到次日处理
  • 达飞回执邮件正文只有达飞自己的单号、没有托书号,人工比对归档靠肉眼在两张表之间找。不解决的代价:每份回执一次人工比对加手动存 PDF;漏判会把未接受当成已放舱,影响装箱计划
  • 试运行期一次集体故障:邮件签名里一张 BMP 冒充 PNG 的 logo不解决的代价:32 条订舱单在一次缺陷期内被卡到 failed,需人工逐一重做,缺陷潜伏数日才定位

FDE 怎么干的

1
阶段一 · 规则优先的邮件解析

IMAP 每 120 秒轮询收件箱,白名单校验发件人,按主题、托书附件、正文截图三源解析:主题用正则抽航线与箱型箱量,托书用标签锚定加相邻格取数,两源按数值字段托书优先、港口主题优先合并

关键判断:主路径必须是 Python 规则,LLM 只做旁路兜底,而不是把整封邮件丢给大模型。规则可重现、可审计、可回归,token 成本可控,且承运商字段有硬格式,模型幻觉的代价是订错舱。

2
阶段二 · LLM 兜底 + 硬校验

只有规则层出现缺字段时才调 deepseek-chat,有内嵌截图时同时走视觉模型。模型返回的每个字段都要过白名单与格式校验,不合法一律当空并进缺字段列表;模型判出的内部字段另有兜底值与留痕。

关键判断:模型输出永远不当事实,只当候选值,由规则层最终裁决;模型判不出来时不能让整单卡死,合约号按配置兜底、毛重按默认值上报,但必须把兜底痕迹写进日志,保证事后能分辨真假。

3
阶段三 · RPA 承接最后一公里

自研 dispatcher 把 9 个入参原子写入文件并改写触发信号文件,影刀 RPA 监听后登录达飞官网代填提交,完成后用 HTTP 回调把结果打回本地面板;

关键判断:不逆向承运商接口、不碰验证码,用 RPA 走人在操作界面的合法路径;触发用文件信号而非 API,简单可靠且便于人工补跑;触发后必须立刻把本地状态置为在途,否则下一轮轮询会重复派单。

4
阶段四 · 闭环、可观测与人工接管

达飞回执邮件单独走一条通道,主题特征命中即判为结果通知而不建单,从正文抽承运商单号后与订单逐字匹配,成功则置已订舱并归档回执 PDF,未接受则置失败,匹配不上进待补判队列每轮重扫。

关键判断:任何自动化动作都要留下可回溯的状态与证据,并且必须给人留一键接管的口子,宁可拦住可疑单让人确认,也不能把可疑数据静默送去订舱。同时把一封邮件只生成一条订舱单定为业务粒度。

完整经过

作者亲述:方案取舍、走过的弯路、怎么说服客户

背景

业务员每天把客户托书邮件转发到专用邮箱,逐封手工读出 9 个字段,再登录达飞订舱网站逐项填写,等回执邮件后人工比对归档。托书格式一票一样、信息天然残缺,承运商不提供对外 API,只能在装有影刀 RPA 的 Windows 机器上人工操作。

怎么打

主路径定为 Python 规则解析:IMAP 轮询收信、白名单校验、主题与托书双源解析、格式守卫后生成达飞 9 个入参。只有规则层缺字段时才调大模型兜底,模型输出一律当候选值,由规则层裁决。RPA 承接最后一公里,用文件信号唤起影刀代填,回调写回订单号。达飞回执邮件单独走一条通道,自动匹配订单、落盘 PDF、更新状态,并保留人工接管面板。

结果

19 天内 89 封邮件全部自动处理,自动建立 77 条订舱单,无人工录单。邮件到达至自动派发中位数 8.8 分钟,建单至拿到回执中位数 18.2 分钟。单轮扫描从 112 秒降至 22 秒,每轮大模型调用从 10~12 次降至 2 次。77 条中 74 条零重试一次成功。

边界

只对接达飞单一承运商,换船司需重配参数与 RPA 流程。走 RPA 界面自动化,网站改版、验证码、登录态失效需人工跟进。回执匹配只靠订单号逐字比对,无航线校验。模型兜底口径是「能订上优先」,数值不保证真实,需人工复核。

踩过的坑

只写顺利过程的案例,客户默认是包装过的
!一张 BMP 冒充 PNG 的邮件签名 logo,代码按扩展名声明 MIME 发给模型,服务端把整条请求判为非法图片返回 400
!SQLite 隐式事务在异常分支不收口,写锁长时间不释放,回调接口时通时不通,缺陷潜伏 8 天。教训:任何 except 里显式 rollback。
!配置里有兜底值但代码从不读它,字段恒空,整单被拦死。教训:拿到理论上该有值却总是空的字段,先 grep 配置键名有没有代码引用,零命中即死配置。
!上游拒绝了、下游兜底又把它放行,拦截点形同虚设:兜底分支把业务校验失败和写文件失败混成一种失败,把刚拦下的空合约号原样写进了 RPA 入参。
!模型明明填了、落库却为空,映射函数把值写进了不存在的键,值静默蒸发。教训:模型字段到落库的映射,键名必须与真实列名逐个对齐。

这个方案解决不了什么

敢写边界,才说明真的做过
  • ×只对接达飞(CMA CGM)单一承运商:换船司需要重配 9 个入参字典与另一套 RPA 流程,参数不通用。
  • ×承运商无对外 API,走 RPA 界面自动化:网站改版、弹窗、验证码、登录态失效都需人工跟进;
  • ×放舱回执匹配目前只靠承运商订单号逐字子串比对,没有航线校验:一旦订单号被填错,会把不相干的票静默标成已放舱。
  • ×模型兜底口径是「能订上优先」:模型调用失败时合约号用配置兜底、毛重按默认值 13000 上报,数值不保证真实,仍需人工复核。
Python 3.13xlrdSQLiteIMAP/SMTPDeepSeek API影刀 RPAPython http.server

结果

每个指标都附统计口径
处理体量:邮件与订舱单
0(全部手工)→89 封托书/通知邮件全部自动处理,自动建立 77 条订舱单(来自 73 封不同邮件、34 个不同托书号);订舱网站录入由 RPA 代填,无人工录单
怎么测:emails / bookings 逐行计数
统计周期:2026-09-05 ~ 2026-09-23(19 天)
数据来源:data/emails.db
邮件到达 → 自动派发订舱(影刀被唤起)
需有人在装有影刀的机器前值守,夜间/周末压到次日→中位数 8.8 分钟(最小 0.5 分钟,最大 69.1 分钟),7×24 无人值守
怎么测:emails.date → bookings.dispatched_at 差值
统计周期:2026-09-21 ~ 2026-09-23
数据来源:data/emails.db(17 条有效样本)
建单 → 拿到承运商回执(含 RPA 代填与网站提交)
人工录入后等待,无量化基线→中位数 18.2 分钟,最小 1.0 分钟(21 条有效样本)
怎么测:bookings.parsed_at → booked_at 差值
统计周期:2026-09-05 ~ 2026-09-23
数据来源:data/emails.db
单轮扫描耗时(等于数据库写锁争用窗口)
112 秒/轮→22 秒/轮(先查已有订单命中即跳过模型与建单)
怎么测:监控主循环实测耗时
统计周期:2026-09-21 优化前后对比
数据来源:logs/monitor.log
每轮大模型调用次数(成本与延迟)
10 ~ 12 次/轮→2 次/轮
怎么测:agent 调用日志逐轮计数
统计周期:2026-09-21 优化前后对比
数据来源:logs/monitor.log
大模型兜底有效率
—(纯规则层有时读不出字段)→46 次调用中 35 次至少补到一个字段(76%)
怎么测:bookings.agent_filled_json 非空计数
统计周期:2026-09-05 ~ 2026-09-23
数据来源:data/emails.db
放舱回执自动匹配与归档
人工肉眼比对达飞邮件与订单,手工存 PDF→3 份回执自动匹配到订单、写入放舱时间并归档 PDF(released_at + released_pdf),匹配不上时每轮自动补判
怎么测:bookings.released_at / released_pdf 计数
统计周期:2026-09-17 ~ 2026-09-23
数据来源:data/emails.db + attachments/BKGCONF_*.pdf
未完成单的平均重试次数(自动重试机制有效性)
人工发现漏单后手动重做,无自动重试→77 条中 74 条零重试一次成功,仅 3 条用满 3 次重试
怎么测:bookings.retry_count 分布
统计周期:2026-09-05 ~ 2026-09-23
数据来源:data/emails.db
我也有类似场景

证据清单

可信度的物理载体。证据越具体,等级越高。

代码email-monitor/:monitor.py(IMAP 主循环 + 状态机 + 派发/看门狗)、parser.py(主题与托书解析、达飞入参)、agent核验中
数据data/emails.db:89 封邮件、77 条订舱单、34 个托书号、46 次模型调用记录(可复算本案例全部 outcome 指标)核验中
日志logs/monitor.log:逐封邮件的解析结果、缺字段判定、派发与回调、模型调用与异常(含 9-20 集体故障的原始报错)核验中
日志logs/webui.log 中 `callback payload=` 行:影刀回调原始载荷(可据此重放补数据)核验中
截图本地运营面板(127.0.0.1:7820):订舱单列表与状态、单票字段详情、放舱回执 PDF 查看、人工干预入口核验中
回归logs/ 23 套回归探针 + selftest_notify / selftest_release / agent_parser --self-test:覆核验中
样本attachments/BKGCONF_*.pdf:3 份由系统自动匹配并归档的达飞放舱回执核验中
文档output/srs-booking-automation/stage3/需求规格说明书-订舱业务邮件自动化处理系统.docx核验中
文档email-monitor/deploy/DEPLOY.md:换机部署手册(含「新旧两机不得同时监听同一邮箱」的红线与串台排查方法)核验中
记录output/订舱系统_清废单与故障记录_20260921.md:废单与故障复盘核验中

核验型证据原件仅对已认证成员开放

登录并完成认证后查看 →

核验型证据的项目名对所有人可见 —— 让你知道作者提供了什么,但不公开原件;标「展示」的截图 / 动图经审核脱敏后全员可见。

正在确认权限…

客户见证人

该案例尚未取得客户确认。取得书面确认或见证人署名后,可信度可升级到 L3。

提问与质疑

一条被认真回应的质疑,比十条好评更能建立信任
Jace9认证FDE2026/9/23 22:38:08待作者回应

请问自动订舱大约要开发多久啊?支持哪些船公司?

提问仅对已认证成员开放

开放范围是已认证的 FDE 与已认证企业客户 —— 这是为了防止匿名差评, 保证每条质疑都有可追溯的身份,也保证作者愿意认真回应。

登录 / 完成认证