smailer 0.6.3 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0ad9b68b1053871829e187454142b621a48935f
4
- data.tar.gz: 5179717f9a0447996510e2f1dff7081b8d601245
3
+ metadata.gz: c72c27e350a0cd53f23e5b4e961f4addceea0fff
4
+ data.tar.gz: 6c4fe79f61f4e3ec824d1b6f33d6b9177a9e7ba0
5
5
  SHA512:
6
- metadata.gz: 8ec561c47706b8b7271a2b73b4428db6cf3156bca66e93846329a6a0ffa83185fec6f961d7016800cdc6bfdc446fd9f3af17d609c92f14956f61626b869ba3ae
7
- data.tar.gz: 2abf5eb90fa6042aba5412fe4631568ed27a907d126a358b4ce76f18467dd812281ff70cbe54e99ac23201b62da1517be0d3d937a9f5e52a7d167f1e5eff5ce5
6
+ metadata.gz: 78a7371b1ec129605f13b0998ad7dc8a41ee462ab077213becdbd88d6bf43e03eda6dd5fdf6ca571e8891a7fc1c5685c0b6393f781b41ef859aee875784dd286
7
+ data.tar.gz: 9a9fcd6397f2735e5fd8eb8c5fdb5a7056831c994c69b9b52ec2d06f8162c0a2fe55b777a9c923ba921e98e6e2fb3b5770c6c606e24239f24655f53dba18e137
data/README.md CHANGED
@@ -54,7 +54,7 @@ Here is an example how you could proceed with creating and issuing a newsletter:
54
54
 
55
55
  # locate the mailing list we'll be sending to
56
56
  list = Smailer::Models::MailingList.first
57
-
57
+
58
58
  # create a corresponding mail campaign
59
59
  campaign_params = {
60
60
  :from => 'noreply@example.org',
@@ -66,7 +66,10 @@ Here is an example how you could proceed with creating and issuing a newsletter:
66
66
  campaign = Smailer::Models::MailCampaign.new campaign_params
67
67
  campaign.add_unsubscribe_method :all
68
68
  campaign.save!
69
-
69
+
70
+ # Add attachments
71
+ campaign.add_attachment 'attachment.pdf', 'url_or_file_path_to_attachment'
72
+
70
73
  # enqueue mails to be sent out
71
74
  subscribers = %w[
72
75
  subscriber@domain.com
@@ -77,10 +80,15 @@ Here is an example how you could proceed with creating and issuing a newsletter:
77
80
  campaign.queued_mails.create! :to => subscriber
78
81
  end
79
82
 
83
+ ### Attachments
84
+
85
+ You can have zero or more attachments to any mail campaign. As demonstrated in the example above, you add them to the campain using the `MailCampaign#add_attachment(file_name, url_or_path)` method.
86
+
87
+ Any attached files will be referenced at the moment of sending and must be reachable and readable by the send task. Currently, `open-uri` is used to fetch the content of the path or URI. The maximum length of the path/URI field is 2048 symbols.
80
88
 
81
89
  ### Managing unsubscriptions
82
90
 
83
- Among the few unsubscription methods supported, probably the most widely used one is unsubscription via a unsubscribe link in the email.
91
+ Among the few unsubscription methods supported, probably the most widely used one is unsubscription via a unsubscribe link in the email.
84
92
 
85
93
  In order to help you with implementing it, Smailer provides you with some interpolations you can use in the email's body:
86
94
 
@@ -145,7 +153,7 @@ Suppose you manage your site's newsletter subscriptions via a `Subscription` mod
145
153
  :subscribed_checker => subscribed_checker,
146
154
  }) do |unsubscribe_details|
147
155
  subscription = Subscription.confirmed.subscribed.where(:email => unsubscribe_details[:recipient]).first
148
-
156
+
149
157
  if subscription
150
158
  subscription.subscribed = false
151
159
  subscription.unsubscribe_reason = 'Automatic, due to bounces'
