mailhandler 1.0.17 → 1.0.18

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: e2494cc0dc22949823fe4c21f75ff4c358ce78da
4
- data.tar.gz: 56ef36817c503bec109aeb97492ca0380275d569
3
+ metadata.gz: 083df235cda02401f6ed87e997e235def311840e
4
+ data.tar.gz: bbc739fa0de274bb0d87733a418346d796526c3f
5
5
  SHA512:
6
- metadata.gz: 77b6c9b2f301025df73abe7f4fcc595c0088605e8df4718b9f7385bd11be1b32802b4b39b326b3d8e419816bd5a54d8213dff61852e871158c0cf488647211ac
7
- data.tar.gz: d5b01f41f9fbb8675aaccf2b28e36b1e99a703bae3b104e582c1a613a72b2fefe660c7c010725bc3d10d61a0aa62741854f661ab903da8c37e1e696909993e90
6
+ metadata.gz: a067e385d21369f0eef498fc2c6f3843fe40ccb134f917e0b32b5e344660b8c7812f834b5cdba0e73e6c8c7f5760e21edc8e0d827496f8057f8160e9cc6d2c8c
7
+ data.tar.gz: 3b5f4dac54ef936fd3976dc847bfe82691c5656032bf243e57c5f9186ec37d294f256f69bf5e1aaf77a562bf5d0537e2f17385dca406f9d3ba08eb116f719186
@@ -11,21 +11,12 @@ module MailHandler
11
11
  class Checker
12
12
 
13
13
  attr_accessor :search_options,
14
- :found_emails
15
-
16
- AVAILABLE_SEARCH_OPTIONS = [
17
-
18
- :by_subject,
19
- :by_content,
20
- :by_date,
21
- :by_recipient,
22
- :count,
23
- :archive
24
-
25
- ]
14
+ :found_emails,
15
+ :available_search_options
26
16
 
27
17
  def initialize
28
18
 
19
+ @available_search_options = AVAILABLE_SEARCH_OPTIONS
29
20
  set_base_search_options
30
21
  reset_found_emails
31
22
 
@@ -49,6 +40,19 @@ module MailHandler
49
40
 
50
41
  end
51
42
 
43
+ private
44
+
45
+ AVAILABLE_SEARCH_OPTIONS = [
46
+
47
+ :by_subject,
48
+ :by_content,
49
+ :since,
50
+ :by_recipient,
51
+ :count,
52
+ :archive
53
+
54
+ ]
55
+
52
56
  protected
53
57
 
54
58
  def verify_and_set_search_options(options)
@@ -64,9 +68,9 @@ module MailHandler
64
68
 
65
69
  def validate_option_values(options)
66
70
 
67
- if options[:by_date]
71
+ if options[:since]
68
72
 
69
- raise MailHandler::Error, "Incorrect option options[:by_date]=#{options[:date]}." unless options[:by_date].is_a? Time
73
+ raise MailHandler::Error, "Incorrect option options[:since]=#{options[:since]}." unless options[:since].is_a? Time
70
74
 
71
75
  end
72
76
 
@@ -87,8 +91,8 @@ module MailHandler
87
91
 
88
92
  def validate_used_options(options)
89
93
 
90
- unless (options.keys - AVAILABLE_SEARCH_OPTIONS).empty?
91
- raise MailHandler::Error, "#{(options.keys - AVAILABLE_SEARCH_OPTIONS)} - Incorrect search option values, options are #{AVAILABLE_SEARCH_OPTIONS}."
94
+ unless (options.keys - available_search_options).empty?
95
+ raise MailHandler::Error, "#{(options.keys - available_search_options)} - Incorrect search option values, options are #{available_search_options}."
92
96
  end
93
97
 
94
98
  end
@@ -73,8 +73,11 @@ module MailHandler
73
73
 
74
74
  def file_match_filter?(file)
75
75
 
