mailhandler 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mailhandler/receiver.rb +6 -0
- data/lib/mailhandler/receiving/base.rb +8 -0
- data/lib/mailhandler/receiving/filelist/filter/base.rb +30 -7
- data/lib/mailhandler/receiving/folder.rb +8 -1
- data/lib/mailhandler/receiving/imap.rb +42 -2
- data/lib/mailhandler/receiving/mail.rb +91 -0
- data/lib/mailhandler/version.rb +1 -1
- data/spec/unit/mailhandler/receiver_spec.rb +4 -0
- data/spec/unit/mailhandler/receiving/imap_spec.rb +0 -6
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 6ffda69ae4a9be229a9071524a77f71a3b873748
         | 
| 4 | 
            +
              data.tar.gz: 6b28a918816ee5f8830529792066210b781321d2
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 836a3e85fe73ca400d881c44b1e520fabb78fdc63859ea98df4f7cfb8d7c34fa6188b911d3aa061e256749da63474723cb4a7fd2b4c59b5fff6a4a7708ea2bd9
         | 
| 7 | 
            +
              data.tar.gz: 13ad0ea77e75ce066cd71789343f01f49333d764e159921ea120374fcf55823a75e3742cab9bf6e7bfc1739e780d8943e441ce16b4cd644131f7945d04ec095d
         | 
    
        data/lib/mailhandler/receiver.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require_relative 'receiving/folder'
         | 
| 2 2 | 
             
            require_relative 'receiving/imap'
         | 
| 3 3 | 
             
            require_relative 'receiving/observer'
         | 
| 4 | 
            +
            require_relative 'receiving/mail.rb'
         | 
| 4 5 |  | 
| 5 6 | 
             
            module MailHandler
         | 
| 6 7 |  | 
| @@ -43,6 +44,7 @@ module MailHandler | |
| 43 44 | 
             
                def find_email(options)
         | 
| 44 45 |  | 
| 45 46 | 
             
                  init_search_details(options)
         | 
| 47 | 
            +
                  checker.start
         | 
| 46 48 |  | 
| 47 49 | 
             
                  until search_time_expired?
         | 
| 48 50 |  | 
| @@ -57,6 +59,10 @@ module MailHandler | |
| 57 59 |  | 
| 58 60 | 
             
                  checker.search_result
         | 
| 59 61 |  | 
| 62 | 
            +
                  ensure
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                    checker.stop
         | 
| 65 | 
            +
                  
         | 
| 60 66 | 
             
                end
         | 
| 61 67 |  | 
| 62 68 | 
             
                private
         | 
| @@ -57,20 +57,43 @@ module MailHandler | |
| 57 57 |  | 
| 58 58 | 
             
                    end
         | 
| 59 59 |  | 
| 60 | 
            -
                     | 
| 60 | 
            +
                    module ByDate
         | 
| 61 61 |  | 
| 62 | 
            -
                       | 
| 62 | 
            +
                      class Since < Base
         | 
| 63 63 |  | 
| 64 | 
            -
                         | 
| 65 | 
            -
             | 
| 64 | 
            +
                        def initialize(files, date)
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                          super(files)
         | 
| 67 | 
            +
                          @date = date
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                        end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                        private
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                        def meets_expectation?(file)
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                          (File.exists? file)? (File.ctime file) > @date : false
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                        end
         | 
| 66 78 |  | 
| 67 79 | 
             
                      end
         | 
| 68 80 |  | 
| 69 | 
            -
                       | 
| 81 | 
            +
                      class Before < Base
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                        def initialize(files, date)
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                          super(files)
         | 
| 86 | 
            +
                          @date = date
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                        end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                        private
         | 
| 70 91 |  | 
| 71 | 
            -
             | 
| 92 | 
            +
                        def meets_expectation?(file)
         | 
| 72 93 |  | 
| 73 | 
            -
             | 
| 94 | 
            +
                          (File.exists? file)? (File.ctime file) < @date : false
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                        end
         | 
| 74 97 |  | 
| 75 98 | 
             
                      end
         | 
| 76 99 |  | 
| @@ -44,6 +44,12 @@ module MailHandler | |
| 44 44 |  | 
| 45 45 | 
             
                  end
         | 
| 46 46 |  | 
| 47 | 
            +
                  def start
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                    verify_mailbox_folders
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 47 53 | 
             
                  private
         | 
| 48 54 |  | 
| 49 55 | 
             
                  # filter options which need to be done by searching files
         | 
| @@ -51,7 +57,8 @@ module MailHandler | |
| 51 57 |  | 
| 52 58 | 
             
                      :by_subject => FileList::Filter::ByEmailSubject,
         | 
| 53 59 | 
             
                      :by_content => FileList::Filter::ByEmailContent,
         | 
| 54 | 
            -
                      :since => FileList::Filter::ByDate,
         | 
| 60 | 
            +
                      :since => FileList::Filter::ByDate::Since,
         | 
