lib/logstash/inputs/imap.rb in logstash-input-imap-0.1.1 vs lib/logstash/inputs/imap.rb in logstash-input-imap-0.1.2
- old
+ new
@@ -3,17 +3,16 @@
require "logstash/namespace"
require "logstash/timestamp"
require "stud/interval"
require "socket" # for Socket.gethostname
-# Read mail from IMAP servers
+# Read mails from IMAP server
#
-# Periodically scans INBOX and moves any read messages
+# Periodically scan an IMAP folder (`INBOX` by default) and move any read messages
# to the trash.
class LogStash::Inputs::IMAP < LogStash::Inputs::Base
config_name "imap"
- milestone 1
default :codec, "plain"
config :host, :validate => :string, :required => true
config :port, :validate => :number
@@ -21,10 +20,11 @@
config :user, :validate => :string, :required => true
config :password, :validate => :password, :required => true
config :secure, :validate => :boolean, :default => true
config :verify_cert, :validate => :boolean, :default => true
+ config :folder, :validate => :string, :default => 'INBOX'
config :fetch_count, :validate => :number, :default => 50
config :lowercase_headers, :validate => :boolean, :default => true
config :check_interval, :validate => :number, :default => 300
config :delete, :validate => :boolean, :default => false
@@ -70,11 +70,11 @@
def check_mail(queue)
# TODO(sissel): handle exceptions happening during runtime:
# EOFError, OpenSSL::SSL::SSLError
imap = connect
- imap.select("INBOX")
+ imap.select(@folder)
ids = imap.search("NOT SEEN")
ids.each_slice(@fetch_count) do |id_set|
items = imap.fetch(id_set, "RFC822")
items.each do |item|
@@ -89,10 +89,12 @@
imap.close
imap.disconnect
end # def run
def parse_mail(mail)
+ # Add a debug message so we can track what message might cause an error later
+ @logger.debug("Working with message_id", :message_id => mail.message_id)
# TODO(sissel): What should a multipart message look like as an event?
# For now, just take the plain-text part and set it as the message.
if mail.parts.count == 0
# No multipart message, just use the body as the event text
message = mail.body.decoded
@@ -119,10 +121,10 @@
end
# Call .decoded on the header in case it's in encoded-word form.
# Details at:
# https://github.com/mikel/mail/blob/master/README.md#encodings
# http://tools.ietf.org/html/rfc2047#section-2
- value = transcode_to_utf8(header.decoded)
+ value = transcode_to_utf8(header.decoded.to_s)
# Assume we already processed the 'date' above.
next if name == "Date"
case event[name]