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, this id should be unique)
11
- def queue(new_recipients, limit = nil)
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
- while rcpt = new_recipients.shift do
14
- next unless recipients.where(:subscriber_id => rcpt.subscriber_id).count == 0
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
- rcpt.email_address.strip!
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 = recipients.create(:name => rcpt.name, :email_address => rcpt.email_address,
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 :email_campaign
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.class.where(:campaign_id => campaign_id, :email_address => rcpt.email_address).count > 0
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?(rcpt.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 => rcpt.email_address, :unsubscribed => true).count > 0
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
@@ -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.4"
32
- s.add_dependency "net-dns", "~> 0.7.1"
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
@@ -1,3 +1,3 @@
1
1
  module EmailCampaign
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  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.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-27 00:00:00.000000000 Z
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.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.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.1
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.1
77
+ version: 0.7.0
62
78
  - !ruby/object:Gem::Dependency
63
79
  name: sqlite3
64
80
  requirement: !ruby/object:Gem::Requirement