module Mastiff::Email

Public Instance Methods

all(*args, &block) click to toggle source

Receive all emails from the default retriever See Mail::Retriever for a complete documentation.

# File lib/mastiff/email.rb, line 60
def all(*args, &block)
  Mail.all(*args, &block)
end
archive(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 140
def archive(ids = [])
  unless ids.blank?
    uids         = ids.map{|v| (v.split ':').last.to_i}
    original_vid = ids.first.split(':').first.to_i


    Mail.connection do |imap|
      delim = imap.list("","INBOX").first.delim
      path = ["INBOX","unprocessed"].join(delim)
      imap.select('INBOX')
       if not imap.list('', "INBOX#{delim}unprocessed")
         imap.create("INBOX#{delim}unprocessed")
       end
       uids.each do |uid|
         imap.uid_copy(uid, "INBOX#{delim}unprocessed")
         imap.uid_store(uid, "+FLAGS", [:Deleted])
       end
       imap.expunge
    end
    sync_deleted(ids)
    return ids
  end
  return []
end
configure() { |self| ... } click to toggle source
# File lib/mastiff/email.rb, line 54
def configure(&block)
  yield self
end
finalize(ids = [], status = 'ok') click to toggle source
# File lib/mastiff/email.rb, line 164
def finalize(ids = [], status = 'ok')
  unless ids.blank?
    uids         = ids.map{|v| (v.split ':').last.to_i}
    original_vid = ids.first.split(':').first.to_i


    Mail.connection do |imap|
      delim = imap.list("","INBOX").first.delim
      mail_folder = ''
      case status
        when /processed/
          mail_folder = Mastiff.mailbox_folders[:processed] if Mastiff.mailbox_folders[:processed]
        when /rejected/
          mail_folder = Mastiff.mailbox_folders[:rejected] if Mastiff.mailbox_folders[:rejected]
      end
      if mail_folder
        path = ["INBOX", mail_folder].join(delim)
        imap.select('INBOX')
        if not imap.list('', "INBOX#{delim}#{mail_folder}")
         imap.create("INBOX#{delim}#{mail_folder}")
        end

        uids.each do |uid|
          Sidekiq::Logging.logger.info "Copying Mail to folder #{mail_folder} #{uid}"
          imap.uid_copy(uid, "INBOX#{delim}#{mail_folder}")
        end
      end

      uids.each do |uid|
        Sidekiq::Logging.logger.info "Marking Mail for deletion #{uid}"
        imap.uid_store(uid, "+FLAGS", [:Deleted])
      end

      imap.expunge
    end

    sync_deleted(ids)
    return ids
  end
  return []
end
flush(current_uid_validity = :all) click to toggle source
# File lib/mastiff/email.rb, line 206
def flush(current_uid_validity = :all)
  current_uid_validity = :all if current_uid_validity.nil?
  Mastiff.attachment_uploader.flush
  stale_msgs_ids = Message.emails.keys.select {|k| /#{current_uid_validity}:/ !~ k}
  stale_msgs_ids.each {|id| Message.emails.delete id}
  stale_msgs_ids.each {|id| Message.raw.delete id}
end
handle_mail(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 116
def handle_mail(ids = [])
  unless ids.blank?
    ids.each do |id|
      msg = Message.get(id)
      Sidekiq::Logging.logger.info "msg #{id} busy state: #{msg.header[:busy]}"
      unless msg.busy?
        msg.lock_and_save
        begin
          Mastiff.process_attachment_worker.perform_async(id)
          ensure
            msg.unlock_and_save
        end
        msg.unlock_and_save
      end
    end
    uids    = ids.map{|v| (v.split ':').last.to_i}
    original_vid = ids.first.split(':').first.to_i

    return ids
  end

  return []
end
headers(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 72
def headers(ids = [])
  ids = u_ids() if ids.blank?
  if ids.blank?
    []
  else
    Message.emails.bulk_values(*ids).map{|msg| msg.header}
  end
end
messages(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 80
def messages(ids = [])
  ids = u_ids() if ids.blank?
  if ids.blank?
    []
  else
    Message.emails.bulk_values(*ids)
  end
end
process_inbox() click to toggle source

Modification Methods

# File lib/mastiff/email.rb, line 100
def process_inbox
  no_attachments = headers.select{|m| m[:attachment_name].blank?}.map{|m| m[:id]}
  remove(no_attachments)

  grouped = headers.group_by{|m| m[:subject]}
  keep_ids    = []
  grouped.each do |k,l|
   l.sort_by!{|m| m[:date]}.reverse!
   keep_ids << l.shift[:id]
  end
  archive_ids = grouped.map{|k,l| l.map{|m| m[:id]}}.flatten
  archive(archive_ids)

  handle_mail(keep_ids)

end
raw_messages(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 88
def raw_messages(ids = [])
  ids = u_ids() if ids.blank?
  if ids.blank?
    []
  else
    Message.raw.bulk_values(*ids).map{|msg| Mail.new(msg)}
  end
end
remove(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 213
def remove(ids = [])
  unless ids.blank?
    uids         = ids.map{|v| (v.split ':').last.to_i}
    original_vid = ids.first.split(':').first.to_i
    Mail.find_and_delete(keys: "UID #{uids.join ','}")
    sync_deleted(ids)
    return ids
  end
  return []
end
settings() click to toggle source
# File lib/mastiff/email.rb, line 50
def settings
  Mail.retriever_method.settings
end
settings=(settings_hash) click to toggle source

{ :address => “localhost”,

:port                 => 143,
:user_name            => nil,
:password             => nil,
:authentication       => nil,
:enable_ssl           => false }.merge!(values)
# File lib/mastiff/email.rb, line 45
def settings= settings_hash
  Mail.defaults do
    retriever_method :imap, settings_hash
  end
end
sync_all(options={}) { |msg, imap, uid| ... } click to toggle source
# File lib/mastiff/email.rb, line 276
def sync_all(options={}, &block)
  self.flush
  Mail.all({keys:["NOT", "DELETED"]}.merge(options)) do |message, imap, uid|
    validity_id = imap.responses["UIDVALIDITY"].last if imap.responses["UIDVALIDITY"]
    msg         = Message.new(uid: uid, validity_id: validity_id, raw_message: message.raw_source)
    msg.save

    if Message.validity != msg.validity_id
      flush(msg.validity_id)
      Message.uid_validity.value = msg.validity_id
    end

    if block_given?
      if block.arity == 3
        yield msg, imap, uid
      else
        yield msg
      end
    end
  end
end
sync_deleted(ids = []) click to toggle source
# File lib/mastiff/email.rb, line 224
def sync_deleted(ids = [])
  unless ids.blank?
    ids.each do |id|
      message = Message.get(id)
      if message.respond_to?('attachment_name') and not message.attachment_name.blank?
        Mastiff::attachment_uploader.delete(message.attachment_name)
      end
      Message.emails.delete id
      Message.raw.delete id
    end
  end
end
sync_messages() click to toggle source

def sync_new(ids = [])

unless ids.blank?
    fetchdata = imap.uid_fetch(ids, ['RFC822'])
    fetchdata.each do |rec|
      message = Mail.new(rec.attr['RFC822'])
      validity_id = imap.responses["UIDVALIDITY"].last if imap.responses["UIDVALIDITY"]
      msg         = Message.new(uid: rec['UID'], validity_id: validity_id, mail_message: message)
      msg.save
  end
end

end

# File lib/mastiff/email.rb, line 248
def sync_messages
  Mail.connection do |imap|
    imap.select 'INBOX'
    validity_id = imap.responses["UIDVALIDITY"].last if imap.responses["UIDVALIDITY"]
    if Message.validity.eql? validity_id
      uids        = imap.uid_search(["NOT", "DELETED"]).sort
      local_uids  = Message.ids
      if  uids != local_uids
        Sidekiq::Logging.logger.info "*** Syncing Some ***"
        new_ids     = uids       - local_uids
        deleted_ids = local_uids - uids
        unless new_ids.blank?
          fetchdata = imap.uid_fetch(new_ids, ['RFC822'])
          fetchdata.each do |rec|
              validity_id = imap.responses["UIDVALIDITY"].last if imap.responses["UIDVALIDITY"]
              msg         = Message.new(uid: rec.attr['UID'], validity_id: validity_id, raw_message: rec.attr['RFC822'])
              msg.save
          end
        end
        self.sync_deleted(deleted_ids.map{|id| [validity_id,id].join ':'}) unless deleted_ids.blank?
      end
    else
      self.sync_all
    end
    Message.ids
  end
end
u_ids() click to toggle source
# File lib/mastiff/email.rb, line 67
def u_ids
  prefix = uid_validity
  Message.emails.keys.select{|k| /#{prefix}:/ =~ k }
end
uid_validity() click to toggle source
# File lib/mastiff/email.rb, line 64
def uid_validity
  Message.validity
end