76
+ # TODO: add UTF support
77
+ # string need to be read and converted
78
+ # read_email(file_content).subject.include?(@content) - 10x slower, use something else for reading
79
+ # Mail::Encodings.unquote_and_convert_to(content, "UTF-8") - 6x slower
76
80
  File.read(file).include? @content
77
- #read_email(file_content).subject.include?(@content) slow, use something else for reading
78
81
 
79
82
  end
80
83
 
@@ -47,7 +47,7 @@ module MailHandler
47
47
 
48
48
  :by_subject => Filter::BySubject,
49
49
  :by_content => Filter::ByContent,
50
- :by_date => Filter::ByDate,
50
+ :since => Filter::ByDate,
51
51
  :by_recipient => Filter::Email::ByRecipient
52
52
  }
53
53
 
@@ -17,25 +17,10 @@ module MailHandler
17
17
  :authentication,
18
18
  :use_ssl
19
19
 
20
- # search options:
21
- # by_subject - String, search by a whole string as part of the subject of the email
22
- # by_content - String, search by a whole string as part of the content of the email
23
- # count - Int, number of found emails to return
24
- # archive - Boolean
25
- # by_recipient - Hash, accepts a hash like: :to => 'igor@example.com'
26
- AVAILABLE_SEARCH_OPTIONS = [
27
-
28
- :by_subject,
29
- :by_content,
30
- :count,
31
- :archive,
32
- :by_recipient
33
-
34
- ]
35
-
36
20
  def initialize
37
21
 
38
22
  super
23
+ @available_search_options = AVAILABLE_SEARCH_OPTIONS
39
24
 
40
25
  end
41
26
 
@@ -51,6 +36,22 @@ module MailHandler
51
36
 
52
37
  private
53
38
 
39
+ # search options:
40
+ # by_subject - String, search by a whole string as part of the subject of the email
41
+ # by_content - String, search by a whole string as part of the content of the email
42
+ # count - Int, number of found emails to return
43
+ # archive - Boolean
44
+ # by_recipient - Hash, accepts a hash like: :to => 'igor@example.com'
45
+ AVAILABLE_SEARCH_OPTIONS = [
46
+
47
+ :by_subject,
48
+ :by_content,
49
+ :count,
50
+ :archive,
51
+ :by_recipient
52
+
53
+ ]
54
+
54
55
  # delegate retrieval details to Mail library
55
56
  def init_retriever
56
57
 
@@ -13,7 +13,8 @@ module MailHandler
13
13
  attr_reader :sender,
14
14
  :contacts,
15
15
  :min_time_to_notify,
16
- :max_time_to_notify
16
+ :max_time_to_notify,
17
+ :current_state
17
18
 
18
19
  def initialize(sender, contacts, min_time_to_notify = 60)
19
20
 
@@ -8,6 +8,10 @@ module MailHandler
8
8
 
9
9
  class EmailContent
10
10
 
11
+ # @param [Hash] options - search options used for searching for an email
12
+ # @param [Int] delay - delay in seconds
13
+ # @param [String] from - email address
14
+ # @param [String] to - email address
11
15
  def self.email_received(options, delay, from, to)
12
16
 
13
17
  Mail.new do
@@ -21,6 +25,10 @@ module MailHandler
21
25
 
22
26
  end
23
27
 
28
+ # @param [Hash] options - search options used for searching for an email
29
+ # @param [Int] delay - delay in seconds
30
+ # @param [String] from - email address
31
+ # @param [String] to - email address
24
32
  def self.email_delayed(options, delay, from, to)
25
33
 
26
34
  Mail.new do
@@ -28,7 +36,7 @@ module MailHandler
28
36
  from from
29
37
  subject "Over #{(delay.to_f/60).round(2)} minutes delay"
30
38
  body "Over #{(delay.to_f/60).round(2)} minutes delay - search by #{options}"
31
- to to
39
+ to to
32
40
 
33
41
  end
34
42
 
@@ -1,5 +1,5 @@
1
1
  module MailHandler