@@ -37,6 +37,15 @@ class CreateSmailerTables < ActiveRecord::Migration
37
37
  add_index "queued_mails", ["locked", "retries", "id"], :name => "index_queued_mails_on_locked_retries_and_id"
38
38
  add_index "queued_mails", ["locked", "locked_at"], :name => "index_queued_mails_on_locked_and_locked_at"
39
39
 
40
+ create_table "mail_campaign_attachments", :force => true do |t|
41
+ t.integer "mail_campaign_id", :null => false
42
+ t.string "filename", :null => false
43
+ t.string "path", :limit => 2048
44
+ t.datetime "created_at"
45
+ t.datetime "updated_at"
46
+ end
47
+ add_index "mail_campaign_attachments", "mail_campaign_id"
48
+
40
49
  create_table "finished_mails", :force => true do |t|
41
50
  t.integer "mail_campaign_id"
42
51
  t.string "from"
@@ -79,23 +88,11 @@ class CreateSmailerTables < ActiveRecord::Migration
79
88
 
80
89
  def self.down
81
90
  drop_table :smailer_properties
82
-
83
- remove_index :mail_keys, :name => "index_mail_keys_on_email"
84
- remove_index :mail_keys, :name => "index_mail_keys_on_email"
85
91
  drop_table :mail_keys
86
-
87
- remove_index :finished_mails, :name => "index_finished_mails_on_key"
88
- remove_index :finished_mails, :name => "index_finished_mails_on_mail_campain_id_and_status"
89
- remove_index :finished_mails, :name => "index_finished_mails_on_to_and_mail_campaign_id"
90
92
  drop_table :finished_mails
91
-
92
- remove_index :queued_mails, :name => "index_queued_mails_on_mail_campain_id_and_to"
93
- remove_index :queued_mails, :name => "index_queued_mails_on_retries"
94
93
  drop_table :queued_mails
95
-
96
- remove_index :mail_campaigns, :name => "index_mail_campaigns_on_mailing_list_id"
94
+ drop_table :mail_campaign_attachments
97
95
  drop_table :mail_campaigns
98
-
99
96
  drop_table :mailing_lists
100
97
  end
101
98
  end
@@ -37,6 +37,15 @@ class CreateSmailerTables < ActiveRecord::Migration
37
37
  add_index "queued_mails", ["locked", "retries", "id"], :name => "index_queued_mails_on_locked_retries_and_id"
38
38
  add_index "queued_mails", ["locked", "locked_at"], :name => "index_queued_mails_on_locked_and_locked_at"
39
39
 
40
+ create_table "mail_campaign_attachments", :force => true do |t|
41
+ t.integer "mail_campaign_id", :null => false
42
+ t.string "filename", :null => false
43
+ t.string "path", :limit => 2048
44
+ t.datetime "created_at"
45
+ t.datetime "updated_at"
46
+ end
47
+ add_index "mail_campaign_attachments", "mail_campaign_id"
48
+
40
49
  create_table "finished_mails", :force => true do |t|
41
50
  t.integer "mail_campaign_id"
42
51
  t.string "from"
@@ -79,23 +88,11 @@ class CreateSmailerTables < ActiveRecord::Migration
79
88
 
80
89
  def self.down
81
90
  drop_table :smailer_properties
82
-
83
- remove_index :mail_keys, :name => "index_mail_keys_on_email"
84
- remove_index :mail_keys, :name => "index_mail_keys_on_email"
85
91
  drop_table :mail_keys
86
-
87
- remove_index :finished_mails, :name => "index_finished_mails_on_key"
88
- remove_index :finished_mails, :name => "index_finished_mails_on_mail_campain_id_and_status"
89
- remove_index :finished_mails, :name => "index_finished_mails_on_to_and_mail_campaign_id"
90
92
  drop_table :finished_mails
91
-
92
- remove_index :queued_mails, :name => "index_queued_mails_on_mail_campain_id_and_to"
93
- remove_index :queued_mails, :name => "index_queued_mails_on_retries"
94
93
  drop_table :queued_mails
