【问题标题】:Ingest email attachments on ElasticSearch在 ElasticSearch 上提取电子邮件附件
【发布时间】:2023-04-04 23:54:01
【问题描述】:

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

这是我能够做到的:

  1. 使用 Logstash 从文件中直接加载一些 base64 数据到 ElasticSearch,使用 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" ]
  }
}

更新

我正在使用版本5.2.2

【问题讨论】:

    标签: email elasticsearch logstash


    【解决方案1】:

    最后我定义了一个完全不同的管道。 我使用带有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 以检查要使用的确切字段名称。

    【讨论】:

    • 您能否详细说明您正在使用哪个脚本来 a) 提取电子邮件和 b) 对附件进行 bas64 编码?
    【解决方案2】:

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

    【讨论】:

    • 文档中没有关于这个选项的信息,但是你可以在插件的代码中看到它的作用:github.com/logstash-plugins/logstash-input-imap/blob/…
    • 我忘了提及,但我已经尝试过了,将其设置为strip_attachment => true 并不能解决问题。我也尝试强制使用默认值false,以防万一,但它也不起作用。
    • @AndreaRomagnoli 我没有任何其他想法。可能服务器默认不发送附件。
    • 是的,我也怀疑。交换可能是问题所在。也许我会尝试使用另一个域,只是为了确认或排除这种可能性。感谢您的帮助!
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 2010-11-21
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多