2
2
 
3
- VERSION = '1.0.17'
3
+ VERSION = '1.0.18'
4
4
 
5
5
  end
data/readme.md CHANGED
@@ -76,7 +76,9 @@ You can search local mailbox by following options:
76
76
  Recipient to search by needs to by added in the following form: `by_recipient => { :to => 'igor@example.com' }`.
77
77
  Library supports searching by :to, :cc recipients. At the moment, only searching by a single recipient email address is supported.
78
78
 
79
- If you would like email to be archived after its read, use `:archive => true` option (recommended)
79
+ If you would like email to be archived after its read, use `:archive => true` option (recommended).
80
+
81
+ **For now, Unicode is not supported for search by local mailbox, only ASCII.**
80
82
 
81
83
  ## Search results
82
84
 
@@ -26,4 +26,10 @@ describe MailHandler::Receiving::Checker do
26
26
 
27
27
  end
28
28
 
29
+ it '.search_result' do
30
+
31
+ expect(subject.search_result).to be false
32
+
33
+ end
34
+
29
35
  end
@@ -22,13 +22,13 @@ describe MailHandler::Receiving::FolderChecker do
22
22
  it 'by multiple search options' do
23
23
 
24
24
  time = Time.now
25
- checker.find({:by_subject => 'test', :by_content => 'test', :by_date => time, :by_recipient => 'igor@example.com'})
25
+ checker.find({:by_subject => 'test', :by_content => 'test', :since => time, :by_recipient => 'igor@example.com'})
26
26
  expect(checker.search_options).to eq(
27
27
  {:count=>50,
28
28
  :archive=>false,
29
29
  :by_subject => 'test',
30
30
  :by_content => 'test',
31
- :by_date => time,
31
+ :since => time,
32
32
  :by_recipient => 'igor@example.com'})
33
33
 
34
34
  end
@@ -57,20 +57,20 @@ describe MailHandler::Receiving::FolderChecker do
57
57
 
58
58
  end
59
59
 
60
- context 'by_date' do
60
+ context 'since' do
61
61
 
62
62
  it 'valid' do
63
63
 
64
64
  time = Time.now
65
- checker.find({:by_date => time})
66
- expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_date => time })
65
+ checker.find({:since => time})
66
+ expect(checker.search_options).to eq({:count=>50, :archive=>false, :since => time })
67
67
 
68
68
  end
69
69
 
70
70
  it 'invalid' do
71
71
 
72
72
  time = Time.now.to_s
73
- expect { checker.find({:by_date => time}) }.to raise_error MailHandler::Error
73
+ expect { checker.find({:since => time}) }.to raise_error MailHandler::Error
74
74
 
75
75
  end
76
76
 
@@ -125,7 +125,7 @@ describe MailHandler::Receiving::FolderChecker do
125
125
 
126
126
  it 'by date' do
127
127
 
128
- checker.find({:by_date => Time.now + 86400})
128
+ checker.find({:since => Time.now + 86400})
129
129
  expect(checker.found_emails).to be_empty
130
130
 
131
131
  end
@@ -144,6 +144,30 @@ describe MailHandler::Receiving::FolderChecker do
144
144
  let(:mail1) { Mail.read_from_string(File.read "#{data_folder}/email1.txt")}
145
145
  let(:mail2) { Mail.read_from_string(File.read "#{data_folder}/email2.txt")}
146
146
 
147
+ context 'search results' do
148
+
149
+ let(:search) {
150
+
151
+ checker.find({:by_subject => mail1.subject})
152
+ checker
153
+
154
+ }
155
+
156
+ it '.search_result' do
157
+
158
+ expect(search.search_result).to be true
159
+
160
+ end
161
+
162
+ it '.reset_found_emails' do
163
+
164
+ search.reset_found_emails
165
+ expect(search.search_result).to be false
166
+
167
+ end
168
+
169
+ end
170
+
147
171
  it 'result' do
