mailhandler 1.0.52 → 1.0.57

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
  SHA256:
3
- metadata.gz: c7a197abe40976a389b5ff18bec02184905627083f5e4c75f1822c5040845e29
4
- data.tar.gz: cf09e5646d042c4ff3837827db41b08c0905f8d3563143258b381bfa1121ad36
3
+ metadata.gz: eb1c79224a2d06818e5fe0d17efb43582e3bc4493e0a96059ade1ce0a040210d
4
+ data.tar.gz: 65a3032f84a5f0485b8d9e59768d3641d74ffeb32731d06854e18828fb975211
5
5
  SHA512:
6
- metadata.gz: 47dc5ceb61e9f9239c98e4cacca9e840dfd0e659455ce5cee7e6a17f85f5a5f40e33d0b2da9428d32c456b77bd015fc9f12b4dac419c540dfc8f8281283b85f9
7
- data.tar.gz: 3edc28dced7fe3dbba39964c157120fb1600a9c1662534beef6c98ebec54a1ccddd4f7ac08d2dd994f201e3214293ca86bbb74dffdc066aa7cbc13d145e77ea0
6
+ metadata.gz: b95a623ebf0d6c1d06f2f8de30ff4f8123ae0cb9d5bde77d2b61f088af958154bf1c7626db84137cd5ded7e3734b79ad0fda345cec2f88e8784583c9aeb8706d
7
+ data.tar.gz: 33e8d8113c5bdc964564a034c9113a98ad571acc1fd824448a6b6def2363c82b8e72dc98bcd15042ae0656cf27d84cedd698d0d61541688dd80ff4b4ad44ea22
data/lib/mailhandler.rb CHANGED
@@ -34,12 +34,7 @@ module MailHandler
34
34
  #
35
35
  def sender(type = :postmark_api, settings = {})
36
36
  handler = Handler.new
37
- handler.init_sender(type)
38
-
39
- settings.each do |setting_name, setting_value|
40
- handler.sender.dispatcher.instance_variable_set("@#{setting_name}", setting_value)
41
- end
42
-
37
+ handler.init_sender(type, settings)
43
38
  yield(handler.sender.dispatcher) if block_given?
44
39
 
45
40
  handler.sender
@@ -72,12 +67,7 @@ module MailHandler
72
67
  #
73
68
  def receiver(type = :folder, settings = {})
74
69
  handler = Handler.new
75
- handler.init_receiver(type, settings[:notifications])
76
-
77
- settings.each do |setting_name, setting_value|
78
- handler.receiver.checker.instance_variable_set("@#{setting_name}", setting_value)
79
- end
80
-
70
+ handler.init_receiver(type, settings)
81
71
  yield(handler.receiver.checker) if block_given?
82
72
  handler.receiver
83
73
  end
@@ -96,16 +86,30 @@ module MailHandler
96
86
  attr_accessor :sender,
97
87
  :receiver
98
88
 
99
- def init_sender(type = :postmark_api)
89
+ def init_sender(type = :postmark_api, settings = {})
100
90
  verify_type(type, SENDER_TYPES)
101
91
  @sender = MailHandler::Sender.new(SENDER_TYPES[type].new)
92
+
93
+ settings.each do |setting_name, setting_value|
94
+ if @sender.dispatcher.respond_to?(setting_name)
95
+ @sender.dispatcher.instance_variable_set("@#{setting_name}", setting_value)
96
+ end
97
+ end
98
+
99
+ @sender
102
100
  end
103
101
 
104
- def init_receiver(type = :folder, notifications = [])
102
+ def init_receiver(type = :folder, settings = {})
105
103
  verify_type(type, CHECKER_TYPES)
106
104
  receiver = MailHandler::Receiver.new(CHECKER_TYPES[type].new)
107
105
 
108
- add_receiving_notifications(receiver, notifications)
106
+ settings.each do |setting_name, setting_value|
107
+ if receiver.checker.respond_to?(setting_name)
108
+ receiver.checker.instance_variable_set("@#{setting_name}", setting_value)
109
+ end
110
+ end
111
+
112
+ add_receiving_notifications(receiver, settings[:notifications])
109
113
  @receiver = receiver
110
114
  end
111
115
 
@@ -8,6 +8,8 @@ module MailHandler
8
8
  end
9
9
  end
10
10
 
11
+ class SearchEmailError < Error; end
12
+ class SendEmailError < Error; end
11
13
  class UnknownError < Error; end
12
14
  class TypeError < Error; end
13
15
  class FileError < Error; end
@@ -4,6 +4,7 @@ require_relative 'receiving/folder'
4
4
  require_relative 'receiving/imap'
5
5
  require_relative 'extensions/mail/imap'
