mailhandler 1.0.9 → 1.0.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 638f7cfc88aa7e83259905c127723c0ecc5f26ea
4
- data.tar.gz: cbfdb4fa89e30bfd374e850cf63933f753589cac
3
+ metadata.gz: a290f9049b44faf3abc87592583dfd76063c5442
4
+ data.tar.gz: 61bdcf1d9d8c1355463d5e7bc0678158e7087864
5
5
  SHA512:
6
- metadata.gz: 78c12824348df632bacb66983cc0d0bd582619af1bca973825d4dcc605b29b14f48d39ff6e8ab79bc880f802bf3937750b74c2314c949cc1aee244fc8c7af891
7
- data.tar.gz: 83c3993bace242b2f05ec806f7a2ab8ef5fb478fe3acbdecb444e6be614ed92bc5a3d27f74ac3e0cf00b7be26e5190e831caaeb1f515ed8364770e162cf3837c
6
+ metadata.gz: c9c6e5a41a9f4dbb9ec1631be903839104f52fd10a1aec1d182dd9a320131481b29b79ad22c5368d40b7e422b77699fd3a567e2c59f7002f0b48683234020007
7
+ data.tar.gz: 6409f13a167cef7deaf8ebb9aac4be757626f5a39d148b77667f26e3da5025852d0f84a7d49078203d7c19e969a62aae525b7b1b810eb449b4ccc5075e23c56f
@@ -3,6 +3,10 @@ require_relative 'mailhandler/receiver'
3
3
 
4
4
  require_relative 'mailhandler/receiving/notification/email'
5
5
  require_relative 'mailhandler/receiving/notification/console'
6
+ require_relative 'mailhandler/errors'
7
+
8
+ # Main MailHandler class, that allows you to create sender and receiver objects.
9
+ # Sender objects for sending emails, receiver objects for receiving emails from certain mailboxes.
6
10
 
7
11
  module MailHandler
8
12
 
@@ -72,6 +76,7 @@ module MailHandler
72
76
 
73
77
  private
74
78
 
79
+ # method for adding custom notifications, in case email delivery is delayed.
75
80
  def add_receiving_notifications(receiver, notifications)
76
81
 
77
82
  if (notifications - NOTIFICATION_TYPES.keys).empty?
@@ -84,7 +89,7 @@ module MailHandler
84
89
 
85
90
  def verify_type(type, types)
86
91
 
87
- raise StandardError, "Unknown type - #{type}, possible options: #{types.keys}" unless types.keys.include? type
92
+ raise MailHandler::TypeError, "Unknown type - #{type}, possible options: #{types.keys}" unless types.keys.include? type
88
93
 
89
94
  end
90
95
 
@@ -0,0 +1,14 @@
1
+ module MailHandler
2
+
3
+ class Error < StandardError
4
+
5
+ def initialize(message = nil)
6
+ super(message)
7
+ end
8
+
9
+ end
10
+
11
+ class UnknownError < Error; end
12
+ class TypeError < Error; end
13
+
14
+ end
@@ -10,7 +10,7 @@ module MailHandler
10
10
 
11
11
  attr_accessor :checker,
12
12
  :search,
13
- :search_max_duration
13
+ :max_search_duration
14
14
 
15
15
  module DEFAULTS
16
16
 
@@ -32,7 +32,7 @@ module MailHandler
32
32
  def initialize(checker)
33
33
 
34
34
  @checker = checker
35
- @search_max_duration = DEFAULTS::MAX_SEARCH_DURATION
35
+ @max_search_duration = DEFAULTS::MAX_SEARCH_DURATION
36
36
 
37
37
  end
38
38
 
@@ -62,7 +62,7 @@ module MailHandler
62
62
  @search = Search.new
63
63
  @search.options = options
64
64
  @search.started_at = Time.now
65
- @search.max_duration = @search_max_duration
65
+ @search.max_duration = @max_search_duration
66
66
 
67
67
  end
68
68
 
@@ -78,7 +78,7 @@ module MailHandler
78
78
 
79
79
  def search_time_expired?
80
80
 
81
- (Time.now - search.started_at) > @search_max_duration
81
+ (Time.now - search.started_at) > @max_search_duration
82
82
 
83
83
  end
84
84
 
