action_mailer-logged_smtp_delivery 1.1.0 → 2.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3d781ad070664a975fffad82071e7aeedf7ed601
4
+ data.tar.gz: 761658d0f91601a056abe97f9a3abdddfb51e4b4
5
+ SHA512:
6
+ metadata.gz: ff13c8e7ee92190f904e893d3a10cca6605a6b9cecff368d71a016289990619b76fa5ddffa18f0909e366a710811e44ed05ff2034f5656d170870b0f82b8ba4b
7
+ data.tar.gz: 1c9f076ced8d21c1b81183feb3821748acedc71722f8f063631c1eab5ce0cdd13320b294357000c3c849dead56add05484d426f654e535c2f5285e11bff3bd0f
data/README.md CHANGED
@@ -1,33 +1,48 @@
1
- ### Logged SMTP Delivery
2
-
3
- A few features:
4
- 1. Detailed log stream with message id prefix. Example:
5
- ```
6
- <4e2b38d772949_b81ac212@localhost> stored at example/log/mails/outbound/2011-07-23/7_13462_2.eml
7
- <4e2b38d772949_b81ac212@localhost> X-Delivery-Context: [users/1/welcome]
8
- <4e2b38d772949_b81ac212@localhost> sender: support@support.localhost
9
- <4e2b38d772949_b81ac212@localhost> destinations: support@system.example.com
10
- <4e2b38d772949_b81ac212@localhost> done #<Net::SMTP::Response:0x10bbee680 @string="250 2.0.0 Ok: queued as 87BF716D7901\n", @status="250">
11
- ```
12
-
13
- 2. Logs an identification header to quickly locate logs for a specific email/entity
14
- ```ruby
15
- config.action_mailer.smtp_settings[:log_header] = 'X-Delivery-Context'
16
-
17
- class UsersMailer < ActionMailer::Base
18
-
19
- def welcome(user)
20
- headers['X-Delivery-Context'] = "users/#{user.id}/welcome"
21
-
22
- # ...
23
- end
24
- end
1
+ # Logged SMTP Delivery
2
+
3
+ ```Ruby
4
+ require 'action_mailer/logged_smtp_delivery'
5
+ config.action_mailer.logged_smtp_settings = {
6
+ ... normal smtp settings ...,
7
+ logger: Logger.new, # progress info
8
+ mail_file_logger: Logger.new # log full encoded mails for storage
9
+ }
10
+
11
+
12
+ ```
13
+
14
+
15
+ ### Detailed log stream with message id prefix. Example:
16
+
17
+ ```
18
+ <4e2b38d772949_b81ac212@localhost> stored at example/log/mails/outbound/2011-07-23/7_13462_2.eml
19
+ <4e2b38d772949_b81ac212@localhost> X-Delivery-Context: [users/1/welcome]
20
+ <4e2b38d772949_b81ac212@localhost> sender: support@support.localhost
21
+ <4e2b38d772949_b81ac212@localhost> destinations: support@system.example.com
22
+ <4e2b38d772949_b81ac212@localhost> done #<Net::SMTP::Response:0x10bbee680 @string="250 2.0.0 Ok: queued as 87BF716D7901\n", @status="250">
23
+ ```
24
+
25
+ ### Logs an identification header to quickly locate logs for a specific email/entity
26
+
27
+ ```ruby
28
+ config.action_mailer.logged_smtp_settings[:log_header] = 'X-Delivery-Context'
29
+
30
+ class UsersMailer < ActionMailer::Base
31
+
32
+ def welcome(user)
33
+ headers['X-Delivery-Context'] = "users/#{user.id}/welcome"
25
34
 
35
+ # ...
36
+ end
37
+ end
38
+
26
39
 
27
- UsersMailer.deliver_welcome(user)
28
- # ActionMailer::Base.logger ->
29
- # <4e2b38d772949_b81ac212@localhost> X-Delivery-Context: [users/1/welcome]
30
- ```
40
+ UsersMailer.welcome(user).deliver
41
+ # ActionMailer::Base.logger ->
42
+ # <4e2b38d772949_b81ac212@localhost> X-Delivery-Context: [users/1/welcome]
43
+ ```
31
44
 