6
6
  require_relative 'receiving/observer'
7
+ require_relative 'errors'
7
8
 
8
9
  module MailHandler
9
10
  # handling receiving email
@@ -13,7 +14,8 @@ module MailHandler
13
14
  attr_accessor :checker,
14
15
  :search,
15
16
  :max_search_duration,
16
- :search_frequency
17
+ :search_frequency,
18
+ :validate_result
17
19
 
18
20
  module DEFAULTS
19
21
  MAX_SEARCH_DURATION = 240 # maximum time for search to last in [seconds]
@@ -36,6 +38,7 @@ module MailHandler
36
38
  @checker = checker
37
39
  @max_search_duration = DEFAULTS::MAX_SEARCH_DURATION
38
40
  @search_frequency = DEFAULTS::SEARCH_FREQUENCY
41
+ @validate_result = false
39
42
  end
40
43
 
41
44
  def find_email(options)
@@ -52,10 +55,18 @@ module MailHandler
52
55
  checker.search_result
53
56
  ensure
54
57
  checker.stop
58
+ check_result
55
59
  end
56
60
 
57
61
  private
58
62
 
63
+ def check_result
64
+ return unless validate_result
65
+ return if checker.search_result
66
+
67
+ raise SearchEmailError, "Email searched by #{@search.options} not found for #{@search.max_duration} seconds."
68
+ end
69
+
59
70
  def single_search(options)
60
71
  received = checker.find(options)
61
72
  update_search_details
@@ -90,7 +90,7 @@ module MailHandler
90
90
 
91
91
  count = options[:count]
92
92
  error_message = "Incorrect option options[:count]=#{options[:count]}."
93
- raise MailHandler::Error, error_message if (count <0) || (count > 2000)
93
+ raise MailHandler::Error, error_message if (count < 0) || (count > 2000)
94
94
  end
95
95
 
96
96
  def validate_used_options(options)
@@ -3,12 +3,14 @@
3
3
  require_relative 'sending/smtp'
4
4
  require_relative 'sending/api'
5
5
  require_relative 'sending/api_batch'
6
+ require_relative 'errors'
6
7
 
7
8
  module MailHandler
8
9
  # Class for sending email, and storing details about the sending.
9
10
  class Sender
10
11
  attr_accessor :dispatcher,
11
- :sending
12
+ :sending,
13
+ :validate_response
12
14
 
13
15
  # @param [Time] - sending started at Time
14
16
  # @param [Time] - sending finished at Time
@@ -21,13 +23,14 @@ module MailHandler
21
23
  def initialize(dispatcher)
22
24
  @dispatcher = dispatcher
23
25
  @sending = Sending.new
26
+ @validate_response = false
24
27
  end
25
28
 
26
29
  def send_email(email)
27
30
  init_sending_details(email)
28
31
  response = dispatcher.send(email)
29
32
  update_sending_details(response)
30
-
33
+ check_response(response)
31
34
  response
32
35
  end
33
36
 
@@ -37,6 +40,13 @@ module MailHandler
37
40
 
38
41
  private
39
42
 
43
+ def check_response(response)
44
+ return unless validate_response
45
+ return if dispatcher.valid_response?(response)
46
+
47
+ raise SendEmailError, "Invalid sending response: #{response}."
48
+ end
49
+
40
50
  def init_sending_details(email)
41
51
  @sending = Sending.new
42
52
  @sending.started_at = Time.now
@@ -27,7 +27,8 @@ module MailHandler
27
27
  def send(email)
28
28
  verify_email(email)
29
29
  init_client
30
- client.deliver_message(email)
30
+ response = client.deliver_message(email)
31
+ format_response(response)
31
32
  end
32
33
 
33
34
  def client
@@ -45,11 +46,30 @@ module MailHandler
45
46
  host: host, secure: @use_ssl)
46
47
  end
47
48
 
49
+ def valid_response?(response)
50
+ response[:message].to_s.strip.downcase == 'ok' && response[:error_code].to_s.downcase == '0'
51
+ end
52
+
53
+ def timeout=(value)
54
+ @http_open_timeout = value
55
+ @http_read_timeout = value
56
+ end
57
+
48
58
  DEFAULTS = {
49
59
  host: 'api.postmarkapp.com',
50
- read_timeout: 15,
51
- open_timeout: 15
60
+ read_timeout: 60,
61
+ open_timeout: 60
52
62
  }.freeze
63
+
64
+ protected
65
+
66
+ def format_response(response)
67
+ return response unless response.is_a? Hash
68
+ return response if response.keys.select { |key| key.is_a? Symbol }.empty?
69
+
70
+ response.keys.select { |key| key.is_a? String }.each { |s| response.delete(s) }
71
+ response
72
+ end
53
73
  end