@@ -1,3 +1,5 @@
1
+ require_relative '../errors'
2
+
1
3
  module MailHandler
2
4
 
3
5
  module Receiving
@@ -22,21 +24,16 @@ module MailHandler
22
24
 
23
25
  ]
24
26
 
25
- DEFAULT_SEARCH_OPTIONS = [
26
-
27
- :archive
28
- ]
29
-
30
27
  def initialize
31
28
 
32
- base_search_options
29
+ set_base_search_options
33
30
  reset_found_emails
34
31
 
35
32
  end
36
33
 
37
34
  def find(options)
38
35
 
39
- raise StandardError, 'Method not implemented'
36
+ raise MailHandler::Error, 'Method not implemented'
40
37
 
41
38
  end
42
39
 
@@ -54,31 +51,61 @@ module MailHandler
54
51
 
55
52
  protected
56
53
 
57
- def base_search_options
54
+ def verify_and_set_search_options(options)
58
55
 
59
- # Default number of email results to return, and whether to archive emails.
60
- @search_options = {:count => 50, :archive => false}
56
+ validate_used_options(options)
57
+ validate_option_values(options)
58
+
59
+ set_base_search_options
60
+ add_additional_search_options(options)
61
+ reset_found_emails
61
62
 
62
63
  end
63
64
 
64
- def verify_and_set_search_options(options)
65
+ def validate_option_values(options)
65
66
 
66
- base_search_options
67
- validate_used_options(options)
67
+ if options[:by_date]
68
68
 
69
- @search_options = search_options.merge options
70
- reset_found_emails
69
+ raise MailHandler::Error, "Incorrect option options[:by_date]=#{options[:date]}" unless options[:by_date].is_a? Time
70
+
71
+ end
72
+
73
+ unless options[:count].nil?
74
+
75
+ count = options[:count]
76
+ raise MailHandler::Error, "Incorrect option options[:count]=#{options[:count]}" if count < 0 or count > 2000
77
+
78
+ end
79
+
80
+ if options[:archive]
81
+
82
+ raise MailHandler::Error, "Incorrect option options[:archive]=#{options[:archive]}" unless options[:archive] == true or options[:archive] == false
83
+
84
+ end
71
85
 
72
86
  end
73
87
 
74
88
  def validate_used_options(options)
75
89
 
76
90
  unless (options.keys - AVAILABLE_SEARCH_OPTIONS).empty?
77
- raise StandardError, "#{(options.keys - AVAILABLE_SEARCH_OPTIONS)} - Incorrect search option values, options are #{AVAILABLE_SEARCH_OPTIONS}"
91
+ raise MailHandler::Error, "#{(options.keys - AVAILABLE_SEARCH_OPTIONS)} - Incorrect search option values, options are #{AVAILABLE_SEARCH_OPTIONS}"
78
92
  end
79
93
 
80
94
  end
81
95
 
96
+ def set_base_search_options
97
+
98
+ # Default number of email results to return, and whether to archive emails.
99
+ @search_options = {:count => 50, :archive => false}
100
+
101
+ end
102
+
103
+ def add_additional_search_options(options)
104
+
105
+ @search_options = @search_options.merge options
106
+
107
+ end
108
+
82
109
  end
83
110
 
84
111
  end
@@ -56,7 +56,7 @@ module Filter
56
56
 
57
57
  def initialize(content)
58
58
 
59
- @content = content
59
+ @content = content.to_s
60
60
 
61
61
  end
62
62
 
@@ -1,6 +1,7 @@
1
1
  require_relative 'base.rb'
2
2
  require_relative 'filter'
3
3
  require 'mail'
4
+ require_relative '../errors'
4
5
 
5
6
  module MailHandler
6
7
 
@@ -107,7 +108,7 @@ module MailHandler
107
108
  # create folders if they don't exist
108
109
  def setup_inbox_folders
109
110
 
110
- raise StandardError, 'Folder variables are not set' if inbox_folder.nil? or archive_folder.nil?
111
+ raise MailHandler::Error, 'Folder variables are not set' if inbox_folder.nil? or archive_folder.nil?
111
112
 
112
113
  Dir::mkdir inbox_folder unless File.directory? inbox_folder
113
114
  Dir::mkdir archive_folder unless File.directory? archive_folder
