mailhandler 1.0.53 → 1.0.59

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: ada1ede9480ecca3ccdd3e20a3cde4a572862fc4c92df3085d0e7ad3b4ee706b
4
- data.tar.gz: b5766d76b779a52c8f17ffe16af6aa85339079fa5ec2c62987436b7f3f78ff33
3
+ metadata.gz: 922df060ca41561a56d889b8a68c1f772d49ac30667c8c98a1df11caddb96cfa
4
+ data.tar.gz: 8e2b840dbe67e91dd5db768ea6dfe77365d4ecacee1957818ad186f8d936588d
5
5
  SHA512:
6
- metadata.gz: ccf98235acb4d8e5006eeefc75bf79e0e503dca6ce642a7375ab65c343b61f78b8969f4a03c92dc44e8d0fdb3eed4ef081e5765f51c33cb6263e205d08e8d2b2
7
- data.tar.gz: 0e094b8e7a768a5c9696ff27d32d8d0a8fce5737da69708909c2724059d1d6eecdf9e5e1b6b9b84f4026ea30d1834515fa9208d4aac4cdca913cb5377a80b33a
6
+ metadata.gz: 263a717a84589e47f673f92209002b8bf3c9f5affc8ac103d36e44e77bfa2000626e9c73b2d4669b0c21a3f568cdc20f186a05f380a97526e4db19f5927dd0a7
7
+ data.tar.gz: a86f93fecdfd7985ddb393dc42a132ad14b0ed8fe738d0eb9ec3c5abdd0e6e89e224a87b3beec57acc7616c9656a46c895dce10d0807c951646c5064540e134b
data/lib/mailhandler.rb CHANGED
@@ -91,7 +91,9 @@ module MailHandler
91
91
  @sender = MailHandler::Sender.new(SENDER_TYPES[type].new)
92
92
 
93
93
  settings.each do |setting_name, setting_value|
94
- @sender.dispatcher.instance_variable_set("@#{setting_name}", setting_value)
94
+ if @sender.dispatcher.respond_to?(setting_name)
95
+ @sender.dispatcher.instance_variable_set("@#{setting_name}", setting_value)
96
+ end
95
97
  end
96
98
 
97
99
  @sender
@@ -102,7 +104,9 @@ module MailHandler
102
104
  receiver = MailHandler::Receiver.new(CHECKER_TYPES[type].new)
103
105
 
104
106
  settings.each do |setting_name, setting_value|
105
- receiver.checker.instance_variable_set("@#{setting_name}", setting_value)
107
+ if receiver.checker.respond_to?(setting_name)
108
+ receiver.checker.instance_variable_set("@#{setting_name}", setting_value)
109
+ end
106
110
  end
107
111
 
108
112
  add_receiving_notifications(receiver, settings[:notifications])
@@ -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
@@ -0,0 +1,22 @@
1
+ module Mail
2
+ # wrapper methods to support sending raw email, where recipient and sender can be custom
3
+ class SMTP
4
+ def deliver_raw!(raw_source_email, smtp_from, smtp_to)
5
+ response = start_smtp_session do |smtp|
6
+ Mail::SMTPConnection.new(:connection => smtp, :return_response => true).
7
+ deliver_raw!(raw_source_email, smtp_from, smtp_to)
8
+ end
9
+
10
+ settings[:return_response] ? response : self
11
+ end
12
+ end
13
+
14
+ # wrapper methods to support sending raw email, where recipient and sender can be custom
15
+ class SMTPConnection
16
+ def deliver_raw!(raw_source_email, smtp_from, smtp_to)
17
+ response = smtp.sendmail(dot_stuff(raw_source_email), smtp_from, smtp_to)
18
+
19
+ settings[:return_response] ? response : self
20
+ end
21
+ end
22
+ 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
@@ -3,6 +3,7 @@
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.
@@ -43,7 +44,7 @@ module MailHandler
43
44
  return unless validate_response
44
45
  return if dispatcher.valid_response?(response)
45
46
 
46
- raise "Invalid sending response: #{response}"
47
+ raise SendEmailError, "Invalid sending response: #{response}."
47
48
  end
48
49
 
49
50
  def init_sending_details(email)
@@ -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,23 +46,30 @@ module MailHandler
45
46
  host: host, secure: @use_ssl)
46
47
  end
47
48
 