| 61 | 
            +
                      :before => FileList::Filter::ByDate::Before,
         | 
| 55 62 | 
             
                      :by_recipient => FileList::Filter::ByEmailRecipient
         | 
| 56 63 | 
             
                  }
         | 
| 57 64 |  | 
| @@ -27,15 +27,45 @@ module MailHandler | |
| 27 27 | 
             
                  def find(options)
         | 
| 28 28 |  | 
| 29 29 | 
             
                    verify_and_set_search_options(options)
         | 
| 30 | 
            -
                    init_retriever
         | 
| 31 30 | 
             
                    @found_emails = find_emails(search_options)
         | 
| 32 31 |  | 
| 33 32 | 
             
                    search_result
         | 
| 34 33 |  | 
| 35 34 | 
             
                  end
         | 
| 36 35 |  | 
| 36 | 
            +
                  def start
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    init_retriever
         | 
| 39 | 
            +
                    connect
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def stop
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    disconnect
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 37 49 | 
             
                  private
         | 
| 38 50 |  | 
| 51 | 
            +
                  def mailer
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    @mailer ||= Mail.retriever_method
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  def connect
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    mailer.connect
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  def disconnect
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    mailer.disconnect
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 39 69 | 
             
                  # search options:
         | 
| 40 70 | 
             
                  # by_subject - String, search by a whole string as part of the subject of the email
         | 
| 41 71 | 
             
                  # by_content - String, search by a whole string as part of the content of the email
         | 
| @@ -46,6 +76,8 @@ module MailHandler | |
| 46 76 |  | 
| 47 77 | 
             
                      :by_subject,
         | 
| 48 78 | 
             
                      :by_content,
         | 
| 79 | 
            +
                      :since,
         | 
| 80 | 
            +
                      :before,
         | 
| 49 81 | 
             
                      :count,
         | 
| 50 82 | 
             
                      :archive,
         | 
| 51 83 | 
             
                      :by_recipient
         | 
| @@ -92,7 +124,7 @@ module MailHandler | |
| 92 124 |  | 
| 93 125 | 
             
                  def find_emails(options)
         | 
| 94 126 |  | 
| 95 | 
            -
                    result =  | 
| 127 | 
            +
                    result = mailer.find(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options), :delete_after_find => options[:archive])
         | 
| 96 128 | 
             
                    (result.kind_of? Array)? result : [result]
         | 
| 97 129 |  | 
| 98 130 | 
             
                  end
         | 
| @@ -117,6 +149,14 @@ module MailHandler | |
| 117 149 |  | 
| 118 150 | 
             
                          keys << 'BODY' << options[:by_content].to_s
         | 
| 119 151 |  | 
| 152 | 
            +
                        when :since
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                          keys << 'SINCE' << Net::IMAP.format_date(options[:since])
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                        when :before
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                          keys << 'BEFORE' << Net::IMAP.format_date(options[:before])
         | 
| 159 | 
            +
             | 
| 120 160 | 
             
                        else
         | 
| 121 161 |  | 
| 122 162 | 
             
                          # do nothing
         | 
| @@ -0,0 +1,91 @@ | |
| 1 | 
            +
            module Mail
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              class IMAP
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                attr_accessor :imap
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def find(options={}, &block)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  options = validate_options(options)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  options[:read_only] ? imap.examine(options[:mailbox]) : imap.select(options[:mailbox])
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  uids = imap.uid_search(options[:keys])
         | 
| 14 | 
            +
                  uids.reverse! if options[:what].to_sym == :last
         | 
| 15 | 
            +
                  uids = uids.first(options[:count]) if options[:count].is_a?(Integer)
         | 
| 16 | 
            +
                  uids.reverse! if (options[:what].to_sym == :last && options[:order].to_sym == :asc) ||
         | 
| 17 | 
            +
                      (options[:what].to_sym != :last && options[:order].to_sym == :desc)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
             | 
| 20 | 
            +
                  if block_given?
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    uids.each do |uid|
         | 
| 23 | 
            +
                      uid = options[:uid].to_i unless options[:uid].nil?
         | 
| 24 | 
            +
                      fetchdata = imap.uid_fetch(uid, ['RFC822'])[0]
         | 
| 25 | 
            +
                      new_message = Mail.new(fetchdata.attr['RFC822'])
         | 
| 26 | 
            +
                      new_message.mark_for_delete = true if options[:delete_after_find]
         | 
| 27 | 
            +
                      if block.arity == 3
         | 
| 28 | 
            +
                        yield new_message, imap, uid
         | 
| 29 | 
            +
                      else
         | 
| 30 | 
            +
                        yield new_message
         | 
| 31 | 
            +
                      end
         | 
| 32 | 
            +
                      imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find] && new_message.is_marked_for_delete?
         | 
| 33 | 
            +
                      break unless options[:uid].nil?
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    imap.expunge if options[:delete_after_find]
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  else
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                    emails = []
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    unless uids.nil?
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      uids.each do |uid|
         | 