54
74
  end
55
75
  end
@@ -14,11 +14,20 @@ module MailHandler
14
14
  def send(emails)
15
15
  verify_email(emails)
16
16
  init_client
17
- client.deliver_messages(emails)
17
+ response = client.deliver_messages(emails)
18
+ format_response(response)
19
+ end
20
+
21
+ def valid_response?(responses)
22
+ responses.map { |response| super(response) }.all?(true)
18
23
  end
19
24
 
20
25
  protected
21
26
 
27
+ def format_response(response)
28
+ response.map { |r| super(r) }
29
+ end
30
+
22
31
  def verify_email(emails)
23
32
  return if emails.is_a?(Array) && emails.all? { |e| e.is_a? allowed_email_type }
24
33
 
@@ -13,6 +13,10 @@ module MailHandler
13
13
  raise MailHandler::InterfaceError, 'Send interface not implemented.'
14
14
  end
15
15
 
16
+ def valid_response?(_response)
17
+ raise MailHandler::InterfaceError, 'Method not implemented.'
18
+ end
19
+
16
20
  protected
17
21
 
18
22
  def verify_email(email)
@@ -12,7 +12,8 @@ module MailHandler
12
12
  :username,
13
13
  :password,
14
14
  :authentication,
15
- :use_ssl
15
+ :use_ssl,
16
+ :openssl_verify_mode
16
17
 
17
18
  attr_accessor :open_timeout,
18
19
  :read_timeout,
@@ -42,6 +43,15 @@ module MailHandler
42
43
  save_response ? response : nil
43
44
  end
44
45
 
46
+ def valid_response?(response)
47
+ response.string.to_s.downcase.include?('250 2.0.0 ok')
48
+ end
49
+
50
+ def timeout=(value)
51
+ @read_timeout = value
52
+ @open_timeout = value
53
+ end
54
+
45
55
  private
46
56
 
47
57
  def init_net_smtp
@@ -66,6 +76,7 @@ module MailHandler
66
76
  password: password,
67
77
  authentication: @authentication,
68
78
  enable_starttls_auto: @use_ssl,
79
+ openssl_verify_mode: @openssl_verify_mode,
69
80
 
70
81
  return_response: save_response,
71
82
  open_timeout: open_timeout,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MailHandler
4
- VERSION = '1.0.52'
4
+ VERSION = '1.0.57'
5
5
  end
@@ -59,6 +59,34 @@ describe MailHandler::Receiver do
59
59
  end
60
60
  end
61
61
 
62
+ describe '.search not found' do
63
+ let(:checker) do
64
+ checker = instance_double('Checker')
65
+
66
+ allow(checker).to receive(:find).and_return(false)
67
+ allow(checker).to receive(:search_result).and_return(false)
68
+ allow(checker).to receive(:found_emails).and_return([])
69
+ allow(checker).to receive(:reset_found_emails).and_return([])
70
+ allow(checker).to receive(:start).and_return(nil)
71
+ allow(checker).to receive(:stop).and_return(nil)
72
+ checker
73
+ end
74
+
75
+ it "raise error" do
76
+ receiver.max_search_duration = 3
77
+ receiver.validate_result=true
78
+ expect { receiver.find_email(default_search_option) }.
79
+ to raise_error(MailHandler::SearchEmailError,
80
+ "Email searched by {:by_subject=>\"test\"} not found for 3 seconds.")
81
+ end
82
+
83
+ it "do not raise error" do
84
+ receiver.max_search_duration = 3
85
+ receiver.validate_result=false
86
+ expect(receiver.find_email(default_search_option)).to be false
87
+ end
88
+ end
89
+
62
90
  describe '.search' do
63
91
  let(:checker) do
64
92
  checker = instance_double('Checker')
@@ -67,7 +95,7 @@ describe MailHandler::Receiver do
67
95
  sleep 1
68
96
  false
69
97
  end
70
- allow(checker).to receive(:search_result).and_return(false)
98
+ allow(checker).to receive(:search_result).and_return(true)
71
99
  allow(checker).to receive(:found_emails).and_return([])
72
100
  allow(checker).to receive(:reset_found_emails).and_return([])
73
101
  allow(checker).to receive(:start).and_return(nil)
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.52
4
+ version: 1.0.57
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Balos
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-16 00:00:00.000000000 Z
11
+ date: 2021-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -114,8 +114,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  - !ruby/object:Gem::Version
115
115
  version: 1.9.3
116
116
  requirements: []
117
- rubygems_version: 3.1.2
118
- signing_key:
117
+ rubygems_version: 3.2.3
118
+ signing_key:
119
119
  specification_version: 4
120
120
  summary: Postmark email receiving and sending handler.
121
121
  test_files: []