class MailHandler::Receiving::IMAPChecker
in charge of retrieving email by IMAP
Constants
- AVAILABLE_SEARCH_OPTIONS
search options: by_subject - String, search by a whole string as part of the subject of the email by_content - String, search by a whole string as part of the content of the email count - Int, number of found emails to return archive - Boolean by_recipient - Hash, accepts a hash like: :to => 'igor@example.com'
- RETRY_ON_ERROR_COUNT
Attributes
address[RW]
authentication[RW]
manual_connection_manage[RW]
Connection is closed by default after each search. By setting this flag, closing connection is ignored and you need to close it manually.
password[RW]
port[RW]
use_ssl[RW]
username[RW]
Public Class Methods
new()
click to toggle source
Calls superclass method
MailHandler::Receiving::Checker::new
# File lib/mailhandler/receiving/imap.rb, line 22 def initialize super @manual_connection_manage = false @available_search_options = AVAILABLE_SEARCH_OPTIONS end
Public Instance Methods
connect()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 48 def connect mailer.connect end
disconnect()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 52 def disconnect return if mailer.imap_connection.disconnected? mailer.disconnect end
find(options)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 28 def find(options) verify_and_set_search_options(options) @found_emails = find_emails(search_options) search_result end
init_retriever()
click to toggle source
delegate retrieval details to Mail
library set imap settings if they are not set
# File lib/mailhandler/receiving/imap.rb, line 60 def init_retriever return if retriever_set? imap_settings = retriever_settings Mail.defaults do retriever_method :imap, imap_settings end end
start()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 35 def start return if manual_connection_manage init_retriever connect end
stop()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 42 def stop return if manual_connection_manage disconnect end
Private Instance Methods
find_emails(options)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 115 def find_emails(options) imap_search(RETRY_ON_ERROR_COUNT, options) end
imap_date_search_pair(name, value)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 172 def imap_date_search_pair(name, value) [name, Net::IMAP.format_date(value)] end
imap_filter_keys(options)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 137 def imap_filter_keys(options) keys = [] options.each { |key, value| keys += retrieve_filter_setting(key, value) } keys.empty? ? nil : keys end
imap_recipient_search_pair(value)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 164 def imap_recipient_search_pair(value) [value.keys.first.to_s.upcase, value.values.first] end
imap_search(retry_count, options)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 119 def imap_search(retry_count, options) result = mailer.find_emails(what: :last, count: search_options[:count], order: :desc, keys: imap_filter_keys(options), delete_after_find: options[:archive], fetch_type: options[:fetch_type]) result.is_a?(Array) ? result : [result] # Silently ignore IMAP search errors, [RETRY_ON_ERROR_COUNT] times rescue Net::IMAP::ResponseError, EOFError, NoMethodError => e if (retry_count -= 1) >= 0 # rubocop:disable all reconnect retry else raise e end end
imap_string_search_pair(name, value)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 168 def imap_string_search_pair(name, value) [name, value.to_s] end
mailer()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 73 def mailer @mailer ||= Mail.retriever_method end
reconnect()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 77 def reconnect disconnect connect end
retrieve_filter_setting(key, value)
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 143 def retrieve_filter_setting(key, value) case key when :by_recipient imap_recipient_search_pair(value) when :by_subject imap_string_search_pair('SUBJECT', value) when :by_content imap_string_search_pair('BODY', value) when :since imap_date_search_pair('SINCE', value) when :before imap_date_search_pair('BEFORE', value) else [] end end
retriever_set?()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 102 def retriever_set? Mail.retriever_method.settings == retriever_settings end
retriever_settings()
click to toggle source
# File lib/mailhandler/receiving/imap.rb, line 106 def retriever_settings { address: address, port: port, user_name: username, password: password, authentication: authentication, enable_ssl: use_ssl } end