148
172
 
149
173
  expect(checker.find({:by_subject => mail1.subject})).to be true
@@ -190,7 +214,7 @@ describe MailHandler::Receiving::FolderChecker do
190
214
 
191
215
  it 'by date' do
192
216
 
193
- checker.find({:by_date => Time.new(2015,10,12,13,30,0, "+02:00")})
217
+ checker.find({:since => Time.new(2015,10,12,13,30,0, "+02:00")})
194
218
  expect(checker.found_emails.size).to be 4
195
219
 
196
220
  end
@@ -0,0 +1,84 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe MailHandler::Receiving::IMAPChecker do
5
+
6
+ let(:checker) { MailHandler::Receiving::IMAPChecker.new }
7
+
8
+ it '.create' do
9
+
10
+ expect(checker).to be_kind_of MailHandler::Receiving::Checker
11
+
12
+ end
13
+
14
+ it 'options' do
15
+
16
+ expect(checker.search_options).to eq({:count=>50, :archive=>false})
17
+
18
+ end
19
+
20
+ context 'search options' do
21
+
22
+ before(:each) do
23
+
24
+ allow(checker).to receive(:init_retriever) { true }
25
+ allow(checker).to receive(:find_emails) { []}
26
+
27
+ end
28
+
29
+ it 'by multiple search options' do
30
+
31
+ checker.find({:by_subject => 'test', :by_content => 'test', :by_recipient => 'igor@example.com'})
32
+ expect(checker.search_options).to eq(
33
+ {:count=>50,
34
+ :archive=>false,
35
+ :by_subject => 'test',
36
+ :by_content => 'test',
37
+ :by_recipient => 'igor@example.com'})
38
+
39
+ end
40
+
41
+ it 'by_subject' do
42
+
43
+ checker.find({:by_subject => 'test'})
44
+ expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_subject=>'test'})
45
+
46
+ end
47
+
48
+ it 'by_content' do
49
+
50
+ checker.find({:by_content => 'test'})
51
+ expect(checker.search_options).to eq({:count=>50, :archive=>false, :by_content => 'test'})
52
+
53
+ end
54
+
55
+ context 'invalid' do
56
+
57
+ it 'by date' do
58
+
59
+ expect { checker.find({:since => Time.now}) }.to raise_error MailHandler::Error
60
+
61
+ end
62
+
63
+ it 'by_test' do
64
+
65
+ expect { checker.find({:by_test => 'test'}) }.to raise_error MailHandler::Error
66
+
67
+ end
68
+
69
+
70
+ end
71
+
72
+ context 'archive' do
73
+
74
+ it 'invalid' do
75
+
76
+ expect { checker.find({:archive => 'test'}) }.to raise_error MailHandler::Error
77
+
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -2,5 +2,78 @@ require 'spec_helper'
2
2
 
3
3
  describe MailHandler::Receiving::Notification::Email do
4
4
 
