Logstash:使用Logstash将电子邮件导入到Elasticsearch

有没有一种简单的方法可以将电子邮件索引到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