smailer 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +1 -1
- data/README.md +3 -2
- data/generators/smailer/templates/migration.rb.erb +1 -0
- data/lib/generators/smailer/templates/migration.rb.erb +1 -0
- data/lib/smailer/models/mail_campaign.rb +3 -3
- data/lib/smailer/models/queued_mail.rb +32 -11
- data/lib/smailer/tasks/send.rb +4 -3
- data/lib/smailer/version.rb +1 -1
- data/spec/factories/models.rb +3 -2
- data/spec/features/issuing_a_newsletter_spec.rb +1 -0
- data/spec/features/{sending_oneoff_emails.rb → sending_oneoff_emails_spec.rb} +3 -3
- data/spec/models/mail_campaign_spec.rb +11 -2
- data/spec/models/queued_mail_spec.rb +108 -34
- data/upgrading/migrations/smailer_v0_8_0_to_v0_8_1.rb +9 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6bf1b2eaf8471b07434e71803ce46eb6d971ad81
|
4
|
+
data.tar.gz: 3c761ccfcf13f68a90d57590c541e3935b6895dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b98a822ebfcce95f8ece649ed0b99a3522dc8e2c924e7fa8faf8f55f706bc8d97cc55d15e54b5b83c13877f07dcb0393ec8b5437644137d07721b40a0d3389f
|
7
|
+
data.tar.gz: 58cde2ebfc9c01c7d2d5d36655e50143f815157a9c72c51ef21c98318081f1d061d9c8be48474bab319d1787624f2742e72f54ea3be4e03870259c357d128294
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## Version v0.8.1
|
2
|
+
|
3
|
+
- Adds support for 'reply-to'
|
4
|
+
|
5
|
+
**Major Bug Fixes:**
|
6
|
+
|
7
|
+
- `QueuedMail.new(to: …, from: …, mail_campaign: …)` will work as expected 9ff2d80
|
8
|
+
- `QueuedMail#body_text=` now works as expected
|
9
|
+
|
1
10
|
## Version v0.8.0
|
2
11
|
|
3
12
|
- Adds support for one-off emails to be send via the same queueing mechanism.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -68,6 +68,7 @@ Here is an example how you could proceed with creating and issuing a newsletter:
|
|
68
68
|
# create a corresponding mail campaign
|
69
69
|
campaign_params = {
|
70
70
|
:from => 'noreply@example.org',
|
71
|
+
:reply_to => 'contact@example.org',
|
71
72
|
:subject => 'My First Campaign!',
|
72
73
|
:body_html => '<h1>Hello</h1><p>World</p>',
|
73
74
|
:body_text => 'Hello, world!',
|
@@ -105,9 +106,9 @@ You can send one-off emails that each have a different mail template:
|
|
105
106
|
# Changing the campaign now won't change anything in the one-off queued mails.
|
106
107
|
|
107
108
|
# Sending two mails to the same person for a single campaign:
|
108
|
-
campaign.queued_mails.create! :to => 'subscriber@domain.com', :body_html => 'second custom body', :body_text => 'second custom body', require_uniqueness => false
|
109
|
+
campaign.queued_mails.create! :to => 'subscriber@domain.com', :body_html => 'second custom body', :body_text => 'second custom body', :require_uniqueness => false
|
109
110
|
|
110
|
-
You can change the `from`, `subject`, `body_html`, `body_text` and you can also call `add_attachment`. For more info check [Smailer::Models::QueuedMail](lib/smailer/models/queued_mail.rb).
|
111
|
+
You can change the `from`, `reply_to`, `subject`, `body_html`, `body_text` and you can also call `add_attachment`. For more info check [Smailer::Models::QueuedMail](lib/smailer/models/queued_mail.rb).
|
111
112
|
|
112
113
|
### Attachments
|
113
114
|
|
@@ -62,6 +62,7 @@ class CreateSmailerTables < ActiveRecord::Migration
|
|
62
62
|
t.text "body_text"
|
63
63
|
t.datetime "created_at"
|
64
64
|
t.datetime "updated_at"
|
65
|
+
t.string "reply_to"
|
65
66
|
end
|
66
67
|
|
67
68
|
add_index "mail_templates", ["mail_campaign_id"], :name => "index_mail_templates_on_mail_campaign_id"
|
@@ -62,6 +62,7 @@ class CreateSmailerTables < ActiveRecord::Migration
|
|
62
62
|
t.text "body_text"
|
63
63
|
t.datetime "created_at"
|
64
64
|
t.datetime "updated_at"
|
65
|
+
t.string "reply_to"
|
65
66
|
end
|
66
67
|
|
67
68
|
add_index "mail_templates", ["mail_campaign_id"], :name => "index_mail_templates_on_mail_campaign_id"
|
@@ -13,15 +13,15 @@ module Smailer
|
|
13
13
|
|
14
14
|
has_one :mail_template, :dependent => :destroy, :autosave => true, :inverse_of => :mail_campaign
|
15
15
|
|
16
|
-
delegate :from, :subject, :body_html, :body_text, :to => :my_mail_template, :allow_nil => true
|
17
|
-
delegate :from=, :subject=, :body_html=, :body_text=, :to => :my_mail_template
|
16
|
+
delegate :from, :reply_to, :subject, :body_html, :body_text, :to => :my_mail_template, :allow_nil => true
|
17
|
+
delegate :from=, :reply_to=, :subject=, :body_html=, :body_text=, :to => :my_mail_template
|
18
18
|
|
19
19
|
validates_presence_of :mailing_list_id, :from
|
20
20
|
validates_numericality_of :mailing_list_id, :unsubscribe_methods, :only_integer => true, :allow_nil => true
|
21
21
|
validates_length_of :from, :subject, :maximum => 255, :allow_nil => true
|
22
22
|
|
23
23
|
unless Smailer::Compatibility.rails_4?
|
24
|
-
attr_accessible :mailing_list_id, :from, :subject, :body_html, :body_text
|
24
|
+
attr_accessible :mailing_list_id, :from, :reply_to, :subject, :body_html, :body_text
|
25
25
|
end
|
26
26
|
|
27
27
|
def add_unsubscribe_method(method_specification)
|
@@ -16,7 +16,7 @@ module Smailer
|
|
16
16
|
validates_length_of :to, :last_error, :maximum => 255, :allow_nil => true
|
17
17
|
|
18
18
|
unless Smailer::Compatibility.rails_4?
|
19
|
-
attr_accessible :mail_campaign_id, :to, :from, :subject, :body_html, :body_text, :require_uniqueness
|
19
|
+
attr_accessible :mail_campaign, :mail_campaign_id, :to, :from, :reply_to, :subject, :body_html, :body_text, :require_uniqueness
|
20
20
|
end
|
21
21
|
|
22
22
|
before_validation :initialize_message_key
|
@@ -25,8 +25,8 @@ module Smailer
|
|
25
25
|
before_save :nullify_false_require_uniqueness
|
26
26
|
|
27
27
|
delegate :mailing_list, :to => :mail_campaign, :allow_nil => true
|
28
|
-
delegate :from,
|
29
|
-
delegate :from=, :subject=, :body_html=, :body_text
|
28
|
+
delegate :from, :reply_to, :subject, :to => :active_mail_template, :allow_nil => true
|
29
|
+
delegate :from=, :reply_to=, :subject=, :body_html=, :body_text=, :to => :my_mail_template
|
30
30
|
|
31
31
|
def body_html
|
32
32
|
interpolate active_mail_template.body_html
|
@@ -49,6 +49,22 @@ module Smailer
|
|
49
49
|
my_mail_template.attachments.build(:filename => filename, :path => path)
|
50
50
|
end
|
51
51
|
|
52
|
+
def mail_campaign_id=(campaign_id)
|
53
|
+
write_attribute(:mail_campaign_id, campaign_id)
|
54
|
+
|
55
|
+
fill_from_campaign_template
|
56
|
+
|
57
|
+
mail_campaign_id
|
58
|
+
end
|
59
|
+
|
60
|
+
def mail_campaign=(campaign)
|
61
|
+
write_attribute(:mail_campaign_id, campaign.try(:id))
|
62
|
+
|
63
|
+
fill_from_campaign_template
|
64
|
+
|
65
|
+
mail_campaign
|
66
|
+
end
|
67
|
+
|
52
68
|
protected
|
53
69
|
|
54
70
|
def active_mail_template
|
@@ -58,16 +74,21 @@ module Smailer
|
|
58
74
|
def my_mail_template
|
59
75
|
return mail_template if mail_template.present?
|
60
76
|
|
61
|
-
build_mail_template.tap
|
62
|
-
|
63
|
-
|
77
|
+
build_mail_template.tap { fill_from_campaign_template }
|
78
|
+
end
|
79
|
+
|
80
|
+
def fill_from_campaign_template
|
81
|
+
if mail_campaign.present? and mail_template.present?
|
82
|
+
campaign_template = mail_campaign.mail_template
|
64
83
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
84
|
+
mail_template.from ||= campaign_template.from
|
85
|
+
mail_template.reply_to ||= campaign_template.reply_to
|
86
|
+
mail_template.subject ||= campaign_template.subject
|
87
|
+
mail_template.body_html ||= campaign_template.body_html
|
88
|
+
mail_template.body_text ||= campaign_template.body_text
|
69
89
|
|
70
|
-
|
90
|
+
if mail_template.attachments.blank?
|
91
|
+
mail_template.attachments = campaign_template.attachments.map(&:dup)
|
71
92
|
end
|
72
93
|
end
|
73
94
|
end
|
data/lib/smailer/tasks/send.rb
CHANGED
@@ -47,9 +47,10 @@ module Smailer
|
|
47
47
|
items_to_process.each do |queue_item|
|
48
48
|
# try to send the email
|
49
49
|
mail = Mail.new do
|
50
|
-
from
|
51
|
-
|
52
|
-
|
50
|
+
from queue_item.from
|
51
|
+
reply_to queue_item.reply_to if queue_item.reply_to.present?
|
52
|
+
to queue_item.to
|
53
|
+
subject queue_item.subject
|
53
54
|
queue_item.attachments.each do |attachment|
|
54
55
|
cached_attachments[attachment.id] ||= attachment.body
|
55
56
|
add_file :filename => attachment.filename,
|
data/lib/smailer/version.rb
CHANGED
data/spec/factories/models.rb
CHANGED
@@ -4,8 +4,9 @@ FactoryGirl.define do
|
|
4
4
|
end
|
5
5
|
|
6
6
|
factory :mail_template, class: Smailer::Models::MailTemplate do
|
7
|
-
from
|
8
|
-
|
7
|
+
from { generate(:email) }
|
8
|
+
reply_to { generate(:email) }
|
9
|
+
subject 'Hi there'
|
9
10
|
body_html '<h1>Hi there</h1>'
|
10
11
|
body_text 'Hi there'
|
11
12
|
end
|
@@ -14,6 +14,7 @@ describe 'Issuing a newsletter' do
|
|
14
14
|
# create a corresponding mail campaign
|
15
15
|
campaign_params = {
|
16
16
|
:from => 'noreply@example.org',
|
17
|
+
:reply_to => 'contact@example.org',
|
17
18
|
:subject => 'My First Campaign!',
|
18
19
|
:body_html => '<h1>Hello</h1><p>World</p>',
|
19
20
|
:body_text => 'Hello, world!',
|
@@ -17,7 +17,7 @@ describe 'Sending one-off emails' do
|
|
17
17
|
# if you change the campaign now it won't change the one-off queued_mails
|
18
18
|
|
19
19
|
# sending two mails to the same person
|
20
|
-
campaign.queued_mails.create! :to => 'subscriber@domain.com', :body_html => '<h1>second custom body</h1>', :body_text => 'second custom body', require_uniqueness => false
|
20
|
+
campaign.queued_mails.create! :to => 'subscriber@domain.com', :body_html => '<h1>second custom body</h1>', :body_text => 'second custom body', :require_uniqueness => false
|
21
21
|
|
22
22
|
expect(Smailer::Models::MailCampaign.count).to eq(1)
|
23
23
|
expect(Smailer::Models::MailTemplate.count).to eq(3) # 1 for the campaign and 2 for the one-off emails
|
@@ -33,8 +33,8 @@ describe 'Sending one-off emails' do
|
|
33
33
|
|
34
34
|
second_mail = campaign.queued_mails.last
|
35
35
|
|
36
|
-
expect(second_mail.from).to eq(
|
37
|
-
expect(second_mail.subject).to eq(
|
36
|
+
expect(second_mail.from).to eq(campaign.from)
|
37
|
+
expect(second_mail.subject).to eq(campaign.subject)
|
38
38
|
expect(second_mail.body_html).to eq('<h1>second custom body</h1>')
|
39
39
|
expect(second_mail.body_text).to eq('second custom body')
|
40
40
|
end
|
@@ -7,8 +7,9 @@ describe Smailer::Models::MailCampaign do
|
|
7
7
|
|
8
8
|
mail_campaign.mailing_list = FactoryGirl.create(:mailing_list)
|
9
9
|
|
10
|
-
mail_campaign.from
|
11
|
-
mail_campaign.
|
10
|
+
mail_campaign.from = '"test" <test@example.com>'
|
11
|
+
mail_campaign.reply_to = '"contacts" <contacts@example.com>'
|
12
|
+
mail_campaign.subject = 'This is my test'
|
12
13
|
mail_campaign.body_html = 'Hello html'
|
13
14
|
mail_campaign.body_text = 'Hello text'
|
14
15
|
|
@@ -23,6 +24,14 @@ describe Smailer::Models::MailCampaign do
|
|
23
24
|
expect(Smailer::Models::MailCampaign.count).to eq(1)
|
24
25
|
expect(Smailer::Models::MailTemplate.count).to eq(1)
|
25
26
|
expect(Smailer::Models::MailAttachment.count).to eq(1)
|
27
|
+
|
28
|
+
mail_campaign.reload
|
29
|
+
|
30
|
+
expect(mail_campaign.from).to eq ('"test" <test@example.com>')
|
31
|
+
expect(mail_campaign.reply_to).to eq ('"contacts" <contacts@example.com>')
|
32
|
+
expect(mail_campaign.subject).to eq ('This is my test')
|
33
|
+
expect(mail_campaign.body_html).to eq ('Hello html')
|
34
|
+
expect(mail_campaign.body_text).to eq ('Hello text')
|
26
35
|
end
|
27
36
|
end
|
28
37
|
end
|
@@ -1,6 +1,29 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Smailer::Models::QueuedMail do
|
4
|
+
describe '.new' do
|
5
|
+
it 'will fill the mail_template from the mail_campaign as expected' do
|
6
|
+
mail_campaign = FactoryGirl.create(:mail_campaign, :subject => 'Campaign subject', :from => 'from@campaign.com')
|
7
|
+
|
8
|
+
queued_mail = Smailer::Models::QueuedMail.new(
|
9
|
+
:to => 'someone@world.com',
|
10
|
+
:reply_to => 'reply@world.com',
|
11
|
+
:body_html => 'Custom html body',
|
12
|
+
:body_text => 'Custom text body',
|
13
|
+
:mail_campaign => mail_campaign
|
14
|
+
)
|
15
|
+
|
16
|
+
queued_mail.valid?
|
17
|
+
expect(queued_mail.errors).to be_blank
|
18
|
+
|
19
|
+
expect(queued_mail.from).to eq('from@campaign.com')
|
20
|
+
expect(queued_mail.subject).to eq('Campaign subject')
|
21
|
+
expect(queued_mail.reply_to).to eq('reply@world.com')
|
22
|
+
expect(queued_mail.body_html).to eq('Custom html body')
|
23
|
+
expect(queued_mail.body_text).to eq('Custom text body')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
4
27
|
describe '#save' do
|
5
28
|
it 'could be made only with mail_campaign and to (recipient)' do
|
6
29
|
mail_campaign = FactoryGirl.create(:mail_campaign)
|
@@ -25,40 +48,91 @@ describe Smailer::Models::QueuedMail do
|
|
25
48
|
expect(queued_mail.to).to eq('test@example.com')
|
26
49
|
end
|
27
50
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
describe 'when changing the mail_template' do
|
52
|
+
[
|
53
|
+
{:from => 'sender@example.com'},
|
54
|
+
{:reply_to => 'reply@example.com'},
|
55
|
+
{:subject => 'MY NEW SUBJECT'},
|
56
|
+
{:body_html => 'NEW HTML BODY'},
|
57
|
+
{:body_text => 'NEW TEXT BODY'},
|
58
|
+
].each do |changes|
|
59
|
+
it "would copy the mail_campaign template and modify the copy - changing #{changes}" do
|
60
|
+
mail_campaign = FactoryGirl.create(:mail_campaign)
|
61
|
+
mail_campaign.add_attachment 'foo.pdf', '/tmp/foo.pdf'
|
62
|
+
mail_campaign.save!
|
63
|
+
|
64
|
+
queued_mail = Smailer::Models::QueuedMail.new
|
65
|
+
|
66
|
+
queued_mail.mail_campaign = mail_campaign
|
67
|
+
queued_mail.to = 'text@example.com'
|
68
|
+
|
69
|
+
changes.each do |key, value|
|
70
|
+
queued_mail.public_send("#{key}=", value)
|
71
|
+
end
|
72
|
+
|
73
|
+
queued_mail.save!
|
74
|
+
|
75
|
+
mail_campaign.reload
|
76
|
+
queued_mail.reload
|
77
|
+
|
78
|
+
expect(queued_mail.from).to eq(changes[:from] || mail_campaign.from)
|
79
|
+
expect(queued_mail.reply_to).to eq(changes[:reply_to] || mail_campaign.reply_to)
|
80
|
+
expect(queued_mail.body_html).to eq(changes[:body_html] || mail_campaign.body_html)
|
81
|
+
expect(queued_mail.body_text).to eq(changes[:body_text] || mail_campaign.body_text)
|
82
|
+
expect(queued_mail.subject).to eq(changes[:subject] || mail_campaign.subject)
|
83
|
+
|
84
|
+
expect(queued_mail.attachments).to be_present
|
85
|
+
expect(mail_campaign.attachments).to be_present
|
86
|
+
expect(queued_mail.attachments.first.filename).to eq(mail_campaign.attachments.first.filename)
|
87
|
+
expect(queued_mail.attachments.first.path).to eq(mail_campaign.attachments.first.path)
|
88
|
+
|
89
|
+
expect(queued_mail.mail_template).to_not eq(mail_campaign.mail_template)
|
90
|
+
expect(queued_mail.attachments.first).to_not eq(mail_campaign.attachments.first)
|
91
|
+
|
92
|
+
expect(Smailer::Models::MailCampaign.count).to eq(1)
|
93
|
+
expect(Smailer::Models::MailTemplate.count).to eq(2)
|
94
|
+
expect(Smailer::Models::MailAttachment.count).to eq(2)
|
95
|
+
expect(Smailer::Models::QueuedMail.count).to eq(1)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it "would copy the mail_campaign template when adding an attachment" do
|
100
|
+
mail_campaign = FactoryGirl.create(:mail_campaign)
|
101
|
+
mail_campaign.add_attachment 'foo.pdf', '/tmp/foo.pdf'
|
102
|
+
mail_campaign.save!
|
103
|
+
|
104
|
+
queued_mail = Smailer::Models::QueuedMail.new
|
105
|
+
|
106
|
+
queued_mail.mail_campaign = mail_campaign
|
107
|
+
queued_mail.to = 'text@example.com'
|
108
|
+
|
109
|
+
queued_mail.add_attachment('bar.pdf', '/tmp/bar.pdf')
|
110
|
+
|
111
|
+
queued_mail.save!
|
112
|
+
|
113
|
+
mail_campaign.reload
|
114
|
+
queued_mail.reload
|
115
|
+
|
116
|
+
expect(queued_mail.from).to eq(mail_campaign.from)
|
117
|
+
expect(queued_mail.body_html).to eq(mail_campaign.body_html)
|
118
|
+
expect(queued_mail.body_text).to eq(mail_campaign.body_text)
|
119
|
+
expect(queued_mail.subject).to eq(mail_campaign.subject)
|
120
|
+
|
121
|
+
expect(queued_mail.attachments).to be_present
|
122
|
+
expect(mail_campaign.attachments).to be_present
|
123
|
+
expect(queued_mail.attachments.first.filename).to eq(mail_campaign.attachments.first.filename)
|
124
|
+
expect(queued_mail.attachments.first.path).to eq(mail_campaign.attachments.first.path)
|
125
|
+
expect(queued_mail.attachments.last.filename).to eq('bar.pdf')
|
126
|
+
expect(queued_mail.attachments.last.path).to eq('/tmp/bar.pdf')
|
127
|
+
|
128
|
+
expect(queued_mail.mail_template).to_not eq(mail_campaign.mail_template)
|
129
|
+
expect(queued_mail.attachments.first).to_not eq(mail_campaign.attachments.first)
|
130
|
+
|
131
|
+
expect(Smailer::Models::MailCampaign.count).to eq(1)
|
132
|
+
expect(Smailer::Models::MailTemplate.count).to eq(2)
|
133
|
+
expect(Smailer::Models::MailAttachment.count).to eq(3)
|
134
|
+
expect(Smailer::Models::QueuedMail.count).to eq(1)
|
135
|
+
end
|
62
136
|
end
|
63
137
|
end
|
64
138
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitar Dimitrov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06
|
11
|
+
date: 2015-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -133,11 +133,12 @@ files:
|
|
133
133
|
- spec/factories/common.rb
|
134
134
|
- spec/factories/models.rb
|
135
135
|
- spec/features/issuing_a_newsletter_spec.rb
|
136
|
-
- spec/features/
|
136
|
+
- spec/features/sending_oneoff_emails_spec.rb
|
137
137
|
- spec/models/mail_campaign_spec.rb
|
138
138
|
- spec/models/queued_mail_spec.rb
|
139
139
|
- spec/spec_helper.rb
|
140
140
|
- upgrading/migrations/smailer_v0_7_3_to_v0_8_0.rb
|
141
|
+
- upgrading/migrations/smailer_v0_8_0_to_v0_8_1.rb
|
141
142
|
homepage: http://github.com/livebg/smailer
|
142
143
|
licenses: []
|
143
144
|
metadata: {}
|