@@ -1,6 +1,8 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'mail'
2
4
  require_relative 'base.rb'
3
- # encoding: utf-8
5
+ require_relative '../errors'
4
6
 
5
7
  module MailHandler
6
8
 
@@ -18,6 +20,7 @@ module MailHandler
18
20
  AVAILABLE_SEARCH_OPTIONS = [
19
21
 
20
22
  :by_subject,
23
+ :by_content,
21
24
  :count,
22
25
  :archive,
23
26
  :by_recipient
@@ -111,7 +114,11 @@ module MailHandler
111
114
 
112
115
  when :by_subject
113
116
 
114
- keys << 'SUBJECT' << options[:by_subject]
117
+ keys << 'SUBJECT' << options[:by_subject].to_s
118
+
119
+ when :by_content
120
+
121
+ keys << 'BODY' << options[:by_content].to_s
115
122
 
116
123
  else
117
124
 
@@ -128,7 +135,7 @@ module MailHandler
128
135
  def validate_options(options)
129
136
 
130
137
  unless (options.keys - AVAILABLE_SEARCH_OPTIONS).empty?
131
- raise StandardError, "#{(options.keys - AVAILABLE_SEARCH_OPTIONS)} - Not supported search option values for imap, options are #{AVAILABLE_SEARCH_OPTIONS}"
138
+ raise MailHandler::Error, "#{(options.keys - AVAILABLE_SEARCH_OPTIONS)} - Not supported search option values for imap, options are #{AVAILABLE_SEARCH_OPTIONS}"
132
139
  end
133
140
 
134
141
  end
@@ -1,5 +1,6 @@
1
1
  require_relative 'email/content'
2
2
  require_relative 'email/states'
3
+ require_relative '../../errors'
3
4
 
4
5
  module MailHandler
5
6
 
@@ -58,7 +59,7 @@ module MailHandler
58
59
 
59
60
  def verify_email_type(type)
60
61
 
61
- raise StandardError, "Incorrect type: #{type}, allowed types: #{EMAIL_TYPES}" unless EMAIL_TYPES.include? type
62
+ raise MailHandler::TypeError, "Incorrect type: #{type}, allowed types: #{EMAIL_TYPES}" unless EMAIL_TYPES.include? type
62
63
 
63
64
  end
64
65
 
@@ -1,4 +1,5 @@
1
1
  require_relative '../email'
2
+ require_relative '../../../errors'
2
3
 
3
4
  module MailHandler
4
5
 
@@ -25,7 +26,7 @@ module MailHandler
25
26
 
26
27
  def notify(search)
27
28
 
28
- raise StandardError, 'notify(search) interface has to be implemented'
29
+ raise MailHandler::Error, 'notify(search) interface has to be implemented'
29
30
 
30
31
  end
31
32
 
@@ -1,4 +1,5 @@
1
1
  require_relative 'api.rb'
2
+ require_relative '../errors'
2
3
 
3
4
  module MailHandler
4
5
 
@@ -18,7 +19,7 @@ module MailHandler
18
19
 
19
20
  def verify_email(emails)
20
21
 
21
- raise StandardError, "Invalid type error, only Array of Mail::Message object types for sending allowed" unless emails.is_a?(Array) && emails.all? { |e| e.is_a? Mail::Message }
22
+ raise MailHandler::TypeError, "Invalid type error, only Array of Mail::Message object types for sending allowed" unless emails.is_a?(Array) && emails.all? { |e| e.is_a? Mail::Message }
22
23
 
23
24
  end
24
25
 
@@ -1,3 +1,5 @@
1
+ require_relative '../errors'
2
+
1
3
  module MailHandler
2
4
 
3
5
  module Sending
@@ -10,7 +12,15 @@ module MailHandler
10
12
 
11
13
  def verify_email(email)
12
14
 
13
- raise StandardError, "Invalid type error, only #{Mail.new.class} object type for sending allowed" unless email.is_a? Mail.new.class
15
+ raise MailHandler::TypeError, "Invalid type error, only #{allowed_email_type} object type for sending allowed" unless email.is_a? allowed_email_type
16
+
17
+ end
18
+
19
+ private
20
+
21
+ def allowed_email_type
22
+
23
+ Mail::Message
14
24
 
15
25
  end
16
26
 
@@ -1,5 +1,5 @@
1
1
  module MailHandler
2
2
 
3
- VERSION = '1.0.9'
3
+ VERSION = '1.0.10'
4
4
 
5
5
  end
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.files = `git ls-files`.split($/)
21
21
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
22
- s.homepage = 'https://github.com/wildbit'
22
+ s.homepage = 'https://github.com/wildbit/mailhandler'
23
23
  s.require_paths = ["lib"]
24
24
 
25
25
  s.post_install_message = %q{
data/readme.md CHANGED
@@ -61,11 +61,16 @@ email_receiver.find_email(:by_subject => subject, :archive => true)
61
61
  You can search imap mailbox by following options:
62
62
 
63
63
  * `:by_subject` - subject of the email
64
+ * `:by_content` - search email content by keywords
65
+ * `:by_recipient` - by email recipient
64
66
 
65
67
  You can search local mailbox by following options:
66
68
 
67
69
  * `:by_subject` - subject of the email
68
70
  * `:by_recipient` - by email recipient
71
+ * `:by_content` - search email content by keywords
72
+
73
+ Recipient to search by needs to by added in following form: `by_recipient => { :to => 'igor@example.com' }`.
69
74
 
70
75
  If you would like email to be archived after its read, use `:archive => true` option (recommended)
71
76
 
@@ -23,7 +23,7 @@ describe MailHandler::Receiver do
23
23
 
24
24
  it { is_expected.to respond_to(:checker) }
25
25
  it { is_expected.to respond_to(:search) }
26
- it { is_expected.to respond_to(:search_max_duration) }
26
+ it { is_expected.to respond_to(:max_search_duration) }
27
27
 
28
28
  end
29
29
 
@@ -31,7 +31,7 @@ describe MailHandler::Receiver do
31
31
 
32
32
  it { is_expected.to respond_to(:checker=) }
33
33
  it { is_expected.to respond_to(:search=) }
34
- it { is_expected.to respond_to(:search_max_duration=) }
34
+ it { is_expected.to respond_to(:max_search_duration=) }
35
35
 
36
36
  end
37
37
 
@@ -80,7 +80,7 @@ describe MailHandler::Receiver do
80
80
 
81
81
  it "max duration - #{duration} seconds" do
82
82
 
83
- receiver.search_max_duration = duration
83
+ receiver.max_search_duration = duration
84
84
  receiver.find_email(default_search_option)
85
85
 
86
86
  expect(receiver.search.duration).to be_within(1).of(duration)
@@ -20,4 +20,10 @@ describe MailHandler::Receiving::Checker do
20
20
 
21
21
  end
22
22
 
23
+ it '.find' do
24
+
25
+ expect { subject.find(:by_subject => 'test') }.to raise_error(MailHandler::Error, 'Method not implemented')
26
+
27
+ end
28
+
23
29
  end
@@ -18,13 +18,93 @@ describe MailHandler::Receiving::FolderChecker do
18
18
 
19
19
  context 'search options' do
20
20
 
21
- it 'default' do
21
+ it 'by multiple search options' do
22
+
23
+ time = Time.now
24
+ checker.find({:by_subject => 'test', :by_content => 'test', :by_date => time, :by_recipient => 'igor@example.com'})
25
+ expect(checker.search_options).to eq(
26
+ {:count=>50,
27
+ :archive=>false,
28
+ :by_subject => 'test',
29
+ :by_content => 'test',
30
+ :by_date => time,
31
+ :by_recipient => 'igor@example.com'})
32
+
33
+ end
34
+
35
+ it 'by_subject' do
22
36
 
23
37
  checker.find({:by_subject => 'test'})
24
38
  expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_subject=>'test'})
