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

适用版本: 7-8.9

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

Watcher 在解析邮件 action 时,会先把 toccbcc 等字段中的地址列表转换为 Email.Address 对象,然后逐个执行 validate()。只要其中任意一个地址格式不合法,就会抛出当前异常。

典型报错:

invalid email address [ops.example.com]

常见非法值包括:

  • 缺少 @ 的地址,如 ops.example.com
  • 带非法字符的地址,如 ops@@example.com
  • 模板渲染后为空字符串或半截地址

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

保留的源码片段表明,异常直接来源于地址校验:

for (Email.Address address : Email.AddressList.parse(email)) {
    address.validate();
}

因此这不是 SMTP 连接阶段的问题,而是配置值本身已经不合法。常见原因:

  • watch JSON 中直接写入了错误邮箱。
  • 地址列表来自模板变量,而变量内容不完整。
  • 使用分隔符拼接多个邮箱时,生成了空元素或非法元素。
  • account defaults 中的默认地址本身就不合法,导致每次发送都失败。

3. 排查方法 #

  1. 检查邮件 action 的 toccbccfromreply_to
  2. 如果这些字段来自模板,输出最终渲染后的值再校验。
  3. 注意多地址列表中的每一项,问题往往只出在其中一个元素。
  4. 如果启用了 account defaults,也要同步检查默认配置。

4. 如何解决这个错误 #

把非法地址改成 RFC 风格的合法邮箱字符串,例如:

{
  "email": {
    "to": ["ops@example.com"],
    "subject": "cluster alert",
    "body": {
      "text": "watch triggered"
    }
  }
}

修复时注意:

  • 不要把显示名称、手机号或用户名直接填到邮箱字段。
  • 多个地址请使用合法列表格式。
  • 模板变量为空时,宁可阻止发送,也不要生成半截邮箱字符串。

5. 预防建议 #

  • 在业务侧先做邮箱格式校验,再写入 watch。
  • 对模板输出增加日志采样,便于发现变量拼接错误。
  • account defaults 中的默认收件人也要纳入配置校验。

相关错误 #

附:日志上下文 #

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

try {
    for (Email.Address address : Email.AddressList.parse(email)) {
        address.validate();
    }
} catch (AddressException e) {
    throw new ElasticsearchParseException("invalid email address [{}]"; e; email);
}
    }
}