email_campaign 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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