mail_engine 0.1.3 → 0.1.4
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.
- data/README.mkd +39 -6
- data/VERSION +1 -1
- data/app/controllers/mail_engine/mail_schedules_controller.rb +16 -0
- data/app/helpers/mail_engine/mail_engine_helper.rb +1 -1
- data/app/models/mail_engine/mail_schedule.rb +54 -29
- data/app/models/mail_engine/mail_template.rb +1 -1
- data/app/views/mail_engine/dashboard/index.html.erb +35 -31
- data/app/views/mail_engine/mail_schedules/_form.html.erb +5 -0
- data/app/views/mail_engine/mail_schedules/index.html.erb +27 -1
- data/app/views/mail_engine/reports/index.html.erb +1 -1
- data/config/routes.rb +2 -0
- data/db/migrate/20110126030525_create_mail_schedules.rb +1 -0
- data/lib/mail_engine/action_mailer_patch.rb +8 -3
- data/lib/mail_engine/engine.rb +1 -0
- data/lib/mail_engine/sendgrid/base.rb +1 -0
- data/lib/mail_engine/sendgrid/smtp_api.rb +11 -3
- data/lib/mail_engine/tasks/export_mail_engine_database.rake +17 -0
- data/lib/mail_engine/tasks/sendmail.rake +1 -1
- data/mail_engine.gemspec +11 -3
- data/public/images/mail_engine/icons/pause.png +0 -0
- data/public/images/mail_engine/icons/play.png +0 -0
- data/public/images/mail_engine/icons/start.png +0 -0
- data/public/images/mail_engine/icons/stop.png +0 -0
- data/test/dummy/app/mailers/user_mailer.rb +1 -1
- data/test/dummy/app/views/user_mailer/{notify.text.erb → notify.text.liquid} +0 -0
- data/test/dummy/config/environments/development.rb +1 -0
- data/test/dummy/db/migrate/20110125094530_create_users.rb +2 -0
- data/test/dummy/db/migrate/20110126030525_create_mail_schedules.rb +1 -0
- data/test/dummy/db/schema.rb +1 -0
- data/test/dummy/public/images/mail_engine/icons/pause.png +0 -0
- data/test/dummy/public/images/mail_engine/icons/start.png +0 -0
- data/test/dummy/public/images/mail_engine/icons/stop.png +0 -0
- data/test/functional/user_mailer_test.rb +16 -6
- data/test/unit/mail_engine/mail_schedule_test.rb +34 -3
- metadata +13 -5
data/README.mkd
CHANGED
|
@@ -42,21 +42,48 @@ Add management page needed javascript lib and css files, migration files and mai
|
|
|
42
42
|
Run migration.
|
|
43
43
|
|
|
44
44
|
rake db:migrate
|
|
45
|
-
|
|
45
|
+
|
|
46
46
|
** Step 4: **
|
|
47
47
|
|
|
48
48
|
Add acts_as_mail_receiver definition to "Your User" model.
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
class User < AR
|
|
51
|
+
acts_as_mail_receiver :payload_columns => %w{firstname lastname},
|
|
52
|
+
:groups => %w{all english_users chinese_users}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
55
|
1. User model must have 'email' and payload specified columns, or else you can delegate to other model.
|
|
56
56
|
2. "acts_as_mail_receiver" statement has to place below the scope statements.
|
|
57
57
|
|
|
58
58
|
** Step 5: **
|
|
59
59
|
|
|
60
|
+
Add sendgrid smtp api configure:
|
|
61
|
+
|
|
62
|
+
class UserMailer < ActionMailer::Base
|
|
63
|
+
sendgrid_header do
|
|
64
|
+
category "xxx"
|
|
65
|
+
|
|
66
|
+
filters {
|
|
67
|
+
opentrack "enable" => 1
|
|
68
|
+
clicktrack "enable" => 1
|
|
69
|
+
subscriptiontrack "enable" => 0
|
|
70
|
+
template "enable" => 0
|
|
71
|
+
footer "enable" => 0
|
|
72
|
+
}
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
For the detail information please check sendgrid.com.
|
|
77
|
+
|
|
78
|
+
** Step 6: **
|
|
79
|
+
|
|
80
|
+
Add below line to production.rb or development.rb for specifing the host.
|
|
81
|
+
it will used when generate resource url when upload zip file.
|
|
82
|
+
|
|
83
|
+
config.action_mailer.default_url_options = { :host => "lvh.me:3000" }
|
|
84
|
+
|
|
85
|
+
** Step 7: **
|
|
86
|
+
|
|
60
87
|
Add below line to the crontab list of your sever:
|
|
61
88
|
|
|
62
89
|
### check mail schedule for every 15 minutes ###
|
|
@@ -97,6 +124,12 @@ Notes
|
|
|
97
124
|
=====
|
|
98
125
|
Currently only support above rails3.
|
|
99
126
|
|
|
127
|
+
Tips
|
|
128
|
+
====
|
|
129
|
+
Use below rake task, you can export local mail engine data, then import to production environment.
|
|
130
|
+
|
|
131
|
+
rake mail_engine:export_mail_engine_database
|
|
132
|
+
|
|
100
133
|
Screenshots
|
|
101
134
|
===========
|
|
102
135
|
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1.
|
|
1
|
+
0.1.4
|
|
@@ -49,6 +49,22 @@ class MailEngine::MailSchedulesController < MailEngine::ApplicationController
|
|
|
49
49
|
render :text => %Q{alert("Test Mail failed to send to #{params[:recipient]}, due to #{e.to_s}"); $('#recipient').val('');}
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
+
def start
|
|
53
|
+
if @mail_schedule.update_attribute :available, true
|
|
54
|
+
render :js => %Q{alert('Start schedule successfully.'); showStopScheduleButton(#{@mail_schedule.id});}
|
|
55
|
+
else
|
|
56
|
+
render :js => %Q{alert('Failed to start schedule.')}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def stop
|
|
61
|
+
if @mail_schedule.update_attribute :available, false
|
|
62
|
+
render :js => %Q{alert('Stop schedule successfully.'); showStartScheduleButton(#{@mail_schedule.id});}
|
|
63
|
+
else
|
|
64
|
+
render :js => %Q{alert('Failed to stop schedule.')}
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
52
68
|
private
|
|
53
69
|
def find_model
|
|
54
70
|
@mail_schedule = MailSchedule.find(params[:id]) if params[:id]
|
|
@@ -2,7 +2,7 @@ module MailEngine
|
|
|
2
2
|
module MailEngineHelper
|
|
3
3
|
|
|
4
4
|
def show_no_record collection, &block
|
|
5
|
-
if collection.is_a?(Array) ? collection.blank? : collection.all.blank?
|
|
5
|
+
if collection.is_a?(Array) ? collection.blank? : collection.try(:all).blank?
|
|
6
6
|
return raw("<div class='notice' style='margin-top:10px'>No Record</div>")
|
|
7
7
|
else
|
|
8
8
|
block.call
|
|
@@ -20,22 +20,67 @@ class MailEngine::MailSchedule < ActiveRecord::Base
|
|
|
20
20
|
validates_presence_of :name, :user_group, :mail_template_id, :period, :count, :first_send_at
|
|
21
21
|
validates_inclusion_of :period, :in => %w( once daily weekly monthly yearly), :message => "period should in 'daily', 'weekly' and 'monthly'"
|
|
22
22
|
belongs_to :mail_template
|
|
23
|
-
scope :available, where("sent_count < count OR count = 0")
|
|
23
|
+
scope :available, where("(sent_count < count OR count = 0) AND available=?", true)
|
|
24
24
|
|
|
25
25
|
PERIOD_TO_UNIT_TABLE = {
|
|
26
|
-
"daily" => "day",
|
|
27
|
-
"weekly" => "week",
|
|
28
|
-
"monthly" => "month",
|
|
29
|
-
"yearly" => "year"
|
|
26
|
+
"daily" => ["day", 1],
|
|
27
|
+
"weekly" => ["week", 7],
|
|
28
|
+
"monthly" => ["month", 30],
|
|
29
|
+
"yearly" => ["year", 365]
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
# will return an array like
|
|
33
|
+
#
|
|
34
|
+
# [
|
|
35
|
+
# [MailSchedule#xxx, 2010-01-01 20:15],
|
|
36
|
+
# [MailSchedule#xxx, 2010-01-01 20:15]
|
|
37
|
+
# ]
|
|
38
|
+
#
|
|
39
|
+
def self.future_schedules(schedule_count = 5)
|
|
40
|
+
schedule_count = 5 if schedule_count < 5
|
|
33
41
|
all_future_schedules = []
|
|
34
42
|
MailEngine::MailSchedule.available.all.each do |schedule|
|
|
35
|
-
next_schedules = [schedule].product(schedule.
|
|
36
|
-
all_future_schedules
|
|
43
|
+
next_schedules = [schedule].product(schedule.next_several_schedule_dates(schedule_count))
|
|
44
|
+
all_future_schedules += next_schedules if next_schedules.present?
|
|
45
|
+
end
|
|
46
|
+
# sort by date
|
|
47
|
+
all_future_schedules.sort{|x,y| x[1] <=> y[1]}.slice(1..schedule_count)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# FIXME monthly will has some problem due to each month is not exact 30 days.
|
|
51
|
+
# this func will return an array of date.
|
|
52
|
+
def next_several_schedule_dates(schedule_count = 5)
|
|
53
|
+
# check if send count reached the top limit count.
|
|
54
|
+
return [] if (sent_count >= count and count != 0)
|
|
55
|
+
# only send once.
|
|
56
|
+
if period == 'once'
|
|
57
|
+
# check if it is still available.
|
|
58
|
+
if first_send_at > Time.now
|
|
59
|
+
return [first_send_at]
|
|
60
|
+
else
|
|
61
|
+
return []
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# other periods
|
|
66
|
+
rest_count = (count == 0 ? schedule_count : count - sent_count)
|
|
67
|
+
(1..rest_count).map do |i|
|
|
68
|
+
last_schedule_time + i.send(PERIOD_TO_UNIT_TABLE[period].first)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# if a weekly schedule, first send at last monday, and today is tuesday, so the last schedule time should be this monday
|
|
73
|
+
# if a weekly schedule, first send at next monday, and today is tuesday, so the last schedule time should be the first_send_at
|
|
74
|
+
def last_schedule_time
|
|
75
|
+
period_unit = PERIOD_TO_UNIT_TABLE[period].first
|
|
76
|
+
period_days = PERIOD_TO_UNIT_TABLE[period].last
|
|
77
|
+
if first_send_at.past?
|
|
78
|
+
days_past = ((Time.now - first_send_at)/(3600*24)).round
|
|
79
|
+
periods_past = days_past / period_days
|
|
80
|
+
first_send_at + periods_past * 1.send(period_unit)
|
|
81
|
+
else
|
|
82
|
+
first_send_at
|
|
37
83
|
end
|
|
38
|
-
all_future_schedules.sort {|x,y| x[1] <=> y[1]}
|
|
39
84
|
end
|
|
40
85
|
|
|
41
86
|
# list mail log with the same mail_template_path to current mail_template's path
|
|
@@ -62,26 +107,6 @@ class MailEngine::MailSchedule < ActiveRecord::Base
|
|
|
62
107
|
end
|
|
63
108
|
end
|
|
64
109
|
|
|
65
|
-
def next_several_schedules(schedule_count = 5)
|
|
66
|
-
# check if send count reached the total count.
|
|
67
|
-
return [] if (sent_count >= count and count != 0)
|
|
68
|
-
# only send once.
|
|
69
|
-
if period == 'once'
|
|
70
|
-
if first_send_at > Time.now
|
|
71
|
-
return [first_send_at]
|
|
72
|
-
else
|
|
73
|
-
return []
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# other period
|
|
78
|
-
rest_count = (count == 0 ? schedule_count : count - sent_count)
|
|
79
|
-
start_datetime = Time.parse("#{(last_sent_at||first_send_at).strftime("%D")} #{first_send_at.strftime("%T")}")
|
|
80
|
-
(1..rest_count).map do |i|
|
|
81
|
-
start_datetime + i.send(PERIOD_TO_UNIT_TABLE[period])
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
110
|
# If execute sendmail twice very soon(within 14 minutes), it should not be able to send mail again.
|
|
86
111
|
def ready_to_send?
|
|
87
112
|
# check if send count reached the total count.
|
|
@@ -171,7 +171,7 @@ class MailEngine::MailTemplate < ActiveRecord::Base
|
|
|
171
171
|
end
|
|
172
172
|
|
|
173
173
|
# FIXME: remove the hostname
|
|
174
|
-
def process_zip_file(hostname = "localhost:3000")
|
|
174
|
+
def process_zip_file(hostname = ActionMailer::Base.default_url_options[:host] || "localhost:3000")
|
|
175
175
|
return if @extracted_files.blank?
|
|
176
176
|
self.update_attribute :body, MailEngine::HtmlDocumentAssetsReplacer.process(self, @extracted_files, hostname)
|
|
177
177
|
# remove the tmp files
|
|
@@ -66,46 +66,50 @@
|
|
|
66
66
|
</div>
|
|
67
67
|
<div class="clearer"></div>
|
|
68
68
|
|
|
69
|
-
<div class="today-report left">
|
|
69
|
+
<div class="today-report left" style="width: 920px;">
|
|
70
70
|
<h2>Next Scheduled Mail</h2>
|
|
71
71
|
<div class="clearer"></div>
|
|
72
|
-
|
|
73
|
-
<
|
|
74
|
-
<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
<
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
72
|
+
<%= show_no_record(future_schedules = MailEngine::MailSchedule.future_schedules) do %>
|
|
73
|
+
<table border="0" cellspacing="5" cellpadding="5" class="data-table" style="width: 910px; margin-top: 30px; margin-right: 30px">
|
|
74
|
+
<tr>
|
|
75
|
+
<th>Schedule Name</th><th width="120">Send Time</th>
|
|
76
|
+
</tr>
|
|
77
|
+
<% future_schedules.each do |schedule, scheduled_time| %>
|
|
78
|
+
<tr>
|
|
79
|
+
<td><%= link_to schedule.name, mail_schedule_path(schedule) %></td><td><%= scheduled_time.to_s(:db) %></td>
|
|
80
|
+
</tr>
|
|
81
|
+
<% end %>
|
|
82
|
+
</table>
|
|
83
|
+
<% end %>
|
|
82
84
|
</div>
|
|
83
85
|
<div class="clearer"></div>
|
|
84
86
|
|
|
85
|
-
<div class="today-report left">
|
|
87
|
+
<div class="today-report left" style="width: 920px;">
|
|
86
88
|
<h2>Recently Sent Mails</h2>
|
|
87
89
|
<div class="clearer"></div>
|
|
88
90
|
|
|
89
|
-
|
|
90
|
-
<
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
<%= show_no_record(mail_log = MailEngine::MailLog.order("id desc").limit(10)) do %>
|
|
92
|
+
<table class="data-table" style="width: 910px; margin-top: 30px; margin-right: 30px">
|
|
93
|
+
<tr>
|
|
94
|
+
<th>Subject</th>
|
|
95
|
+
<th>Sender</th>
|
|
96
|
+
<th>Recipient</th>
|
|
97
|
+
<th>mime_type</th>
|
|
98
|
+
<th>Sent at</th>
|
|
99
|
+
<th width="20"></th>
|
|
100
|
+
</tr>
|
|
98
101
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
102
|
+
<% mail_log.each do |log| %>
|
|
103
|
+
<tr class="even">
|
|
104
|
+
<td><%= log.subject %></td>
|
|
105
|
+
<td><%= log.sender %></td>
|
|
106
|
+
<td><%= log.recipient %></td>
|
|
107
|
+
<td><%= log.mime_type %></td>
|
|
108
|
+
<td><%= log.created_at %></td>
|
|
109
|
+
<td><%= link_to image_tag('mail_engine/icons/show.png'), mail_log_path(log) %></td>
|
|
110
|
+
</tr>
|
|
111
|
+
<% end %>
|
|
112
|
+
</table>
|
|
108
113
|
<% end %>
|
|
109
|
-
</table>
|
|
110
114
|
</div>
|
|
111
115
|
<div class="clearer"></div>
|
|
@@ -34,6 +34,11 @@
|
|
|
34
34
|
<%= f.label :first_send_at, "First Send At" %><br />
|
|
35
35
|
<%= f.datetime_select :first_send_at, :start_year => Time.now.year, :include_seconds => false, :minute_step => 15 %>
|
|
36
36
|
</div>
|
|
37
|
+
<div class="field">
|
|
38
|
+
<%= f.label :available, "Available?" %><br />
|
|
39
|
+
<%= f.check_box :available %>
|
|
40
|
+
<div class="hint">If you don't want to execute this schedule, leave it unchecked.</div>
|
|
41
|
+
</div>
|
|
37
42
|
<div class="field">
|
|
38
43
|
<%= f.label :payload %><br />
|
|
39
44
|
<% MailEngine::USER_MODEL.payload_columns.each do |column| %>
|
|
@@ -23,12 +23,24 @@
|
|
|
23
23
|
<tr><th>Payload</th>
|
|
24
24
|
<td><%= raw mail_schedule.payload.gsub(",", "<br/>") %></td>
|
|
25
25
|
</tr>
|
|
26
|
+
<tr><th>Availability</th><td class="availability_state_of_<%= mail_schedule.id %> loud large"><%= mail_schedule.available? ? "Running" : "Stopped" %></td></tr>
|
|
26
27
|
</table>
|
|
27
28
|
</td>
|
|
28
29
|
<td style="vertical-align:top">
|
|
29
30
|
<%= link_to image_tag('mail_engine/icons/show.png'), mail_schedule_path(mail_schedule) %>
|
|
30
31
|
<%= link_to image_tag('mail_engine/icons/edit.gif'), edit_mail_schedule_path(mail_schedule) %>
|
|
31
32
|
<%= link_to image_tag('mail_engine/icons/delete.png'), mail_schedule_path(mail_schedule), :confirm => 'Are you sure?', :method => :delete %>
|
|
33
|
+
<%= link_to image_tag('mail_engine/icons/start.png'), start_mail_schedule_path(mail_schedule), :confirm => 'Are you sure to start this schedule?', :class => "start_button_#{mail_schedule.id}", :remote => true, :method => :post %>
|
|
34
|
+
<%= link_to image_tag('mail_engine/icons/pause.png'), stop_mail_schedule_path(mail_schedule), :confirm => 'Are you sure to stop this schedule?', :class => "stop_button_#{mail_schedule.id}", :remote => true, :method => :post %>
|
|
35
|
+
<script>
|
|
36
|
+
$(function(){
|
|
37
|
+
if(<%= mail_schedule.available? %>) {
|
|
38
|
+
showStopScheduleButton("<%= mail_schedule.id %>");
|
|
39
|
+
} else {
|
|
40
|
+
showStartScheduleButton("<%= mail_schedule.id %>");
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
</script>
|
|
32
44
|
<br>
|
|
33
45
|
<%= form_tag send_test_mail_mail_schedule_path(mail_schedule), :remote => true do %>
|
|
34
46
|
<div>
|
|
@@ -54,4 +66,18 @@
|
|
|
54
66
|
</h5>
|
|
55
67
|
<div class="clearer"> </div>
|
|
56
68
|
</div>
|
|
57
|
-
</div>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<script>
|
|
72
|
+
function showStartScheduleButton(id) {
|
|
73
|
+
$(".start_button_" + id).show();
|
|
74
|
+
$(".stop_button_" + id).hide();
|
|
75
|
+
$(".availability_state_of_" + id).html("Stopped");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function showStopScheduleButton(id) {
|
|
79
|
+
$(".start_button_" + id).hide();
|
|
80
|
+
$(".stop_button_" + id).show();
|
|
81
|
+
$(".availability_state_of_" + id).html("Running");
|
|
82
|
+
}
|
|
83
|
+
</script>
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
|
|
68
68
|
<div id='line_chart'></div>
|
|
69
69
|
<div class="history" style="margin-top: 50px;">
|
|
70
|
-
<table border="0" cellspacing="5" cellpadding="5" class="data-table" style="width:
|
|
70
|
+
<table border="0" cellspacing="5" cellpadding="5" class="data-table" style="width: 910px;">
|
|
71
71
|
<tr>
|
|
72
72
|
<th>Date</th>
|
|
73
73
|
<th>Requests</th>
|
data/config/routes.rb
CHANGED
|
@@ -5,7 +5,12 @@ module ActionMailer
|
|
|
5
5
|
def mail(headers={}, &block)
|
|
6
6
|
# order by latest uploaded, for get the latest updated 'subject'
|
|
7
7
|
current_template = MailEngine::MailTemplate.where(:path => "#{controller_path}/#{action_name}", :locale => I18n.locale, :partial => false).order("updated_at desc").first
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
# {'username' => @username, 'gender' => @gender}
|
|
10
|
+
instance_variable_hash = {}
|
|
11
|
+
self.instance_variables.each { |var| instance_variable_hash[var.sub(/^@/,'')] = self.instance_variable_get(var) }
|
|
12
|
+
|
|
13
|
+
headers[:subject] = Liquid::Template.parse(current_template.subject).render(instance_variable_hash) if current_template.present?
|
|
9
14
|
headers[:message_id] = "#{controller_path}/#{action_name}"
|
|
10
15
|
|
|
11
16
|
unless block_given?
|
|
@@ -18,11 +23,11 @@ module ActionMailer
|
|
|
18
23
|
end
|
|
19
24
|
\e[0m"
|
|
20
25
|
end
|
|
21
|
-
|
|
26
|
+
|
|
22
27
|
# Add sendgrid header before sending mail.
|
|
23
28
|
# Why here but not add to default_params of action_mailer? because the receiver email [:to] only can get here.
|
|
24
29
|
if self.sendgrid_config
|
|
25
|
-
self.sendgrid_config.
|
|
30
|
+
self.sendgrid_config.set_send_to headers[:to]
|
|
26
31
|
origin_mail(headers.merge(self.sendgrid_config.to_hash), &block)
|
|
27
32
|
else
|
|
28
33
|
origin_mail(headers, &block)
|
data/lib/mail_engine/engine.rb
CHANGED
|
@@ -54,17 +54,25 @@ module MailEngine
|
|
|
54
54
|
@data["filters"] = filter_setting.data
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
+
# for now only allow to send to one receiver once.
|
|
58
|
+
# maybe we don't like people received a mail which allow people to view all receivers
|
|
59
|
+
def set_send_to(to)
|
|
60
|
+
@data['to'] ||= []
|
|
61
|
+
@data['to'] = Array.wrap(to)
|
|
62
|
+
@data['to'].uniq!
|
|
63
|
+
end
|
|
64
|
+
|
|
57
65
|
def add_to(to)
|
|
58
66
|
@data['to'] ||= []
|
|
59
|
-
@data['to'] +=
|
|
67
|
+
@data['to'] += Array.wrap(to)
|
|
60
68
|
@data['to'].uniq!
|
|
61
69
|
end
|
|
62
70
|
|
|
63
71
|
def add_sub_val(var, val)
|
|
64
72
|
@data['sub'] ||= {}
|
|
65
|
-
@data['sub'][var] =
|
|
73
|
+
@data['sub'][var] = Array.wrap(val)
|
|
66
74
|
end
|
|
67
|
-
|
|
75
|
+
|
|
68
76
|
def set_unique_args(val)
|
|
69
77
|
@data['unique_args'] = val if val.instance_of?(Hash)
|
|
70
78
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
namespace :mail_engine do
|
|
2
|
+
desc "Check mail schedule table and send the scheduled mail."
|
|
3
|
+
task :export_mail_engine_database => :environment do
|
|
4
|
+
datetime = Time.now.strftime("%Y%m%d")
|
|
5
|
+
|
|
6
|
+
db_config = YAML.load_file(File.join(Rails.root, 'config', 'database.yml'))[Rails.env]
|
|
7
|
+
db_username = db_config["username"]
|
|
8
|
+
db_password = db_config["password"]
|
|
9
|
+
db_database = db_config["database"]
|
|
10
|
+
db_socket = db_config["socket"]
|
|
11
|
+
tables = ['mail_templates', 'mail_schedules', "mail_template_files", "template_partials"]
|
|
12
|
+
backup_file_path = File.join(Rails.root,"tmp", "mail_engine_backup", "#{db_database}_#{datetime}.sql")
|
|
13
|
+
|
|
14
|
+
system "mkdir -p #{File.join(Rails.root,"tmp", "mail_engine_backup")}"
|
|
15
|
+
system "mysqldump -u #{db_username} -S #{db_socket} -p'#{db_password}' #{db_database} #{tables.join(' ')}> #{backup_file_path}"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -2,7 +2,7 @@ namespace :mail_engine do
|
|
|
2
2
|
desc "Check mail schedule table and send the scheduled mail."
|
|
3
3
|
task :sendmail => :environment do
|
|
4
4
|
puts "==== Start sending scheduled mail ===="
|
|
5
|
-
MailEngine::MailSchedule.
|
|
5
|
+
MailEngine::MailSchedule.available.each { |schedule| schedule.sendmail }
|
|
6
6
|
puts "==== End sending scheduled mail ===="
|
|
7
7
|
end
|
|
8
8
|
end
|
data/mail_engine.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = %q{mail_engine}
|
|
8
|
-
s.version = "0.1.
|
|
8
|
+
s.version = "0.1.4"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["michael he"]
|
|
12
|
-
s.date = %q{2011-03-
|
|
12
|
+
s.date = %q{2011-03-09}
|
|
13
13
|
s.description = %q{Rails system mail management solution.}
|
|
14
14
|
s.email = %q{hlxwell@gmail.com}
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -209,6 +209,7 @@ Gem::Specification.new do |s|
|
|
|
209
209
|
"lib/mail_engine/sendgrid/base.rb",
|
|
210
210
|
"lib/mail_engine/sendgrid/rest_api.rb",
|
|
211
211
|
"lib/mail_engine/sendgrid/smtp_api.rb",
|
|
212
|
+
"lib/mail_engine/tasks/export_mail_engine_database.rake",
|
|
212
213
|
"lib/mail_engine/tasks/sendmail.rake",
|
|
213
214
|
"lib/mail_engine/version.rb",
|
|
214
215
|
"lib/mail_engine/zip_processor.rb",
|
|
@@ -219,8 +220,12 @@ Gem::Specification.new do |s|
|
|
|
219
220
|
"public/images/mail_engine/icons/delete.png",
|
|
220
221
|
"public/images/mail_engine/icons/edit.gif",
|
|
221
222
|
"public/images/mail_engine/icons/missing.png",
|
|
223
|
+
"public/images/mail_engine/icons/pause.png",
|
|
224
|
+
"public/images/mail_engine/icons/play.png",
|
|
222
225
|
"public/images/mail_engine/icons/save.png",
|
|
223
226
|
"public/images/mail_engine/icons/show.png",
|
|
227
|
+
"public/images/mail_engine/icons/start.png",
|
|
228
|
+
"public/images/mail_engine/icons/stop.png",
|
|
224
229
|
"public/images/mail_engine/logo.gif",
|
|
225
230
|
"public/images/mail_engine/logo.png",
|
|
226
231
|
"public/images/mail_engine/none_layout.png",
|
|
@@ -362,7 +367,7 @@ Gem::Specification.new do |s|
|
|
|
362
367
|
"test/dummy/app/mailers/user_mailer.rb",
|
|
363
368
|
"test/dummy/app/models/user.rb",
|
|
364
369
|
"test/dummy/app/views/user_mailer/notify.html.erb",
|
|
365
|
-
"test/dummy/app/views/user_mailer/notify.text.
|
|
370
|
+
"test/dummy/app/views/user_mailer/notify.text.liquid",
|
|
366
371
|
"test/dummy/config.ru",
|
|
367
372
|
"test/dummy/config/application.rb",
|
|
368
373
|
"test/dummy/config/boot.rb",
|
|
@@ -396,8 +401,11 @@ Gem::Specification.new do |s|
|
|
|
396
401
|
"test/dummy/public/images/mail_engine/icons/delete.png",
|
|
397
402
|
"test/dummy/public/images/mail_engine/icons/edit.gif",
|
|
398
403
|
"test/dummy/public/images/mail_engine/icons/missing.png",
|
|
404
|
+
"test/dummy/public/images/mail_engine/icons/pause.png",
|
|
399
405
|
"test/dummy/public/images/mail_engine/icons/save.png",
|
|
400
406
|
"test/dummy/public/images/mail_engine/icons/show.png",
|
|
407
|
+
"test/dummy/public/images/mail_engine/icons/start.png",
|
|
408
|
+
"test/dummy/public/images/mail_engine/icons/stop.png",
|
|
401
409
|
"test/dummy/public/images/mail_engine/logo.gif",
|
|
402
410
|
"test/dummy/public/images/mail_engine/logo.png",
|
|
403
411
|
"test/dummy/public/images/mail_engine/none_layout.png",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
data/test/dummy/db/schema.rb
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class UserMailerTest < ActionController::TestCase
|
|
4
|
-
context "
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
context "UserMailer" do
|
|
5
|
+
should "has sendgrid header" do
|
|
6
|
+
assert UserMailer.sendgrid_config.to_hash["X-SMTPAPI"].present?
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
should "
|
|
10
|
-
|
|
9
|
+
should "only send mail to the receiver" do
|
|
10
|
+
UserMailer.notify("x@x.com").deliver
|
|
11
|
+
assert UserMailer.sendgrid_config.to_hash["X-SMTPAPI"].include?("[\"x@x.com\"]")
|
|
12
|
+
|
|
13
|
+
UserMailer.notify("y@y.com").deliver
|
|
14
|
+
assert UserMailer.sendgrid_config.to_hash["X-SMTPAPI"].include?("[\"y@y.com\"]")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
should "override subject by db tempate.subject" do
|
|
18
|
+
@template = FactoryGirl.build(:system_mail_template_with_footer, :format => "html")
|
|
19
|
+
assert_equal "subject in mailer", UserMailer.notify("x@x.com").subject
|
|
20
|
+
@template.save
|
|
21
|
+
assert_equal @template.subject, UserMailer.notify("x@x.com").subject
|
|
11
22
|
end
|
|
12
23
|
end
|
|
13
|
-
|
|
14
24
|
end
|
|
@@ -33,9 +33,39 @@ class MailEngine::MailScheduleTest < ActiveSupport::TestCase
|
|
|
33
33
|
@schedule.send_test_mail_to!("hlxwell@gmail.com", 0)
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
|
|
37
|
+
context "when get next_several_schedules" do
|
|
38
|
+
setup do
|
|
39
|
+
@schedule.first_send_at = 2.days.ago
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
should "get correct list for once schedule" do
|
|
43
|
+
@schedule.sent_count = 1
|
|
44
|
+
assert_equal [], @schedule.next_several_schedule_dates
|
|
45
|
+
|
|
46
|
+
@schedule.sent_count = 0
|
|
47
|
+
assert_equal [], @schedule.next_several_schedule_dates
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
should "get correct list for daily schedule" do
|
|
51
|
+
@schedule.period = "daily"
|
|
52
|
+
assert_equal Time.now.tomorrow.day, @schedule.next_several_schedule_dates.first.day
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
should "get correct list for weekly schedule" do
|
|
56
|
+
@schedule.period = "weekly"
|
|
57
|
+
assert_equal (@schedule.first_send_at + 1.week).day, @schedule.next_several_schedule_dates.first.day
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
should "get correct list for monthly schedule" do
|
|
61
|
+
@schedule.period = "monthly"
|
|
62
|
+
assert_equal (@schedule.first_send_at + 1.month).day, @schedule.next_several_schedule_dates.first.day
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
should "get correct list for yearly schedule" do
|
|
66
|
+
@schedule.period = "yearly"
|
|
67
|
+
assert_equal (@schedule.first_send_at + 1.year).day, @schedule.next_several_schedule_dates.first.day
|
|
68
|
+
end
|
|
39
69
|
end
|
|
40
70
|
end
|
|
41
71
|
|
|
@@ -71,6 +101,7 @@ class MailEngine::MailScheduleTest < ActiveSupport::TestCase
|
|
|
71
101
|
assert @schedule.ready_to_send?
|
|
72
102
|
@schedule.sendmail
|
|
73
103
|
assert !@schedule.ready_to_send?
|
|
104
|
+
Timecop.return
|
|
74
105
|
end
|
|
75
106
|
end
|
|
76
107
|
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mail_engine
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 19
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
8
|
- 1
|
|
9
|
-
-
|
|
10
|
-
version: 0.1.
|
|
9
|
+
- 4
|
|
10
|
+
version: 0.1.4
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- michael he
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2011-03-
|
|
18
|
+
date: 2011-03-09 00:00:00 +08:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|
|
@@ -446,6 +446,7 @@ files:
|
|
|
446
446
|
- lib/mail_engine/sendgrid/base.rb
|
|
447
447
|
- lib/mail_engine/sendgrid/rest_api.rb
|
|
448
448
|
- lib/mail_engine/sendgrid/smtp_api.rb
|
|
449
|
+
- lib/mail_engine/tasks/export_mail_engine_database.rake
|
|
449
450
|
- lib/mail_engine/tasks/sendmail.rake
|
|
450
451
|
- lib/mail_engine/version.rb
|
|
451
452
|
- lib/mail_engine/zip_processor.rb
|
|
@@ -456,8 +457,12 @@ files:
|
|
|
456
457
|
- public/images/mail_engine/icons/delete.png
|
|
457
458
|
- public/images/mail_engine/icons/edit.gif
|
|
458
459
|
- public/images/mail_engine/icons/missing.png
|
|
460
|
+
- public/images/mail_engine/icons/pause.png
|
|
461
|
+
- public/images/mail_engine/icons/play.png
|
|
459
462
|
- public/images/mail_engine/icons/save.png
|
|
460
463
|
- public/images/mail_engine/icons/show.png
|
|
464
|
+
- public/images/mail_engine/icons/start.png
|
|
465
|
+
- public/images/mail_engine/icons/stop.png
|
|
461
466
|
- public/images/mail_engine/logo.gif
|
|
462
467
|
- public/images/mail_engine/logo.png
|
|
463
468
|
- public/images/mail_engine/none_layout.png
|
|
@@ -599,7 +604,7 @@ files:
|
|
|
599
604
|
- test/dummy/app/mailers/user_mailer.rb
|
|
600
605
|
- test/dummy/app/models/user.rb
|
|
601
606
|
- test/dummy/app/views/user_mailer/notify.html.erb
|
|
602
|
-
- test/dummy/app/views/user_mailer/notify.text.
|
|
607
|
+
- test/dummy/app/views/user_mailer/notify.text.liquid
|
|
603
608
|
- test/dummy/config.ru
|
|
604
609
|
- test/dummy/config/application.rb
|
|
605
610
|
- test/dummy/config/boot.rb
|
|
@@ -633,8 +638,11 @@ files:
|
|
|
633
638
|
- test/dummy/public/images/mail_engine/icons/delete.png
|
|
634
639
|
- test/dummy/public/images/mail_engine/icons/edit.gif
|
|
635
640
|
- test/dummy/public/images/mail_engine/icons/missing.png
|
|
641
|
+
- test/dummy/public/images/mail_engine/icons/pause.png
|
|
636
642
|
- test/dummy/public/images/mail_engine/icons/save.png
|
|
637
643
|
- test/dummy/public/images/mail_engine/icons/show.png
|
|
644
|
+
- test/dummy/public/images/mail_engine/icons/start.png
|
|
645
|
+
- test/dummy/public/images/mail_engine/icons/stop.png
|
|
638
646
|
- test/dummy/public/images/mail_engine/logo.gif
|
|
639
647
|
- test/dummy/public/images/mail_engine/logo.png
|
|
640
648
|
- test/dummy/public/images/mail_engine/none_layout.png
|