mailhandler 1.0.53 → 1.0.59

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: 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: []