mailhandler 1.0.52 → 1.0.57

Sign up to get free protection for your applications and to get access to all the features.
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: []