mail_smtp_connection_pool 0.1.0
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 +7 -0
- data/lib/mail/smtp_pool/connection.rb +60 -0
- data/lib/mail/smtp_pool.rb +42 -0
- metadata +88 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b0058cb8356a709adda99c190df8c3afc3f37eb201c69f705ccf44affb1cc1a3
|
4
|
+
data.tar.gz: 52abaf3ecb4912329c65248205a93057ba8b616a6f09d3fd3b2680faa621fc18
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f04824f52482621e0392c67049d054eb0152ad8a29d9c9d0722722c11506a0e204baffb4d7a7d2d64813b7523639d831bdc981b858cc50878a6cd4e2dbe366a2
|
7
|
+
data.tar.gz: 2c0df938e72fb0ef6a55478cb9b89da05033e733c5b0cc2b75faa85d3a3dfe2a2e5b7786f1f1ca28fde841990b823af8dff64c14e6624737a1ac52f3b6309a52
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# A connection object that can be used to deliver mail.
|
4
|
+
#
|
5
|
+
# This is meant to be used in a pool so the main difference between this
|
6
|
+
# and Mail::SMTP is that this expects deliver! to be called multiple times.
|
7
|
+
#
|
8
|
+
# SMTP connection reset and error handling is handled by this class and
|
9
|
+
# the SMTP connection is not closed after a delivery.
|
10
|
+
|
11
|
+
require 'mail'
|
12
|
+
|
13
|
+
module Mail
|
14
|
+
class SMTPPool
|
15
|
+
class Connection < Mail::SMTP
|
16
|
+
def initialize(values)
|
17
|
+
super
|
18
|
+
|
19
|
+
@smtp_session = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def deliver!(mail)
|
23
|
+
response = Mail::SMTPConnection.new(connection: smtp_session, return_response: true).deliver!(mail)
|
24
|
+
|
25
|
+
settings[:return_response] ? response : self
|
26
|
+
end
|
27
|
+
|
28
|
+
def finish
|
29
|
+
finish_smtp_session if @smtp_session && @smtp_session.started?
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def smtp_session
|
35
|
+
return start_smtp_session if @smtp_session.nil? || !@smtp_session.started?
|
36
|
+
return @smtp_session if reset_smtp_session
|
37
|
+
|
38
|
+
finish_smtp_session
|
39
|
+
start_smtp_session
|
40
|
+
end
|
41
|
+
|
42
|
+
def start_smtp_session
|
43
|
+
@smtp_session = build_smtp_session.start(settings[:domain], settings[:user_name], settings[:password], settings[:authentication])
|
44
|
+
end
|
45
|
+
|
46
|
+
def reset_smtp_session
|
47
|
+
!@smtp_session.instance_variable_get(:@error_occurred) && @smtp_session.rset.success?
|
48
|
+
rescue Net::SMTPError, IOError
|
49
|
+
false
|
50
|
+
end
|
51
|
+
|
52
|
+
def finish_smtp_session
|
53
|
+
@smtp_session.finish
|
54
|
+
rescue Net::SMTPError, IOError
|
55
|
+
ensure
|
56
|
+
@smtp_session = nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'connection_pool'
|
4
|
+
require 'mail/smtp_pool/connection'
|
5
|
+
|
6
|
+
module Mail
|
7
|
+
class SMTPPool
|
8
|
+
VERSION = '0.1.0'
|
9
|
+
|
10
|
+
POOL_DEFAULTS = {
|
11
|
+
pool_size: 5,
|
12
|
+
pool_timeout: 5
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def create_pool(settings = {})
|
17
|
+
pool_settings = POOL_DEFAULTS.merge(settings)
|
18
|
+
smtp_settings = settings.reject { |k, v| POOL_DEFAULTS.keys.include?(k) }
|
19
|
+
|
20
|
+
ConnectionPool.new(size: pool_settings[:pool_size], timeout: pool_settings[:pool_timeout]) do
|
21
|
+
Mail::SMTPPool::Connection.new(smtp_settings)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(settings)
|
27
|
+
raise ArgumentError, 'pool is required. You can create one using Mail::SMTPPool.create_pool.' if settings[:pool].nil?
|
28
|
+
|
29
|
+
@pool = settings[:pool]
|
30
|
+
end
|
31
|
+
|
32
|
+
def deliver!(mail)
|
33
|
+
@pool.with { |conn| conn.deliver!(mail) }
|
34
|
+
end
|
35
|
+
|
36
|
+
# This makes it compatible with Mail's `#deliver!` method
|
37
|
+
# https://github.com/mikel/mail/blob/22a7afc23f253319965bf9228a0a430eec94e06d/lib/mail/message.rb#L271
|
38
|
+
def settings
|
39
|
+
{}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mail_smtp_connection_pool
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabio Tranjan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-01-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: connection_pool
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mail
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.8'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.12.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.12.0
|
55
|
+
description:
|
56
|
+
email:
|
57
|
+
- fabiotranjan@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/mail/smtp_pool.rb
|
63
|
+
- lib/mail/smtp_pool/connection.rb
|
64
|
+
homepage: https://github.com/FabioTranjan/mail_smtp_connection_pool
|
65
|
+
licenses:
|
66
|
+
- MIT
|
67
|
+
metadata:
|
68
|
+
source_code_uri: https://github.com/FabioTranjan/mail_smtp_connection_pool
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
requirements: []
|
84
|
+
rubygems_version: 3.5.3
|
85
|
+
signing_key:
|
86
|
+
specification_version: 4
|
87
|
+
summary: Mail extension for sending mails using an SMTP connection pool
|
88
|
+
test_files: []
|