32
- 3. Doesn't render BCC recipients
45
+ ### Doesn't render BCC recipients
46
+
47
+ License: Apache V2
33
48
 
@@ -1,41 +1,31 @@
1
1
  require 'action_mailer'
2
- require 'active_support/core_ext/class/attribute'
3
2
  require 'net/smtp'
4
3
 
5
- #TODO: Add mail file logger
6
-
7
- # A few features:
8
- # Hides BCC recipients
9
- # Detailed log stream with message id token
10
- # Logs an identification header to quickly locate logs for a specific email
11
- # Can optionally log the raw email
12
- # TLS support
13
4
  module ActionMailer::LoggedSMTPDelivery
5
+ class Mailer
6
+ def initialize(settings)
7
+ @settings = settings
8
+ end
14
9
 
15
- def self.included(base)
16
- base.class_attribute :mail_file_logger
17
- end
10
+ def deliver!(mail)
11
+ delivery = SMTPDelivery.new(mail, @settings, @settings.fetch(:logger))
18
12
 
19
- def perform_delivery_logged_smtp(mail)
20
- delivery = SMTPDelivery.new(mail, smtp_settings)
21
- delivery.logger = logger
13
+ if logger = @settings[:mail_file_logger]
14
+ path = logger.log(mail.encoded)
15
+ delivery.log "stored at #{path}"
16
+ end
22
17
 
23
- if mail_file_logger
24
- path = mail_file_logger.log(mail.encoded)
25
- delivery.log "stored at #{path}"
18
+ delivery.perform
26
19
  end
27
-
28
- delivery.perform
29
20
  end
30
21
 
31
22
  class SMTPDelivery
23
+ attr_reader :mail, :settings, :logger
32
24
 
33
- attr_reader :mail, :settings
34
- attr_accessor :logger
35
-
36
- def initialize(mail, settings)
25
+ def initialize(mail, settings, logger)
37
26
  @mail = mail
38
27
  @settings = settings
28
+ @logger = logger
39
29
  end
40
30
 
41
31
  def perform
@@ -76,7 +66,7 @@ module ActionMailer::LoggedSMTPDelivery
76
66
  end
77
67
 
78
68
  def log_headers
79
- log "#{log_header}: [#{mail[log_header]}]" unless log_header.nil?
69
+ log "#{log_header}: [#{mail[log_header]}]" if log_header
80
70
  end
81
71
 
82
72
  def log(message)
@@ -90,7 +80,7 @@ module ActionMailer::LoggedSMTPDelivery
90
80
  def smtp_adaptor
91
81
  settings[:adaptor] || Net::SMTP
92
82
  end
93
-
94
83
  end
95
-
96
84
  end
85
+
86
+ ActionMailer::Base.add_delivery_method :logged_smtp, ActionMailer::LoggedSMTPDelivery::Mailer
metadata CHANGED
@@ -1,46 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: action_mailer-logged_smtp_delivery
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Eric Chapweske
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-26 00:00:00.000000000 Z
11
+ date: 2014-09-24 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: actionmailer
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - '='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 2.3.16
19
+ version: 3.2.19
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - '='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 2.3.16
26
+ version: 3.2.19
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: minitest
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 4.7.5
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 4.7.5
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-rg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
36
46
  - !ruby/object:Gem::Version
37
47
  version: '0'
38
48
  type: :development
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ! '>='
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bump
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
44
81
  - !ruby/object:Gem::Version
45
82
  version: '0'
46
83
  description: ActionMailer SMTP delivery strategy with advanced logging and Bcc support
@@ -49,34 +86,30 @@ executables: []
49
86
  extensions: []
50
87
  extra_rdoc_files: []
51
88
  files:
52
- - lib/action_mailer/logged_smtp_delivery.rb
53
- - test/helper.rb
54
- - test/logged_smtp_delivery_test.rb
55
89
  - README.md
