2017-07-24 133 views
1

我試圖使用ELK管道來讀取電子郵件(IMAP),提取通用附件(主要是PDF,最終是doc或ppt)並將它們放在ElasticSearch上。在ElasticSearch上獲取電子郵件附件

這是我能夠做到:

  1. 直接加載到ElasticSearch從文件中使用Logstash一些的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

回答

0

最後我定義了一個完全不同的流水線。 我使用Ruby應用程序和mail庫(您可以在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以檢查要使用的確切字段名稱。

+0

您能否詳細說明您正在使用哪個腳本:a)拉電子郵件和b)bas64編碼附件? – Moshe

+0

請檢查更新的答案。 –

0

你的問題可能來自strip_attachment => true在IMAP輸入插件。

+0

此選項的文檔中沒有任何信息,但您可以在插件的代碼中看到它的作用:https://github.com/logstash-plugins/logstash-input-imap/blob/33aca04048dd1bc53738a0b219b1db5bf962ec9d/ lib/logstash/inputs/imap.rb#L85 – baudsp

+0

我忘了提,但我已經嘗試過了,將其設置爲'strip_attachment => true'並不能解決問題。爲了以防萬一,我也嘗試強制使用默認值「false」,但它不起作用。 –

+0

@AndreaRomagnoli我沒有任何其他想法。也許服務器默認不發送附件。 – baudsp