48
- def formatted_response(response)
49
- return if response.keys.select { |key| key.is_a? Symbol }.empty?
50
- return unless response.is_a? Hash
51
-
52
- response.keys.select { |key| key.is_a? String }.each { |s| response.delete(s) }
53
- response
54
- end
55
-
56
49
  def valid_response?(response)
57
50
  response[:message].to_s.strip.downcase == 'ok' && response[:error_code].to_s.downcase == '0'
58
51
  end
59
52
 
53
+ def timeout=(value)
54
+ @http_open_timeout = value
55
+ @http_read_timeout = value
56
+ end
57
+
60
58
  DEFAULTS = {
61
59
  host: 'api.postmarkapp.com',
62
- read_timeout: 15,
63
- open_timeout: 15
60
+ read_timeout: 60,
61
+ open_timeout: 60
64
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
65
73
  end
66
74
  end
67
75
  end
@@ -14,7 +14,8 @@ 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)
18
19
  end
19
20
 
20
21
  def valid_response?(responses)
@@ -23,6 +24,10 @@ module MailHandler
23
24
 
24
25
  protected
25
26
 
27
+ def format_response(response)
28
+ response.map { |r| super(r) }
29
+ end
30
+
26
31
  def verify_email(emails)
27
32
  return if emails.is_a?(Array) && emails.all? { |e| e.is_a? allowed_email_type }
28
33
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'base'
4
+ require_relative "../extensions/mail/smtp"
4
5
 
5
6
  module MailHandler
6
7
  module Sending
@@ -12,7 +13,8 @@ module MailHandler
12
13
  :username,
13
14
  :password,
14
15
  :authentication,
15
- :use_ssl
16
+ :use_ssl,
17
+ :openssl_verify_mode
16
18
 
17
19
  attr_accessor :open_timeout,
18
20
  :read_timeout,
@@ -35,10 +37,8 @@ module MailHandler
35
37
  end
36
38
 
37
39
  def send_raw_email(text_email, smtp_from, smtp_to)
38
- response = init_net_smtp.start(domain, username, password, authentication) do |smtp|
39
- smtp.send_message(text_email, smtp_from, smtp_to)
40
- end
41
-
40
+ # use same settings as when sending mail created with Mail gem
41
+ response = Mail::SMTP.new(delivery_options).deliver_raw!(text_email, smtp_from, smtp_to)
42
42
  save_response ? response : nil
43
43
  end
44
44
 
@@ -46,16 +46,13 @@ module MailHandler
46
46
  response.string.to_s.downcase.include?('250 2.0.0 ok')
47
47
  end
48
48
 
49
- private
50
-
51
- def init_net_smtp
52
- sending = Net::SMTP.new(address, port)
53
- sending.read_timeout = read_timeout
54
- sending.open_timeout = open_timeout
55
- sending.enable_starttls_auto if use_ssl
56
- sending
49
+ def timeout=(value)
50
+ @read_timeout = value
51
+ @open_timeout = value
57
52
  end
58
53
 
54
+ private
55
+
59
56
  def configure_sending(email)
60
57
  email.delivery_method :smtp, delivery_options
61
58
  email
@@ -70,6 +67,7 @@ module MailHandler
70
67
  password: password,
71
68
  authentication: @authentication,
72
69
  enable_starttls_auto: @use_ssl,
70
+ openssl_verify_mode: @openssl_verify_mode,
73
71
 
74
72
  return_response: save_response,
75
73
  open_timeout: open_timeout,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MailHandler
4
- VERSION = '1.0.53'
4
+ VERSION = '1.0.59'
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.53
4
+ version: 1.0.59
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-17 00:00:00.000000000 Z
11
+ date: 2021-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -56,6 +56,7 @@ files:
56
56
  - lib/mailhandler.rb
57
57
  - lib/mailhandler/errors.rb
58
58
  - lib/mailhandler/extensions/mail/imap.rb
59
+ - lib/mailhandler/extensions/mail/smtp.rb
59
60
  - lib/mailhandler/receiver.rb
60
61
  - lib/mailhandler/receiving/base.rb
61
62
  - lib/mailhandler/receiving/filelist/base.rb
@@ -114,8 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
115
  - !ruby/object:Gem::Version
115
116
  version: 1.9.3
116
117
  requirements: []
117
- rubygems_version: 3.1.2
118
- signing_key:
118
+ rubygems_version: 3.2.3
119
+ signing_key:
119
120
  specification_version: 4
120
121
  summary: Postmark email receiving and sending handler.
121
122
  test_files: []