适用版本: 7-8.9
1. 错误异常的基本描述 #
Watcher 在解析邮件 action 时,会先把 to、cc、bcc 等字段中的地址列表转换为 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. 排查方法 #
- 检查邮件 action 的
to、cc、bcc、from、reply_to。 - 如果这些字段来自模板,输出最终渲染后的值再校验。
- 注意多地址列表中的每一项,问题往往只出在其中一个元素。
- 如果启用了 account defaults,也要同步检查默认配置。
4. 如何解决这个错误 #
把非法地址改成 RFC 风格的合法邮箱字符串,例如:
{
"email": {
"to": ["ops@example.com"],
"subject": "cluster alert",
"body": {
"text": "watch triggered"
}
}
}
修复时注意:
- 不要把显示名称、手机号或用户名直接填到邮箱字段。
- 多个地址请使用合法列表格式。
- 模板变量为空时,宁可阻止发送,也不要生成半截邮箱字符串。
5. 预防建议 #
- 在业务侧先做邮箱格式校验,再写入 watch。
- 对模板输出增加日志采样,便于发现变量拼接错误。
- account defaults 中的默认收件人也要纳入配置校验。
相关错误 #
- missing-required-email-to-field-how-to-solve-this-elasticsearch-exception
- invalid-email-defaults-in-email-account-settings-accountname-how-to-solve-this-elasticsearch-exception
- could-not-parse-email-unexpected-field-how-to-solve-this-elasticsearch-exception
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
try {
for (Email.Address address : Email.AddressList.parse(email)) {
address.validate();
}
} catch (AddressException e) {
throw new ElasticsearchParseException("invalid email address [{}]"; e; email);
}
}
}





