首页 > 解决方案 > Elast 警报 email_from_field 仅向一个收件人发送消息

问题描述

当我使用 email_from_field 选项时,Elastalert 只向一个收件人发送消息,但有两个收件人。这是我的规则:

name: SOD Error recipients
type: frequency

# ES Settings
es_host: elasticsearch
es_port: 9200

index: $INDEX
num_events: 1
timeframe:
    seconds: 30
realert:
  minutes: 0
filter:
- query:
    query_string:
      query: "ServiceName: test_multirecipients"
aggregation:
  seconds: 10
aggregation_key: logger
query_key: logger

#SMTP Settings
smtp_host: "$SMTP_IP"
smtp_port: $SMTP_PORT
smtp_ssl: false
smtp_auth_file: /opt/config/smtp_auth_file.yaml
from_addr: "$SMTP_FROM"
email_format: "html"
email_from_field: "recipients"
# Include certain field inside alert body
include: ["ServiceName", "message", "logger", "recipients"]

alert_text_type: alert_text_only
alert_text: "sometext"

alert_text_args:
  - ServiceName
  - "@timestamp"
  - recipients
  - logger

alert:
- "email"
email:
  - "$SMTP_TO2"

我认为麻烦可能是“收件人”字段的格式,但我不确定。这是它的外观: 在此处输入图像描述

我尝试了另一种语法: 在此处输入图像描述

在这两种情况下,消息总是发送到列表中的第一个电子邮件地址(可以是任何电子邮件),而第二个收件人将被忽略。但是第二个收件人总是列在 Outlook 邮件中的收件人中。

在此处输入图像描述

消息到达 ByndyuSoftTest 电子邮件,但 ByndyuSoft4 被忽略

在此处输入图像描述

消息到达 ByndyuSoft4 电子邮件,但 ByndyuSoftTest 被忽略

标签: pythonelasticsearchelastalert

解决方案


知道了。email_from_field 作为单个电子邮件地址传递,即使有更多地址。这有效(alerts.py):

if 'email_from_field' in self.rule:
    recipient = lookup_es_key(matches[0], self.rule['email_from_field'])
    if isinstance(recipient, str):
        if '@' in recipient:
            to_addr = recipient.split(',')
        elif 'email_add_domain' in self.rule:
            to_addr = [recipient + self.rule['email_add_domain']]

推荐阅读