25
39
 
26
40
  end
27
41
 
42
+ it 'by_content' do
43
+
44
+ checker.find({:by_content => 'test'})
45
+ expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_content => 'test'})
46
+
47
+ end
48
+
49
+ context 'archive' do
50
+
51
+ it 'invalid' do
52
+
53
+ expect { checker.find({:archive => 'test'}) }.to raise_error MailHandler::Error
54
+
55
+ end
56
+
57
+ end
58
+
59
+ context 'by_date' do
60
+
61
+ it 'valid' do
62
+
63
+ time = Time.now
64
+ checker.find({:by_date => time})
65
+ expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_date => time })
66
+
67
+ end
68
+
69
+ it 'invalid' do
70
+
71
+ time = Time.now.to_s
72
+ expect { checker.find({:by_date => time}) }.to raise_error MailHandler::Error
73
+
74
+ end
75
+
76
+ end
77
+
78
+ it 'by_recipient' do
79
+
80
+ checker.find({:by_recipient => 'igor@example.com'})
81
+ expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_recipient => 'igor@example.com' })
82
+
83
+ end
84
+
85
+ context 'count' do
86
+
87
+ it 'valid' do
88
+
89
+ checker.find({:count => 1})
90
+ expect(checker.search_options).to eq({:count=>1, :archive=>false})
91
+
92
+ end
93
+
94
+ it 'invalid - below limit' do
95
+
96
+ expect { checker.find({:count => -1}) }.to raise_error MailHandler::Error
97
+
98
+ end
99
+
100
+ it 'invalid - above limit' do
101
+
102
+ expect { checker.find({:count => 3000 }) }.to raise_error MailHandler::Error
103
+
104
+ end
105
+
106
+ end
107
+
28
108
  end
