有没有一种简单的方法可以将电子邮件索引到 Elasticsearch? Logstash 是答案。 Logstash 是一个开放源代码的服务器端数据处理管道,它同时从多个源中提取数据,进行转换,然后将其发送到你喜欢的“存储(stash)”中。 在这里,“存储(stash)”是指诸如 Elasticsearch,PagerDuty,电子邮件,Nagios,Jira 等产品。
Logstash 事件处理管道包括三个阶段:输入→过滤器→输出。 输入会生成事件,过滤器会对其进行修改,输出会将它们发送到任何地方。 输入和输出支持编解码器,使你可以在数据进入或退出管道时对其进行编码或解码,而不必使用单独的过滤器。
如果你还没有涉足 Logstash,请阅读我之前的文章 “如何安装 Elastic 栈中的 Logstash”。
教程
为了将电子邮件索引到 Elasticsearch,我们需要使用名为 “logstash-input-imap” 的 Logstash 输入插件。 该插件会定期从 IMAP 服务器读取电子邮件。 Lgstash 默认情况下附带许多插件,“ imap”(logstash-input-imap)也不例外。
让我们从基本管道开始 Logstash,如下所示:
./bin/logstash -e 'input { stdin { } } output { stdout {} }'
打开浏览器并访问 http://localhost:9600/_node/plugins?pretty 以验证已安装的插件列表。 你应该在响应中看到在当前 Logstash 实例中激活的插件列表。 你可以向下滚动以确认“logstash-input-imap” 插件可用/已安装,如下所示:

我们也可以通过如下命令来查看:
./bin/logstash-plugin list --group input
显示的结果为:
logstash-input-azure_event_hubs
logstash-input-beats
logstash-input-couchdb_changes
logstash-input-elasticsearch
logstash-input-exec
logstash-input-file
logstash-input-ganglia
logstash-input-gelf
logstash-input-generator
logstash-input-graphite
logstash-input-heartbeat
logstash-input-http
logstash-input-http_poller
logstash-input-imap
logstash-input-jdbc
logstash-input-jms
logstash-input-pipe
logstash-input-redis
logstash-input-s3
logstash-input-snmp
logstash-input-snmptrap
logstash-input-sqs
logstash-input-stdin
logstash-input-syslog
logstash-input-tcp
logstash-input-twitter
logstash-input-udp
logstash-input-unix
在上面我们可以看出来 logstash-input-imap 在里面,表明它是我们 Logstash 应用安装的一部分,我们不需要特别的安装。
接下来,我们需要使用 “logstash-input-imap” 作为输入来配置 Logstash 管道。 此插件所需的唯一配置是 “host”,“password” 和 “user”。
根据要连接的 IMAP 服务器所需的设置,你可能需要为其他配置(例如“port”,“secure”等)设置值。“host” 是你在其中指定 IMAP 服务器详细信息的位置 ,“user” 和 “password” 是需要指定用户凭据以进行身份验证/连接到 IMAP 服务器的位置。
在今天的练习中,我们使用 hotmail 来做我们的实验。我曾经尝试使用中国的 163 及 QQ 邮箱来实验。针对这些邮箱,一方面我们需要在它们的【邮箱设置】中找到【POP3/SMTP/IMAP】开启,这样能够使得第三方软件获取邮件。更为特别的是在第三方软件通过 IMAP 来获取邮件需要输入它们提供的校验码,从而使得它们不能很好地和logstash-input-imap 工作。
针对我的情况,我使用如下的 logstash 配置文件:
logstash_email.conf
input {
imap {
host => "imap-mail.outlook.com"
user => "YourEmailAddress"
password => "YourPassword"
content_type => "text/plain"
secure => true
port => 993
check_interval => 10
folder => "Inbox"
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
index => "emails"
document_type => "_doc"
hosts => "localhost:9200"
}
}
在上面,我们配置我们的 hotmail 邮件设置。针对你的情况,你需要在 user 及 password 中输入自己的邮件地址及密码。我们的邮件将以文档的形式发送给 Elasticsearch 中,并存于 emails 索引中。
默认情况下,“logstash-input-imap” 插件从文件夹 “INBOX” 读取并每300秒轮询一次 IMAP 服务器。 在上面的配置中,我覆盖了这些n设置以及端口。我们可以通过如下的方式来启动 logstash:
./bin/logstash -f ~/data/email/logstash_email.conf --config.reload.automatic
在需要根据自己的情况来修改上面的 .conf 文件的地址。
注意:在开发模式下,最好启用自动重新加载配置(--config.reload.automatic),因此不必在每次更改管道/配置时都重新启动Logstash。
由于一些原因,目前 logstash-input-imap 有一个 bug:Error: Can not decode an entire message。根据这个 bug 的描述,如果邮件中有附件的时候,可能造成读取的错误,从而导致 logstash 出错。
现在,让我们启动 Logstash 代理,以便它开始侦听来自 IMAP 服务器的传入电子邮件:

我们可以通过另外一个邮箱向我们的邮件发送信息,比如:

我们可以在我们的 logstash 运行中看到如下的信息:

那么在我们的 Kibana 中,我们可以在 emails 索引中看到:

可以发现,我们已经成功地把发向 hotmail 的邮件导入到 Elasticsearch 中了。
条件标记
现在,我们已经有了基本的设置来为 Elasticsearch 的电子邮件编制索引,我们可以添加新的字段,过滤器,条件标签等等。 假设我们用主题为 “critical/error” 关键字的所有电子邮件进行标记。 根据标签的不同,我们可以在输出插件中执行操作,例如向支持团队发送电子邮件,创建 Jira 问题,发送 PagerDuty 事件等。可能性无限。
以下是显示条件标记的示例配置:
logstash_email_tag.conf
input {
imap {
host => "imap-mail.outlook.com"
user => "YourEmailAddress"
password => "YourPassword"
content_type => "text/plain"
secure => true
port => 993
check_interval => 10
folder => "Inbox"
add_field => {"parser" => "logstash"}
}
}
filter {
if "critical" in [subject] {
mutate { add_tag => "critical" }
}
else if "error" in [subject] {
mutate { add_tag => "error" }
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
index => "emails"
document_type => "_doc"
hosts => "localhost:9200"
}
}
我们可以通过如下的命令来运行我们的 logstash 应用:
./bin/logstash -f ~/data/email/logstash_email_tag.conf --config.reload.automatic
我们在其它的邮件客户端写入一个如下的邮件:

那么在我们的 Logstash console 里我们可以看到:

我们可以通过 Kibana 检查:

当 critical 邮件发生时,我们可以使用 logstash-output-email 来向我们的邮件发送邮件信息。具体实现留给大家。
总结
如你所见,Logstash IMAP 插件使发送电子邮件到 Elasticsearch 或任何其他输出变得非常容易。 现在我们在 Elasticsearch 中拥有电子邮件,我们可以编写一个简单的搜索客户端,或者直接从 curl 或 REST 客户端调用 Elasticsearch 搜索端点,以开始挖掘和分析它们。 更好的是,我们可以将各种指标和汇总应用于索引的电子邮件,以在 Kibana 中产生有用的可视化效果。 将电子邮件添加到 ELK 堆栈中的数据分析管道中肯定会使你的商业智能受益。
参考:
【1】https://qbox.io/blog/indexing-emails-to-elasticsearch-logstash-imap

本文介绍如何使用Logstash的IMAP插件将电子邮件索引到Elasticsearch,涵盖配置细节和示例,以及如何添加条件标记以增强数据分析。
1938

被折叠的 条评论
为什么被折叠?