| 45 | 
            +
                        uid = options[:uid].to_i unless options[:uid].nil?
         | 
| 46 | 
            +
                        fetchdata = imap.uid_fetch(uid, ['RFC822'])[0]
         | 
| 47 | 
            +
                        emails << Mail.new(fetchdata.attr['RFC822'])
         | 
| 48 | 
            +
                        imap.uid_store(uid, "+FLAGS", [Net::IMAP::DELETED]) if options[:delete_after_find]
         | 
| 49 | 
            +
                        break unless options[:uid].nil?
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                      end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    imap.expunge if options[:delete_after_find]
         | 
| 56 | 
            +
                    emails.size == 1 && options[:count] == 1 ? emails.first : emails
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                # Start an IMAP session
         | 
| 63 | 
            +
                def connect(config=Mail::Configuration.instance)
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    puts "connect"
         | 
| 66 | 
            +
                    @imap = Net::IMAP.new(settings[:address], settings[:port], settings[:enable_ssl], nil, false)
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    if settings[:authentication].nil?
         | 
| 69 | 
            +
                      imap.login(settings[:user_name], settings[:password])
         | 
| 70 | 
            +
                    else
         | 
| 71 | 
            +
                      # Note that Net::IMAP#authenticate('LOGIN', ...) is not equal with Net::IMAP#login(...)!
         | 
| 72 | 
            +
                      # (see also http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/net/imap/rdoc/classes/Net/IMAP.html#M000718)
         | 
| 73 | 
            +
                      imap.authenticate(settings[:authentication], settings[:user_name], settings[:password])
         | 
| 74 | 
            +
                    end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                def disconnect
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  puts "disconnect"
         | 
| 81 | 
            +
                  if defined?(imap) && imap && !imap.disconnected?
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                    imap.disconnect
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                  end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                end
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            end
         | 
    
        data/lib/mailhandler/version.rb
    CHANGED
    
    
| @@ -14,6 +14,8 @@ describe MailHandler::Receiver do | |
| 14 14 | 
             
                  allow(checker).to receive(:search_result) { true }
         | 
| 15 15 | 
             
                  allow(checker).to receive(:found_emails) { [found_email] }
         | 
| 16 16 | 
             
                  allow(checker).to receive(:reset_found_emails) { [] }
         | 
| 17 | 
            +
                  allow(checker).to receive(:start) { nil }
         | 
| 18 | 
            +
                  allow(checker).to receive(:stop) { nil }
         | 
| 17 19 | 
             
                  checker
         | 
| 18 20 |  | 
| 19 21 | 
             
                }
         | 
| @@ -72,6 +74,8 @@ describe MailHandler::Receiver do | |
| 72 74 | 
             
                    allow(checker).to receive(:search_result) { false }
         | 
| 73 75 | 
             
                    allow(checker).to receive(:found_emails) { [] }
         | 
| 74 76 | 
             
                    allow(checker).to receive(:reset_found_emails) { [] }
         | 
| 77 | 
            +
                    allow(checker).to receive(:start) { nil }
         | 
| 78 | 
            +
                    allow(checker).to receive(:stop) { nil }
         | 
| 75 79 | 
             
                    checker
         | 
| 76 80 |  | 
| 77 81 | 
             
                  }
         | 
| @@ -54,12 +54,6 @@ describe MailHandler::Receiving::IMAPChecker do | |
| 54 54 |  | 
| 55 55 | 
             
                context 'invalid' do
         | 
| 56 56 |  | 
| 57 | 
            -
                  it 'by date' do
         | 
| 58 | 
            -
             | 
| 59 | 
            -
                    expect { checker.find({:since => Time.now}) }.to raise_error MailHandler::Error
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                  end
         | 
| 62 | 
            -
             | 
| 63 57 | 
             
                  it 'by_test' do
         | 
| 64 58 |  | 
| 65 59 | 
             
                    expect { checker.find({:by_test => 'test'}) }.to raise_error MailHandler::Error
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mailhandler
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.22
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Igor Balos
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-02- | 
| 11 | 
            +
            date: 2016-02-03 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: mail
         | 
| @@ -67,6 +67,7 @@ files: | |
| 67 67 | 
             
            - lib/mailhandler/receiving/filelist/filter/email.rb
         | 
| 68 68 | 
             
            - lib/mailhandler/receiving/folder.rb
         | 
| 69 69 | 
             
            - lib/mailhandler/receiving/imap.rb
         | 
| 70 | 
            +
            - lib/mailhandler/receiving/mail.rb
         | 
| 70 71 | 
             
            - lib/mailhandler/receiving/notification/console.rb
         | 
| 71 72 | 
             
            - lib/mailhandler/receiving/notification/email.rb
         | 
| 72 73 | 
             
            - lib/mailhandler/receiving/notification/email/content.rb
         |