在ElasticSearch上提取电子邮件附件

问题描述 投票:2回答:2

我正在尝试使用ELK管道来读取电子邮件(IMAP),提取通用附件(主要是PDF,最终是doc或ppt)并将它们放在ElasticSearch上。

这就是我能做到的:

  1. 使用Logstash从文件中直接加载到ElasticSearch一些base64数据,使用ElasticSearch上的Ingest Attachment Processor读取base64内容。
  2. 从IMAP加载数据(交换电子邮件)我可以正确加载ElasticSearch上的所有电子邮件信息,除了附件(我需要的)。

第一个解决方案工作正常并完成我正在寻找的,除了它不直接从电子邮件中提取附件,并且我在文件中有硬编码的base64数据。在第二个解决方案中,我在Kibana上有一个字段x-ms-has-attach: yes,但附件本身没有任何地方。 imap插件仅用于加载没有附件的电子邮件内容?

我错过了什么?你能告诉我一条管道来实现我想要的吗?

这是第一个示例的logstash配置:

input {
  file {
    path => "/my/path/to/data/*"
    start_position => "beginning"
#    sincedb_path => "/my/path/to/sincedb"
    sincedb_path => "/dev/null"
    close_older => 0
    tags => ["attachment"]
   }
}

output {
  elasticsearch {
    index     => "email-attachment"
    hosts     => [ "localhost:9200" ]
  }
}

这是管道:

PUT _ingest/pipeline/email-attachment
{
  "description": "Pipeline to parse an email and its attachments",
  "processors": [
    {
      "attachment" : {
        "field" : "message"
      }
    },
    {
      "remove" : {
        "field" : "message"
      }
    },
    {
      "date_index_name" : {
        "field" : "@timestamp",
        "index_name_prefix" : "email-attachment-",
        "index_name_format": "yyyy-MM",
        "date_rounding" : "M"
      }
    }
  ]
}

这是我的第二个示例的logstash配置:

input {
  imap {
    host => "my.domain.it"
    password => "mypassword"
    user => "myuser"
    port => 12345
    type => "imap"
    secure => true
    strip_attachment => true
  }
}

output {
  elasticsearch {
    index     => "email-attachment"
    hosts     => [ "localhost:9200" ]
  }
}

UPDATE

我正在使用版本5.2.2

email elasticsearch logstash
2个回答
0
投票

你的问题可能来自imap输入插件中的strip_attachment => true


0
投票

最后,我定义了一个完全不同的管道。我使用带有mail库的Ruby应用程序阅读电子邮件(您可以在github上找到它),在那里提取附件非常容易。然后我使用base64将这些附件的ElasticSearch编码直接放在Ingest Attachment Processor上。

我过滤content_type只是为了确保只加载“真正的”附件,因为多部分电子邮件将身体中的任何多媒体内容(即:图像)视为附件。

附:

使用mail library,您应该执行以下操作:

Mail.defaults do
    retriever_method :imap, { :address =>                 address,
                              :port =>                    port,
                              :user_name =>               user_name,
                              :password =>                password,
                              :enable_ssl =>              enable_ssl,
                              :openssl_verify_mode =>     openssl_verify_mode }

new_messages = Mail.find(keys: ['NOT','SEEN'])检索看不见的消息。

然后迭代new_messages。之后,您可以使用encoded = Base64.strict_encode64(attachment.body.to_s)对消息进行编码。请检查new_messages以检查要使用的确切字段名称。

© www.soinside.com 2019 - 2024. All rights reserved.