FEATURE: send digest preview to an email address

This commit is contained in:
Neil Lalonde 2016-11-23 17:46:57 -05:00
parent b8c88dbfe0
commit 47aa3d94aa
6 changed files with 77 additions and 0 deletions

View File

@ -1,7 +1,12 @@
import EmailPreview from 'admin/models/email-preview';
import { popupAjaxError } from 'discourse/lib/ajax-error';
export default Ember.Controller.extend({
emailEmpty: Em.computed.empty('email'),
sendEmailDisabled: Em.computed.or('emailEmpty', 'sendingEmail'),
showSendEmailForm: Em.computed.notEmpty('model.html_content'),
actions: {
refresh() {
const model = this.get('model');
@ -15,6 +20,23 @@ export default Ember.Controller.extend({
toggleShowHtml() {
this.toggleProperty('showHtml');
},
sendEmail() {
this.set('sendingEmail', true);
this.set('sentEmail', false);
const self = this;
EmailPreview.sendDigest(this.get('lastSeen'), this.get('username'), this.get('email')).then(result => {
if (result.errors) {
bootbox.alert(result.errors);
} else {
self.set('sentEmail', true);
}
}).catch(popupAjaxError).finally(function() {
self.set('sendingEmail', false);
});
}
}

View File

@ -17,6 +17,20 @@ EmailPreview.reopenClass({
}).then(function (result) {
return EmailPreview.create(result);
});
},
sendDigest: function(lastSeenAt, username, email) {
if (Em.isEmpty(lastSeenAt)) {
lastSeenAt = moment().subtract(7, 'days').format('YYYY-MM-DD');
}
if (Em.isEmpty(username)) {
username = Discourse.User.current().username;
}
return ajax("/admin/email/send-digest.json", {
data: { last_seen_at: lastSeenAt, username: username, email: email }
});
}
});

View File

@ -19,6 +19,24 @@
</div>
{{#conditional-loading-spinner condition=loading}}
{{#if showSendEmailForm}}
<br/>
<div>
{{#if sendingEmail}}
{{i18n 'admin.email.sending_test'}}
{{else}}
<label style="display: inline;">{{i18n 'admin.email.send_digest_label'}}</label>
{{text-field value=email placeholderKey="admin.email.test_email_address"}}
<button class='btn' {{action "sendEmail"}} disabled={{sendEmailDisabled}}>{{i18n 'admin.email.send_digest'}}</button>
{{#if sentEmail}}
<span class='result-message'>{{i18n 'admin.email.sent_test'}}</span>
{{/if}}
{{/if}}
</div>
<br/>
{{/if}}
{{#if showHtml}}
{{{model.html_content}}}
{{else}}

View File

@ -50,6 +50,25 @@ class Admin::EmailController < Admin::AdminController
render json: MultiJson.dump(html_content: renderer.html, text_content: renderer.text)
end
def send_digest
params.require(:last_seen_at)
params.require(:username)
params.require(:email)
user = User.find_by_username(params[:username])
message, skip_reason = UserNotifications.send(:digest, user, {since: params[:last_seen_at]})
if message
message.to = params[:email]
begin
Email::Sender.new(message, :digest).send
render nothing: true
rescue => e
render json: {errors: [e.message]}, status: 422
end
else
render json: {errors: skip_reason}
end
end
def handle_mail
params.require(:email)
Email::Processor.process!(params[:email])

View File

@ -2762,6 +2762,9 @@ en:
delivery_method: "Delivery Method"
preview_digest_desc: "Preview the content of the digest emails sent to inactive users."
refresh: "Refresh"
send_digest_label: "Send this result to:"
send_digest: "Send"
sending_email: "Sending email..."
format: "Format"
html: "html"
text: "text"

View File

@ -151,6 +151,7 @@ Discourse::Application.routes.draw do
get "/incoming/:id/raw" => "email#raw_email"
get "/incoming/:id" => "email#incoming"
get "preview-digest" => "email#preview_digest"
get "send-digest" => "email#send_digest"
post "handle_mail"
end
end