95
-
96
- remove_index :mail_campaigns, :name => "index_mail_campaigns_on_mailing_list_id"
94
+ drop_table :mail_campaign_attachments
97
95
  drop_table :mail_campaigns
98
-
99
96
  drop_table :mailing_lists
100
97
  end
101
98
  end
@@ -2,6 +2,7 @@ module Smailer
2
2
  module Models
3
3
  autoload :MailingList, 'smailer/models/mailing_list'
4
4
  autoload :MailCampaign, 'smailer/models/mail_campaign'
5
+ autoload :MailCampaignAttachment, 'smailer/models/mail_campaign_attachment'
5
6
  autoload :MailKey, 'smailer/models/mail_key'
6
7
  autoload :QueuedMail, 'smailer/models/queued_mail'
7
8
  autoload :FinishedMail, 'smailer/models/finished_mail'
@@ -10,6 +10,8 @@ module Smailer
10
10
  belongs_to :mailing_list
11
11
  has_many :queued_mails, :dependent => :destroy
12
12
  has_many :finished_mails, :dependent => :destroy
13
+ has_many :attachments,
14
+ :class_name => '::Smailer::Models::MailCampaignAttachment'
13
15
 
14
16
  validates_presence_of :mailing_list_id, :from
15
17
  validates_numericality_of :mailing_list_id, :unsubscribe_methods, :only_integer => true, :allow_nil => true
@@ -48,6 +50,10 @@ module Smailer
48
50
  opened_mails_count.to_f / sent_mails_count
49
51
  end
50
52
 
53
+ def add_attachment(filename, path)
54
+ self.attachments.create!(:filename => filename, :path => path)
55
+ end
56
+
51
57
  def self.unsubscribe_methods
52
58
  methods = {}
53
59
  UnsubscribeMethods.constants.map do |method_name|
@@ -0,0 +1,19 @@
1
+ require 'open-uri'
2
+
3
+ module Smailer
4
+ module Models
5
+ class MailCampaignAttachment < ActiveRecord::Base
6
+
7
+ belongs_to :mail_campaign
8
+ validates_presence_of :mail_campaign_id
9
+ validates_numericality_of :mail_campaign_id
10
+ validates_presence_of :path
11
+ validates_presence_of :filename
12
+
13
+ def body
14
+ open(self.path).read
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -53,12 +53,21 @@ module Smailer
53
53
  Smailer::Models::QueuedMail.update_all(lock_update, lock_condition)
54
54
  end
55
55
 
56
+ # map of attachment ID to contents - so we don't keep opening files
57
+ # or URLs
58
+ cached_attachments = {}
59
+
56
60
  items_to_process.each do |queue_item|
57
61
  # try to send the email
58
62
  mail = Mail.new do
59
63
  from queue_item.from
60
64
  to queue_item.to
61
65
  subject queue_item.subject
66
+ queue_item.mail_campaign.attachments.each do |attachment|
67
+ cached_attachments[attachment.id] ||= attachment.body
68
+ add_file :filename => attachment.filename,
69
+ :content => cached_attachments[attachment.id]
70
+ end
62
71
 
63
72
  text_part { body queue_item.body_text }
64
73
  html_part { body queue_item.body_html; content_type 'text/html; charset=UTF-8' }
@@ -1,7 +1,7 @@
1
1
  module Smailer
2
2
  MAJOR = 0
3
- MINOR = 6
4
- PATCH = 3
3
+ MINOR = 7
4
+ PATCH = 0
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].join('.')
7
7
  end
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.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitar Dimitrov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-22 00:00:00.000000000 Z
11
+ date: 2014-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -75,6 +75,7 @@ files:
75
75
  - lib/smailer/models.rb
76
76
  - lib/smailer/models/finished_mail.rb
77
77
  - lib/smailer/models/mail_campaign.rb
78
+ - lib/smailer/models/mail_campaign_attachment.rb
78
79
  - lib/smailer/models/mail_key.rb
79
80
  - lib/smailer/models/mailing_list.rb
80
81
  - lib/smailer/models/property.rb