5
+ let(:search) { double('search') }
6
+ let(:sender) { double('sender') }
7
+ let(:notification) { MailHandler::Receiving::Notification::Email.new(sender, 'igor@example.com',1) }
8
+
9
+ before(:each) do
10
+
11
+ allow(sender).to receive(:send_email) { true }
12
+ allow(search).to receive(:max_duration) { 5 }
13
+
14
+ end
15
+
16
+ it '.create' do
17
+
18
+ aggregate_failures "init details" do
19
+
20
+ expect(notification.min_time_to_notify).to eq 1
21
+ expect(notification.max_time_to_notify).to eq nil
22
+ expect(notification.contacts).to eq 'igor@example.com'
23
+ expect(notification.sender).to eq sender
24
+
25
+ end
26
+
27
+ end
28
+
29
+ it '.notify' do
30
+
31
+ allow(search).to receive(:started_at) { Time.now }
32
+ notification.notify(search)
33
+ expect(notification.max_time_to_notify).to eq search.max_duration
34
+
35
+ end
36
+
37
+ context 'states' do
38
+
39
+ it 'no delay' do
40
+
41
+ allow(search).to receive(:started_at) { Time.now }
42
+ notification.notify(search)
43
+ expect(notification.current_state).to be_kind_of MailHandler::Receiving::Notification::NoDelay
44
+
45
+ end
46
+
47
+ it 'delayed' do
48
+
49
+ allow(search).to receive(:started_at) { Time.now - 2}
50
+ allow(search).to receive(:result) { false }
51
+ allow(notification).to receive(:send_email) { }
52
+ notification.notify(search)
53
+ expect(notification.current_state).to be_kind_of MailHandler::Receiving::Notification::Delay
54
+
55
+ end
56
+
57
+ it 'received' do
58
+
59
+ allow(search).to receive(:started_at) { Time.now - 2}
60
+ allow(search).to receive(:result) { true }
61
+ allow(notification).to receive(:send_email) { }
62
+ notification.notify(search)
63
+ expect(notification.current_state).to be_kind_of MailHandler::Receiving::Notification::Received
64
+
65
+ end
66
+
67
+ it 'max delayed' do
68
+
69
+ allow(search).to receive(:started_at) { Time.now - 10}
70
+ allow(search).to receive(:result) { false }
71
+ allow(notification).to receive(:send_email) { }
72
+ notification.notify(search)
73
+ expect(notification.current_state).to be_kind_of MailHandler::Receiving::Notification::MaxDelay
74
+
75
+ end
76
+
77
+ end
5
78
 
6
79
  end
@@ -19,7 +19,7 @@ describe MailHandler::Sending::PostmarkBatchAPISender do
19
19
 
20
20
  end
21
21
 
22
- it '.send' do
22
+ it '.send - invalid auth' do
23
23
 
24
24
  sender = subject.new(api_token)
25
25
  expect{sender.send([Mail.new])}.to raise_error Postmark::InvalidApiKeyError
@@ -19,7 +19,7 @@ describe MailHandler::Sending::PostmarkAPISender do
19
19
 
20
20
  end
21
21
 
22
- it '.send' do
22
+ it '.send - invalid auth' do
23
23
 
24
24
  sender = subject.new(api_token)
25
25
  expect{sender.send(Mail.new)}.to raise_error Postmark::InvalidApiKeyError
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe MailHandler::Sending::SMTPSender do
4
+
5
+ subject { MailHandler::Sending::SMTPSender }
6
+
7
+ context '.send' do
8
+
9
+ context 'invalid' do
10
+
11
+ it 'incorrect mail type' do
12
+
13
+ sender = subject.new
14
+ expect { sender.send('Test') }.to raise_error MailHandler::TypeError
15
+
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ end
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.17
4
+ version: 1.0.18
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-21 00:00:00.000000000 Z
11
+ date: 2015-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -87,12 +87,14 @@ files:
87
87
  - spec/unit/mailhandler/receiver_spec.rb
88
88
  - spec/unit/mailhandler/receiving/base_spec.rb
89
89
  - spec/unit/mailhandler/receiving/folder_spec.rb
90
+ - spec/unit/mailhandler/receiving/imap_spec.rb
90
91
  - spec/unit/mailhandler/receiving/notification/console_spec.rb
91
92
  - spec/unit/mailhandler/receiving/notification/email/content_spec.rb
92
93
  - spec/unit/mailhandler/receiving/notification/email_spec.rb
93
94
  - spec/unit/mailhandler/sender_spec.rb
94
95
  - spec/unit/mailhandler/sending/sender_api_batch_spec.rb
95
96
  - spec/unit/mailhandler/sending/sender_api_spec.rb
97
+ - spec/unit/mailhandler/sending/sender_smtp_spec.rb
96
98
  - spec/unit/mailhandler_spec.rb
97
99
  homepage: https://github.com/wildbit/mailhandler
98
100
  licenses: