📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-7.15

1. 错误异常的基本描述 #

这个错误说明 Watcher 在解析邮件正文对象时,遇到了一个它不认识的字段。根据附带源码,这里校验的是 body 子对象内部字段,通常只接受 texthtml

典型报错形态类似:

could not parse email. unexpected field [body.markdown] field

也就是说,问题通常不是整个 email action,而是正文结构里出现了额外键名。

2. 为什么会发生这个错误 #

源码片段显示,遇到未知字段时直接抛异常:

} else {
    throw new ElasticsearchParseException("could not parse email. unexpected field [{}.{}] field", bodyField,
        currentFieldName);
}

常见原因:

  • body 中写入了不受支持的字段,如 markdownmessagecontent
  • 把别的通知系统字段误复制到了 email 配置里。
  • 模板生成了多余的层级,导致字段名落到了错误位置。

3. 排查方法 #

  1. 只看 email.body 节点,不要被其他字段干扰。
  2. 核对内部字段是否仅为 texthtml
  3. 如果报错中包含 [body.xxx],直接定位对应未知字段。
  4. 如果正文来自模板,检查模板是否插入了额外 key。

4. 如何解决这个错误 #

改成 Watcher 支持的正文结构,例如:

{
  "email": {
    "body": {
      "text": "plain text body",
      "html": "<p>html body</p>"
    }
  }
}

如果你只需要一种格式,只保留一个合法字段即可。

5. 预防建议 #

  • 为 email body 单独建立结构校验。
  • 复用固定模板,不要在不同 watch 中手工扩展 body 字段。
  • 当需要更多格式时,优先确认当前版本是否真的支持。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

    } else if (Email.Field.BODY_TEXT.match(currentFieldName, parser.getDeprecationHandler())) {
        email.textBody(parser.text());
    } else if (Email.Field.BODY_HTML.match(currentFieldName, parser.getDeprecationHandler())) {
        email.htmlBody(parser.text());
    } else {
        throw new ElasticsearchParseException("could not parse email. unexpected field [{}.{}] field", bodyField,
            currentFieldName);
    }