email_campaign 0.1.1 → 0.1.2
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.
@@ -2,26 +2,64 @@ class EmailCampaign::Campaign < ActiveRecord::Base
|
|
2
2
|
set_table_name "email_campaigns"
|
3
3
|
|
4
4
|
attr_accessible :name, :mailer, :method, :params_yaml, :deliver_at,
|
5
|
-
:finalized, :queued, :delivered
|
5
|
+
:finalized, :queued, :delivered,
|
6
|
+
:delivery_started_at, :delivery_finished_at
|
6
7
|
|
7
|
-
has_many :recipients, :class_name => 'EmailCampaign::Recipient'
|
8
|
+
has_many :recipients, :class_name => 'EmailCampaign::Recipient', :foreign_key => 'email_campaign_id'
|
8
9
|
|
9
10
|
# new_recipients should be an Array of objects that respond to #email, #name, and #subscriber_id
|
10
|
-
# (falls back to #id if #subscriber_id doesn't exist; either way,
|
11
|
-
def
|
11
|
+
# (falls back to #id if #subscriber_id doesn't exist; either way, id should be unique within campaign)
|
12
|
+
def add_recipients(new_recipients, limit = nil)
|
13
|
+
new_recipients = [ new_recipients ] unless new_recipients.is_a?(Array)
|
14
|
+
|
12
15
|
count = 0
|
13
|
-
|
14
|
-
|
16
|
+
new_recipients.each do |rcpt|
|
17
|
+
subscriber_id = rcpt.subscriber_id || rcpt.id
|
18
|
+
# next if subscriber_id && recipients.where(:subscriber_id => subscriber_id).count > 0
|
15
19
|
|
16
|
-
rcpt.name.strip
|
17
|
-
|
20
|
+
r = recipients.create(:name => rcpt.name.strip, :email_address => rcpt.email_address.strip,
|
21
|
+
:subscriber_class_name => rcpt.class.name, :subscriber_id => subscriber_id)
|
18
22
|
|
19
|
-
r
|
20
|
-
:subscriber_class_name => rcpt.class.name, :subscriber_id => rcpt.subscriber_id || rcpt.id)
|
21
|
-
|
22
|
-
r.queue if count < limit
|
23
|
+
r.queue unless limit && count >= limit
|
23
24
|
count += 1
|
24
25
|
end
|
26
|
+
|
27
|
+
recipients.where(:ready => true).count
|
28
|
+
end
|
29
|
+
|
30
|
+
def queue(deliver_at = Time.now.utc)
|
31
|
+
# update_attributes(:deliver_at => deliver_at, :queued => true, :queued_at => Time.now.utc)
|
32
|
+
update_attributes(:deliver_at => deliver_at, :queued => true)
|
33
|
+
end
|
34
|
+
|
35
|
+
# delivers campaign NOW, ignoring deliver_at setting
|
36
|
+
def deliver!(unsanitary = false)
|
37
|
+
sent = []
|
38
|
+
error = []
|
39
|
+
|
40
|
+
update_attributes(:delivery_started_at => Time.now.utc) unless delivery_started_at
|
41
|
+
|
42
|
+
if unsanitary
|
43
|
+
SanitizeEmail.unsanitary { process_delivery }
|
44
|
+
else
|
45
|
+
process_delivery
|
46
|
+
end
|
47
|
+
|
48
|
+
# update_attributes(:delivered => true, :delivered_at => Time.now.utc)
|
49
|
+
update_attributes(:delivered => true, :delivery_finished_at => Time.now.utc)
|
50
|
+
end
|
51
|
+
|
52
|
+
def process_delivery
|
53
|
+
sent = []
|
54
|
+
error = []
|
55
|
+
recipients.where(:ready => true).each do |r|
|
56
|
+
# begin
|
57
|
+
mailer.constantize.send(method.to_sym, r).deliver
|
58
|
+
sent << r
|
59
|
+
# rescue Exception => e
|
60
|
+
# error << [ r, e ]
|
61
|
+
# end
|
62
|
+
end
|
25
63
|
end
|
26
64
|
|
27
65
|
end
|
@@ -5,39 +5,47 @@ class EmailCampaign::Recipient < ActiveRecord::Base
|
|
5
5
|
:ready, :duplicate, :invalid_email, :unsubscribed,
|
6
6
|
:subscriber_class_name, :subscriber_id
|
7
7
|
|
8
|
-
belongs_to :
|
8
|
+
belongs_to :campaign, :class_name => 'EmailCampaign::Campaign', :foreign_key => 'email_campaign_id'
|
9
9
|
|
10
10
|
before_save :check_name, :check_for_duplicates, :check_email_address, :check_for_unsubscribe
|
11
11
|
|
12
12
|
def check_name
|
13
13
|
self.name = nil if name.blank?
|
14
|
+
|
15
|
+
true
|
14
16
|
end
|
15
17
|
|
16
18
|
def check_for_duplicates
|
17
|
-
if self.
|
19
|
+
if self.campaign.recipients.where(:email_address => email_address).where('id != ?', id).count > 0
|
18
20
|
self.ready = false
|
19
21
|
self.duplicate = true
|
20
22
|
else
|
21
23
|
self.duplicate = false
|
22
24
|
end
|
25
|
+
|
26
|
+
true
|
23
27
|
end
|
24
28
|
|
25
29
|
def check_email_address
|
26
|
-
if valid_email_address?(
|
30
|
+
if valid_email_address?(email_address)
|
27
31
|
self.invalid_email = false
|
28
32
|
else
|
29
33
|
self.ready = false
|
30
34
|
self.invalid_email = true
|
31
35
|
end
|
36
|
+
|
37
|
+
true
|
32
38
|
end
|
33
39
|
|
34
40
|
def check_for_unsubscribe
|
35
|
-
if self.class.where(:email_address =>
|
41
|
+
if self.class.where(:email_address => email_address, :unsubscribed => true).count > 0
|
36
42
|
self.unsubscribed = true
|
37
43
|
self.ready = false
|
38
44
|
else
|
39
45
|
self.unsubscribed = false
|
40
46
|
end
|
47
|
+
|
48
|
+
true
|
41
49
|
end
|
42
50
|
|
43
51
|
def queue
|
data/email_campaign.gemspec
CHANGED
@@ -14,22 +14,23 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.homepage = "https://github.com/anamba/email_campaign"
|
15
15
|
s.summary = %q{Email campaign delivery for Rails apps}
|
16
16
|
s.description = %q{See README for details.}
|
17
|
-
|
17
|
+
|
18
18
|
s.required_ruby_version = '>= 1.9.3'
|
19
19
|
s.required_rubygems_version = '>= 1.8.11'
|
20
|
-
|
20
|
+
|
21
21
|
s.license = 'MIT'
|
22
22
|
|
23
23
|
# s.rubyforge_project = "email_campaign"
|
24
|
-
|
24
|
+
|
25
25
|
s.files = `git ls-files`.split("\n")
|
26
26
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
27
27
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
28
28
|
s.require_paths = ["lib"]
|
29
29
|
|
30
30
|
s.add_dependency "actionmailer", "~> 3.2.12"
|
31
|
-
s.add_dependency "mail", "~> 2.4.
|
32
|
-
s.add_dependency "
|
31
|
+
s.add_dependency "mail", "~> 2.4.0"
|
32
|
+
s.add_dependency "delayed_job", "~> 3.0.0"
|
33
|
+
s.add_dependency "net-dns", "~> 0.7.0"
|
33
34
|
|
34
35
|
s.add_development_dependency "sqlite3"
|
35
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: email_campaign
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionmailer
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.4.
|
37
|
+
version: 2.4.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,23 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 2.4.
|
45
|
+
version: 2.4.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: delayed_job
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 3.0.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.0.0
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: net-dns
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +66,7 @@ dependencies:
|
|
50
66
|
requirements:
|
51
67
|
- - ~>
|
52
68
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.7.
|
69
|
+
version: 0.7.0
|
54
70
|
type: :runtime
|
55
71
|
prerelease: false
|
56
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +74,7 @@ dependencies:
|
|
58
74
|
requirements:
|
59
75
|
- - ~>
|
60
76
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.7.
|
77
|
+
version: 0.7.0
|
62
78
|
- !ruby/object:Gem::Dependency
|
63
79
|
name: sqlite3
|
64
80
|
requirement: !ruby/object:Gem::Requirement
|