在ElasticSearch

时间:2017-07-24 15:28:27

标签: email elasticsearch logstash

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

这是我能够做到的:

  1. 使用Logstash从文件中直接向ElasticSearch加载一些base64数据,使用ElasticSearch上的Ingest Attachment Processor来读取base64内容。
  2. 从IMAP加载数据(交换电子邮件)我可以正确加载ElasticSearch上除附件(我需要的东西)之外的所有电子邮件信息。
  3. 第一个解决方案工作正常并且正在寻找我正在寻找的东西,除了它不直接从电子邮件中提取附件并且我在文件中有硬编码的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" ]
      }
    }
    

    更新

    我正在使用版本5.2.2

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

<强> P.S。

使用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以检查要使用的确切字段名称。