29
109
 
30
110
  context 'not found' do
@@ -3,5 +3,4 @@ require 'spec_helper'
3
3
  describe MailHandler::Receiving::Notification::Email do
4
4
 
5
5
 
6
-
7
6
  end
@@ -32,7 +32,7 @@ describe MailHandler::Sending::PostmarkBatchAPISender do
32
32
 
33
33
  sender = subject.new(api_token)
34
34
  expect{sender.send('test')}.
35
- to raise_error StandardError, 'Invalid type error, only Array of Mail::Message object types for sending allowed'
35
+ to raise_error MailHandler::TypeError, 'Invalid type error, only Array of Mail::Message object types for sending allowed'
36
36
 
37
37
  end
38
38
 
@@ -40,7 +40,7 @@ describe MailHandler::Sending::PostmarkBatchAPISender do
40
40
 
41
41
  sender = subject.new(api_token)
42
42
  expect{sender.send([1,2,2])}.
43
- to raise_error StandardError, 'Invalid type error, only Array of Mail::Message object types for sending allowed'
43
+ to raise_error MailHandler::TypeError, 'Invalid type error, only Array of Mail::Message object types for sending allowed'
44
44
 
45
45
  end
46
46
 
@@ -9,7 +9,7 @@ describe MailHandler::Handler do
9
9
  it 'create - invalid type' do
10
10
 
11
11
  expect { subject.init_receiver(:test) }.
12
- to raise_error(StandardError, 'Unknown type - test, possible options: [:folder, :imap]')
12
+ to raise_error(MailHandler::TypeError, 'Unknown type - test, possible options: [:folder, :imap]')
13
13
 
14
14
  end
15
15
 
@@ -32,7 +32,7 @@ describe MailHandler::Handler do
32
32
  it 'create - invalid type' do
33
33
 
34
34
  expect { subject.init_sender(:test) }.
35
- to raise_error(StandardError, 'Unknown type - test, possible options: [:postmark_api, :postmark_batch_api, :smtp]')
35
+ to raise_error(MailHandler::TypeError, 'Unknown type - test, possible options: [:postmark_api, :postmark_batch_api, :smtp]')
36
36
 
37
37
  end
38
38
 
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.9
4
+ version: 1.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Balos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-11 00:00:00.000000000 Z
11
+ date: 2015-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -59,6 +59,7 @@ files:
59
59
  - Gemfile.lock
60
60
  - Rakefile
61
61
  - lib/mailhandler.rb
62
+ - lib/mailhandler/errors.rb
62
63
  - lib/mailhandler/receiver.rb
63
64
  - lib/mailhandler/receiving/base.rb
64
65
  - lib/mailhandler/receiving/filter.rb
@@ -90,7 +91,7 @@ files:
90
91
  - spec/unit/mailhandler/sending/sender_api_batch_spec.rb
91
92
  - spec/unit/mailhandler/sending/sender_api_spec.rb
92
93
  - spec/unit/mailhandler_spec.rb
93
- homepage: https://github.com/wildbit
94
+ homepage: https://github.com/wildbit/mailhandler
94
95
  licenses:
95
96
  - MIT
96
97
  metadata: {}