actionmailer 5.0.7.2 → 5.1.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +16 -183
- data/MIT-LICENSE +1 -1
- data/README.rdoc +1 -1
- data/lib/action_mailer.rb +11 -11
- data/lib/action_mailer/base.rb +150 -137
- data/lib/action_mailer/collector.rb +3 -3
- data/lib/action_mailer/delivery_job.rb +1 -1
- data/lib/action_mailer/delivery_methods.rb +7 -7
- data/lib/action_mailer/gem_version.rb +3 -3
- data/lib/action_mailer/inline_preview_interceptor.rb +4 -8
- data/lib/action_mailer/log_subscriber.rb +2 -2
- data/lib/action_mailer/mail_helper.rb +1 -1
- data/lib/action_mailer/message_delivery.rb +4 -4
- data/lib/action_mailer/parameterized.rb +152 -0
- data/lib/action_mailer/preview.rb +13 -12
- data/lib/action_mailer/railtie.rb +6 -6
- data/lib/action_mailer/test_case.rb +17 -19
- data/lib/action_mailer/test_helper.rb +3 -3
- data/lib/action_mailer/version.rb +1 -1
- data/lib/rails/generators/mailer/mailer_generator.rb +10 -11
- metadata +13 -11
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "abstract_controller/collector"
|
2
|
+
require "active_support/core_ext/hash/reverse_merge"
|
3
|
+
require "active_support/core_ext/array/extract_options"
|
4
4
|
|
5
5
|
module ActionMailer
|
6
6
|
class Collector
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "tmpdir"
|
2
2
|
|
3
3
|
module ActionMailer
|
4
4
|
# This module handles everything related to mail delivery, from registering
|
@@ -25,7 +25,7 @@ module ActionMailer
|
|
25
25
|
add_delivery_method :smtp, Mail::SMTP,
|
26
26
|
address: "localhost",
|
27
27
|
port: 25,
|
28
|
-
domain:
|
28
|
+
domain: "localhost.localdomain",
|
29
29
|
user_name: nil,
|
30
30
|
password: nil,
|
31
31
|
authentication: nil,
|
@@ -35,8 +35,8 @@ module ActionMailer
|
|
35
35
|
location: defined?(Rails.root) ? "#{Rails.root}/tmp/mails" : "#{Dir.tmpdir}/mails"
|
36
36
|
|
37
37
|
add_delivery_method :sendmail, Mail::Sendmail,
|
38
|
-
location:
|
39
|
-
arguments:
|
38
|
+
location: "/usr/sbin/sendmail",
|
39
|
+
arguments: "-i"
|
40
40
|
|
41
41
|
add_delivery_method :test, Mail::TestMailer
|
42
42
|
end
|
@@ -52,14 +52,14 @@ module ActionMailer
|
|
52
52
|
# add_delivery_method :sendmail, Mail::Sendmail,
|
53
53
|
# location: '/usr/sbin/sendmail',
|
54
54
|
# arguments: '-i'
|
55
|
-
def add_delivery_method(symbol, klass, default_options={})
|
55
|
+
def add_delivery_method(symbol, klass, default_options = {})
|
56
56
|
class_attribute(:"#{symbol}_settings") unless respond_to?(:"#{symbol}_settings")
|
57
57
|
send(:"#{symbol}_settings=", default_options)
|
58
58
|
self.delivery_methods = delivery_methods.merge(symbol.to_sym => klass).freeze
|
59
59
|
end
|
60
60
|
|
61
|
-
def wrap_delivery_behavior(mail, method=nil, options=nil) # :nodoc:
|
62
|
-
method ||=
|
61
|
+
def wrap_delivery_behavior(mail, method = nil, options = nil) # :nodoc:
|
62
|
+
method ||= delivery_method
|
63
63
|
mail.delivery_handler = self
|
64
64
|
|
65
65
|
case method
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "base64"
|
2
2
|
|
3
3
|
module ActionMailer
|
4
4
|
# Implements a mailer preview interceptor that converts image tag src attributes
|
@@ -11,7 +11,7 @@ module ActionMailer
|
|
11
11
|
# ActionMailer::Base.preview_interceptors.delete(ActionMailer::InlinePreviewInterceptor)
|
12
12
|
#
|
13
13
|
class InlinePreviewInterceptor
|
14
|
-
PATTERN
|
14
|
+
PATTERN = /src=(?:"cid:[^"]+"|'cid:[^']+')/i
|
15
15
|
|
16
16
|
include Base64
|
17
17
|
|
@@ -26,7 +26,7 @@ module ActionMailer
|
|
26
26
|
def transform! #:nodoc:
|
27
27
|
return message if html_part.blank?
|
28
28
|
|
29
|
-
|
29
|
+
html_part.body = html_part.decoded.gsub(PATTERN) do |match|
|
30
30
|
if part = find_part(match[9..-2])
|
31
31
|
%[src="#{data_url(part)}"]
|
32
32
|
else
|
@@ -46,16 +46,12 @@ module ActionMailer
|
|
46
46
|
@html_part ||= message.html_part
|
47
47
|
end
|
48
48
|
|
49
|
-
def html_source
|
50
|
-
html_part.body.raw_source
|
51
|
-
end
|
52
|
-
|
53
49
|
def data_url(part)
|
54
50
|
"data:#{part.mime_type};base64,#{strict_encode64(part.body.raw_source)}"
|
55
51
|
end
|
56
52
|
|
57
53
|
def find_part(cid)
|
58
|
-
message.all_parts.find{ |p| p.attachment? && p.cid == cid }
|
54
|
+
message.all_parts.find { |p| p.attachment? && p.cid == cid }
|
59
55
|
end
|
60
56
|
end
|
61
57
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/log_subscriber"
|
2
2
|
|
3
3
|
module ActionMailer
|
4
4
|
# Implements the ActiveSupport::LogSubscriber for logging notifications when
|
@@ -7,7 +7,7 @@ module ActionMailer
|
|
7
7
|
# An email was delivered.
|
8
8
|
def deliver(event)
|
9
9
|
info do
|
10
|
-
recipients = Array(event.payload[:to]).join(
|
10
|
+
recipients = Array(event.payload[:to]).join(", ")
|
11
11
|
"Sent mail to #{recipients} (#{event.duration.round(1)}ms)"
|
12
12
|
end
|
13
13
|
|
@@ -54,7 +54,7 @@ module ActionMailer
|
|
54
54
|
sentences = [[]]
|
55
55
|
|
56
56
|
text.split.each do |word|
|
57
|
-
if sentences.first.present? && (sentences.last + [word]).join(
|
57
|
+
if sentences.first.present? && (sentences.last + [word]).join(" ").length > len
|
58
58
|
sentences << [word]
|
59
59
|
else
|
60
60
|
sentences.last << word
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "delegate"
|
2
2
|
|
3
3
|
module ActionMailer
|
4
4
|
# The <tt>ActionMailer::MessageDelivery</tt> class is used by
|
@@ -56,7 +56,7 @@ module ActionMailer
|
|
56
56
|
# * <tt>:wait</tt> - Enqueue the email to be delivered with a delay
|
57
57
|
# * <tt>:wait_until</tt> - Enqueue the email to be delivered at (after) a specific date / time
|
58
58
|
# * <tt>:queue</tt> - Enqueue the email on the specified queue
|
59
|
-
def deliver_later!(options={})
|
59
|
+
def deliver_later!(options = {})
|
60
60
|
enqueue_delivery :deliver_now!, options
|
61
61
|
end
|
62
62
|
|
@@ -72,7 +72,7 @@ module ActionMailer
|
|
72
72
|
# * <tt>:wait</tt> - Enqueue the email to be delivered with a delay.
|
73
73
|
# * <tt>:wait_until</tt> - Enqueue the email to be delivered at (after) a specific date / time.
|
74
74
|
# * <tt>:queue</tt> - Enqueue the email on the specified queue.
|
75
|
-
def deliver_later(options={})
|
75
|
+
def deliver_later(options = {})
|
76
76
|
enqueue_delivery :deliver_now, options
|
77
77
|
end
|
78
78
|
|
@@ -106,7 +106,7 @@ module ActionMailer
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
def enqueue_delivery(delivery_method, options={})
|
109
|
+
def enqueue_delivery(delivery_method, options = {})
|
110
110
|
if processed?
|
111
111
|
::Kernel.raise "You've accessed the message before asking to " \
|
112
112
|
"deliver it later, so you may have made local changes that would " \
|
@@ -0,0 +1,152 @@
|
|
1
|
+
module ActionMailer
|
2
|
+
# Provides the option to parameterize mailers in order to share instance variable
|
3
|
+
# setup, processing, and common headers.
|
4
|
+
#
|
5
|
+
# Consider this example that does not use parameterization:
|
6
|
+
#
|
7
|
+
# class InvitationsMailer < ApplicationMailer
|
8
|
+
# def account_invitation(inviter, invitee)
|
9
|
+
# @account = inviter.account
|
10
|
+
# @inviter = inviter
|
11
|
+
# @invitee = invitee
|
12
|
+
#
|
13
|
+
# subject = "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
|
14
|
+
#
|
15
|
+
# mail \
|
16
|
+
# subject: subject,
|
17
|
+
# to: invitee.email_address,
|
18
|
+
# from: common_address(inviter),
|
19
|
+
# reply_to: inviter.email_address_with_name
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# def project_invitation(project, inviter, invitee)
|
23
|
+
# @account = inviter.account
|
24
|
+
# @project = project
|
25
|
+
# @inviter = inviter
|
26
|
+
# @invitee = invitee
|
27
|
+
# @summarizer = ProjectInvitationSummarizer.new(@project.bucket)
|
28
|
+
#
|
29
|
+
# subject = "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})"
|
30
|
+
#
|
31
|
+
# mail \
|
32
|
+
# subject: subject,
|
33
|
+
# to: invitee.email_address,
|
34
|
+
# from: common_address(inviter),
|
35
|
+
# reply_to: inviter.email_address_with_name
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# def bulk_project_invitation(projects, inviter, invitee)
|
39
|
+
# @account = inviter.account
|
40
|
+
# @projects = projects.sort_by(&:name)
|
41
|
+
# @inviter = inviter
|
42
|
+
# @invitee = invitee
|
43
|
+
#
|
44
|
+
# subject = "#{@inviter.name.familiar} added you to some new stuff in Basecamp (#{@account.name})"
|
45
|
+
#
|
46
|
+
# mail \
|
47
|
+
# subject: subject,
|
48
|
+
# to: invitee.email_address,
|
49
|
+
# from: common_address(inviter),
|
50
|
+
# reply_to: inviter.email_address_with_name
|
51
|
+
# end
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# InvitationsMailer.account_invitation(person_a, person_b).deliver_later
|
55
|
+
#
|
56
|
+
# Using parameterized mailers, this can be rewritten as:
|
57
|
+
#
|
58
|
+
# class InvitationsMailer < ApplicationMailer
|
59
|
+
# before_action { @inviter, @invitee = params[:inviter], params[:invitee] }
|
60
|
+
# before_action { @account = params[:inviter].account }
|
61
|
+
#
|
62
|
+
# default to: -> { @invitee.email_address },
|
63
|
+
# from: -> { common_address(@inviter) },
|
64
|
+
# reply_to: -> { @inviter.email_address_with_name }
|
65
|
+
#
|
66
|
+
# def account_invitation
|
67
|
+
# mail subject: "#{@inviter.name} invited you to their Basecamp (#{@account.name})"
|
68
|
+
# end
|
69
|
+
#
|
70
|
+
# def project_invitation
|
71
|
+
# @project = params[:project]
|
72
|
+
# @summarizer = ProjectInvitationSummarizer.new(@project.bucket)
|
73
|
+
#
|
74
|
+
# mail subject: "#{@inviter.name.familiar} added you to a project in Basecamp (#{@account.name})"
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# def bulk_project_invitation
|
78
|
+
# @projects = params[:projects].sort_by(&:name)
|
79
|
+
#
|
80
|
+
# mail subject: "#{@inviter.name.familiar} added you to some new stuff in Basecamp (#{@account.name})"
|
81
|
+
# end
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# InvitationsMailer.with(inviter: person_a, invitee: person_b).account_invitation.deliver_later
|
85
|
+
module Parameterized
|
86
|
+
extend ActiveSupport::Concern
|
87
|
+
|
88
|
+
included do
|
89
|
+
attr_accessor :params
|
90
|
+
end
|
91
|
+
|
92
|
+
module ClassMethods
|
93
|
+
# Provide the parameters to the mailer in order to use them in the instance methods and callbacks.
|
94
|
+
#
|
95
|
+
# InvitationsMailer.with(inviter: person_a, invitee: person_b).account_invitation.deliver_later
|
96
|
+
#
|
97
|
+
# See Parameterized documentation for full example.
|
98
|
+
def with(params)
|
99
|
+
ActionMailer::Parameterized::Mailer.new(self, params)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
class Mailer # :nodoc:
|
104
|
+
def initialize(mailer, params)
|
105
|
+
@mailer, @params = mailer, params
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
def method_missing(method_name, *args)
|
110
|
+
if @mailer.action_methods.include?(method_name.to_s)
|
111
|
+
ActionMailer::Parameterized::MessageDelivery.new(@mailer, method_name, @params, *args)
|
112
|
+
else
|
113
|
+
super
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def respond_to_missing?(method, include_all = false)
|
118
|
+
@mailer.respond_to?(method, include_all)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
class MessageDelivery < ActionMailer::MessageDelivery # :nodoc:
|
123
|
+
def initialize(mailer_class, action, params, *args)
|
124
|
+
super(mailer_class, action, *args)
|
125
|
+
@params = params
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
def processed_mailer
|
130
|
+
@processed_mailer ||= @mailer_class.new.tap do |mailer|
|
131
|
+
mailer.params = @params
|
132
|
+
mailer.process @action, *@args
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def enqueue_delivery(delivery_method, options = {})
|
137
|
+
if processed?
|
138
|
+
super
|
139
|
+
else
|
140
|
+
args = @mailer_class.name, @action.to_s, delivery_method.to_s, @params, *@args
|
141
|
+
ActionMailer::Parameterized::DeliveryJob.set(options).perform_later(*args)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class DeliveryJob < ActionMailer::DeliveryJob # :nodoc:
|
147
|
+
def perform(mailer, mail_method, delivery_method, params, *args)
|
148
|
+
mailer.constantize.with(params).public_send(mail_method, *args).send(delivery_method)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_support/descendants_tracker"
|
2
2
|
|
3
3
|
module ActionMailer
|
4
4
|
module Previews #:nodoc:
|
@@ -34,7 +34,8 @@ module ActionMailer
|
|
34
34
|
# Either a class or a string can be passed in as the Interceptor. If a
|
35
35
|
# string is passed in it will be <tt>constantize</tt>d.
|
36
36
|
def register_preview_interceptor(interceptor)
|
37
|
-
preview_interceptor =
|
37
|
+
preview_interceptor = \
|
38
|
+
case interceptor
|
38
39
|
when String, Symbol
|
39
40
|
interceptor.to_s.camelize.constantize
|
40
41
|
else
|
@@ -62,7 +63,7 @@ module ActionMailer
|
|
62
63
|
# interceptors will be informed so that they can transform the message
|
63
64
|
# as they would if the mail was actually being delivered.
|
64
65
|
def call(email)
|
65
|
-
preview =
|
66
|
+
preview = new
|
66
67
|
message = preview.public_send(email)
|
67
68
|
inform_preview_interceptors(message)
|
68
69
|
message
|
@@ -80,35 +81,35 @@ module ActionMailer
|
|
80
81
|
|
81
82
|
# Returns true if the preview exists.
|
82
83
|
def exists?(preview)
|
83
|
-
all.any?{ |p| p.preview_name == preview }
|
84
|
+
all.any? { |p| p.preview_name == preview }
|
84
85
|
end
|
85
86
|
|
86
87
|
# Find a mailer preview by its underscored class name.
|
87
88
|
def find(preview)
|
88
|
-
all.find{ |p| p.preview_name == preview }
|
89
|
+
all.find { |p| p.preview_name == preview }
|
89
90
|
end
|
90
91
|
|
91
92
|
# Returns the underscored name of the mailer preview without the suffix.
|
92
93
|
def preview_name
|
93
|
-
name.sub(/Preview$/,
|
94
|
+
name.sub(/Preview$/, "").underscore
|
94
95
|
end
|
95
96
|
|
96
|
-
|
97
|
-
def load_previews
|
97
|
+
private
|
98
|
+
def load_previews
|
98
99
|
if preview_path
|
99
|
-
Dir["#{preview_path}/**/*_preview.rb"].each{ |file| require_dependency file }
|
100
|
+
Dir["#{preview_path}/**/*_preview.rb"].each { |file| require_dependency file }
|
100
101
|
end
|
101
102
|
end
|
102
103
|
|
103
|
-
def preview_path
|
104
|
+
def preview_path
|
104
105
|
Base.preview_path
|
105
106
|
end
|
106
107
|
|
107
|
-
def show_previews
|
108
|
+
def show_previews
|
108
109
|
Base.show_previews
|
109
110
|
end
|
110
111
|
|
111
|
-
def inform_preview_interceptors(message)
|
112
|
+
def inform_preview_interceptors(message)
|
112
113
|
Base.preview_interceptors.each do |interceptor|
|
113
114
|
interceptor.previewing_email(message)
|
114
115
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "active_job/railtie"
|
2
2
|
require "action_mailer"
|
3
3
|
require "rails"
|
4
4
|
require "abstract_controller/railties/routes_helpers"
|
@@ -18,7 +18,7 @@ module ActionMailer
|
|
18
18
|
|
19
19
|
if app.config.force_ssl
|
20
20
|
options.default_url_options ||= {}
|
21
|
-
options.default_url_options[:protocol] ||=
|
21
|
+
options.default_url_options[:protocol] ||= "https"
|
22
22
|
end
|
23
23
|
|
24
24
|
options.assets_dir ||= paths["public"].first
|
@@ -28,7 +28,7 @@ module ActionMailer
|
|
28
28
|
options.cache_store ||= Rails.cache
|
29
29
|
|
30
30
|
if options.show_previews
|
31
|
-
options.preview_path
|
31
|
+
options.preview_path ||= defined?(Rails.root) ? "#{Rails.root}/test/mailers/previews" : nil
|
32
32
|
end
|
33
33
|
|
34
34
|
# make sure readers methods get compiled
|
@@ -44,7 +44,7 @@ module ActionMailer
|
|
44
44
|
register_preview_interceptors(options.delete(:preview_interceptors))
|
45
45
|
register_observers(options.delete(:observers))
|
46
46
|
|
47
|
-
options.each { |k,v| send("#{k}=", v) }
|
47
|
+
options.each { |k, v| send("#{k}=", v) }
|
48
48
|
end
|
49
49
|
|
50
50
|
ActiveSupport.on_load(:action_dispatch_integration_test) { include ActionMailer::TestCase::ClearTestDeliveries }
|
@@ -61,8 +61,8 @@ module ActionMailer
|
|
61
61
|
|
62
62
|
if options.show_previews
|
63
63
|
app.routes.prepend do
|
64
|
-
get
|
65
|
-
get
|
64
|
+
get "/rails/mailers" => "rails/mailers#index", internal: true
|
65
|
+
get "/rails/mailers/*path" => "rails/mailers#preview", internal: true
|
66
66
|
end
|
67
67
|
|
68
68
|
if options.preview_path
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "active_support/test_case"
|
2
|
+
require "rails-dom-testing"
|
3
3
|
|
4
4
|
module ActionMailer
|
5
5
|
class NonInferrableMailerError < ::StandardError
|
6
6
|
def initialize(name)
|
7
|
-
super "Unable to determine the mailer to test from #{name}. "
|
8
|
-
"You'll need to specify it using tests YourMailer in your "
|
7
|
+
super "Unable to determine the mailer to test from #{name}. " \
|
8
|
+
"You'll need to specify it using tests YourMailer in your " \
|
9
9
|
"test case definition"
|
10
10
|
end
|
11
11
|
end
|
@@ -21,11 +21,11 @@ module ActionMailer
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
def clear_test_deliveries
|
25
|
+
if ActionMailer::Base.delivery_method == :test
|
26
|
+
ActionMailer::Base.deliveries.clear
|
27
|
+
end
|
27
28
|
end
|
28
|
-
end
|
29
29
|
end
|
30
30
|
|
31
31
|
module Behavior
|
@@ -57,7 +57,7 @@ module ActionMailer
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def mailer_class
|
60
|
-
if mailer =
|
60
|
+
if mailer = _mailer_class
|
61
61
|
mailer
|
62
62
|
else
|
63
63
|
tests determine_default_mailer(name)
|
@@ -73,38 +73,36 @@ module ActionMailer
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
|
76
|
+
private
|
77
77
|
|
78
|
-
def initialize_test_deliveries
|
78
|
+
def initialize_test_deliveries
|
79
79
|
set_delivery_method :test
|
80
80
|
@old_perform_deliveries = ActionMailer::Base.perform_deliveries
|
81
81
|
ActionMailer::Base.perform_deliveries = true
|
82
82
|
ActionMailer::Base.deliveries.clear
|
83
83
|
end
|
84
84
|
|
85
|
-
def restore_test_deliveries
|
85
|
+
def restore_test_deliveries
|
86
86
|
restore_delivery_method
|
87
87
|
ActionMailer::Base.perform_deliveries = @old_perform_deliveries
|
88
88
|
end
|
89
89
|
|
90
|
-
def set_delivery_method(method)
|
90
|
+
def set_delivery_method(method)
|
91
91
|
@old_delivery_method = ActionMailer::Base.delivery_method
|
92
92
|
ActionMailer::Base.delivery_method = method
|
93
93
|
end
|
94
94
|
|
95
|
-
def restore_delivery_method
|
95
|
+
def restore_delivery_method
|
96
96
|
ActionMailer::Base.deliveries.clear
|
97
97
|
ActionMailer::Base.delivery_method = @old_delivery_method
|
98
98
|
end
|
99
99
|
|
100
|
-
def set_expected_mail
|
100
|
+
def set_expected_mail
|
101
101
|
@expected = Mail.new
|
102
102
|
@expected.content_type ["text", "plain", { "charset" => charset }]
|
103
|
-
@expected.mime_version =
|
103
|
+
@expected.mime_version = "1.0"
|
104
104
|
end
|
105
105
|
|
106
|
-
private
|
107
|
-
|
108
106
|
def charset
|
109
107
|
"UTF-8"
|
110
108
|
end
|
@@ -114,7 +112,7 @@ module ActionMailer
|
|
114
112
|
end
|
115
113
|
|
116
114
|
def read_fixture(action)
|
117
|
-
IO.readlines(File.join(Rails.root,
|
115
|
+
IO.readlines(File.join(Rails.root, "test", "fixtures", self.class.mailer_class.name.underscore, action))
|
118
116
|
end
|
119
117
|
end
|
120
118
|
|