56
- homepage: https://github.com/eac/action_mailer-logged_smtp_delivery
57
- licenses: []
90
+ - lib/action_mailer/logged_smtp_delivery.rb
91
+ homepage: https://github.com/grosser/action_mailer-logged_smtp_delivery
92
+ licenses:
93
+ - Apache V2
94
+ metadata: {}
58
95
  post_install_message:
59
96
  rdoc_options: []
60
97
  require_paths:
61
98
  - lib
62
99
  required_ruby_version: !ruby/object:Gem::Requirement
63
- none: false
64
100
  requirements:
65
- - - ! '>='
101
+ - - ">="
66
102
  - !ruby/object:Gem::Version
67
103
  version: '0'
68
104
  required_rubygems_version: !ruby/object:Gem::Requirement
69
- none: false
70
105
  requirements:
71
- - - ! '>='
106
+ - - ">="
72
107
  - !ruby/object:Gem::Version
73
108
  version: '0'
74
109
  requirements: []
75
110
  rubyforge_project:
76
- rubygems_version: 1.8.25
111
+ rubygems_version: 2.2.2
77
112
  signing_key:
78
- specification_version: 3
113
+ specification_version: 4
79
114
  summary: An ActionMailer delivery strategy
80
- test_files:
81
- - test/helper.rb
82
- - test/logged_smtp_delivery_test.rb
115
+ test_files: []
data/test/helper.rb DELETED
@@ -1,57 +0,0 @@
1
- require 'bundler/setup'
2
- $LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '../lib'))) # lib
3
- require 'minitest/autorun'
4
-
5
- class MemoryLogger
6
-
7
- def log(message)
8
- messages << message
9
- end
10
-
11
- def messages
12
- @messages ||= []
13
- end
14
-
15
- def clear
16
- messages.clear
17
- end
18
-
19
- end
20
-
21
- class FakeSMTP
22
-
23
- attr_reader :address, :port, :credentials
24
-
25
- def self.deliveries
26
- @deliveries ||= []
27
- end
28
-
29
- def initialize(address, port)
30
- @address = address
31
- @port = port
32
- end
33
-
34
- def start(*credentials)
35
- @credentials = credentials
36
- @started = true
37
-
38
- yield(self)
39
- end
40
-
41
- def send_message(message, from, recipients)
42
- self.class.deliveries << [ message, from, recipients ]
43
- end
44
-
45
- def enable_starttls_auto
46
- @starttls = :auto
47
- end
48
-
49
- def starttls_auto?
50
- @starttls == :auto
51
- end
52
-
53
- def inspect
54
- "#<#{self.class} #{@address}:#{@port} started=#{@started}>"
55
- end
56
-
57
- end
@@ -1,132 +0,0 @@
1
- require_relative 'helper'
2
- require 'action_mailer/logged_smtp_delivery'
3
- require 'logger'
4
-
5
- class LoggedSMTPDeliveryTest < MiniTest::Unit::TestCase
6
-
7
- class TestMailer < ActionMailer::Base
8
- include ActionMailer::LoggedSMTPDelivery
9
-
10
- self.mail_file_logger = MemoryLogger.new
11
- self.logger = Logger.new(StringIO.new)
12
- self.delivery_method = :logged_smtp
13
- self.smtp_settings = { :adaptor => FakeSMTP }
14
-
15
- def welcome
16
- recipients 'to@example.com'
17
- from 'me@example.com'
18
- body 'hello'
19
-
20
- # Keep the message simple and consistent between test runs
21
- headers['mime-version'] = ''
22
- charset nil
23
- headers['date'] = ''
24
- end
25
-
26
- end
27
-
28
- describe 'delivering via actionmailer' do
29
- before do
30
- TestMailer.mail_file_logger.clear
31
- FakeSMTP.deliveries.clear
32
- end
33
-
34
- it 'logs the mail to a file when the mail file logger is available' do
35
- TestMailer.deliver_welcome
36
- assert_equal "From: me@example.com\r\nTo: to@example.com\r\nContent-Type: text/plain\r\n\r\nhello", TestMailer.mail_file_logger.messages.last
37
- TestMailer.mail_file_logger.messages.clear
38
-
39
- original_logger = TestMailer.mail_file_logger
40
- TestMailer.mail_file_logger = nil
41
- assert TestMailer.deliver_welcome
42
- TestMailer.mail_file_logger = original_logger
43
- end
44
-
45
- it 'delivers the mail' do
46
- TestMailer.deliver_welcome
47
- delivery = ["From: me@example.com\r\nTo: to@example.com\r\nContent-Type: text/plain\r\n\r\nhello", "me@example.com", ["to@example.com"]]
48
-
49
- assert_equal delivery, FakeSMTP.deliveries.last
50
- end
51
-
52
- end
53
-
54
- describe 'SMTP Delivery' do
55
- before do
56
- @settings = { :adaptor => FakeSMTP }
57
- @mail = TMail::Mail.new.tap do |mail|
58
- mail.message_id = '<12345@example.com>'
59
- end
60
- @delivery = ActionMailer::LoggedSMTPDelivery::SMTPDelivery.new(@mail, @settings)
61
- @log = StringIO.new
62
- @delivery.logger = Logger.new(@log)
63
- @delivery.logger.formatter = lambda { |severity, datetime, progname, msg| msg }
64
- end
65
-
66
- it 'has the sender via the first from address' do
67
- @mail.from = [ 'a@example.com', 'b@example.com' ]
68
- assert_equal 'a@example.com', @delivery.sender
69
- end
70
-
71
- it 'has a list of destination addresses' do
72
- @mail.to = 'to@example.com'
73
- @mail.cc = 'cc@example.com'
74
- @mail.bcc = 'bcc@example.com'
75
-
76
- assert_equal [ 'to@example.com', 'cc@example.com','bcc@example.com' ], @delivery.destinations
77
- end
78
-
79
- it 'has an smtp connection' do
80
- @delivery.settings[:address] = 'example.com'
81
- @delivery.settings[:port] = 26
82
-
83
- smtp = @delivery.smtp
84
- assert_equal 26, smtp.port
85
- assert_equal 'example.com', smtp.address
86
- assert_equal true, smtp.starttls_auto?
87
-
88
- @delivery.settings[:tls] = false
89
- assert_equal false, @delivery.smtp.starttls_auto?
90
- end
91
-
92
- it 'logs with the mail message id' do
93
- @delivery.log 'hello'
94
-
95
- assert_equal '<12345@example.com> hello', @log.string
96
- end
97
-
98
- it 'logs headers when the log header is provided' do
99
- @delivery.log_headers
100
- assert_equal '', @log.string
101
-
102
- @delivery.settings[:log_header] = 'X-Delivery-Context'
103
- @delivery.mail['X-Delivery-Context'] = 'hello-33'
104
- @delivery.log_headers
105
-
106
- assert_equal '<12345@example.com> X-Delivery-Context: [hello-33]', @log.string
107
- end
108
-
109
- it 'sends the mail' do
110
- @mail.from = 'me@example.com'
111
- @mail.to = 'to@example.com'
112
- @mail.cc = 'cc@example.com'
113
- @mail.bcc = 'bcc@example.com'
114
- @mail.body = 'hello'
115
- message = [
116
- "From: me@example.com\r\nTo: to@example.com\r\nCc: cc@example.com\r\nMessage-Id: <12345@example.com>\r\n\r\nhello",
117
- "me@example.com",
118
- ["to@example.com", "cc@example.com", "bcc@example.com"]
119
- ]
120
- @delivery.perform
121
-
122
- assert_equal message, FakeSMTP.deliveries.last
123
- end
124
-
125
- it 'does not include BCC addresses in the message' do
126
- @mail.bcc = 'bcc@example.com'
127
- assert_equal false, @delivery.message.include?('bcc@example.com')
128
- end
129
-
130
- end
131
-
132
- end