diff --git a/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6 index bc9cd2edd8..3d57d2a6c3 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6 @@ -2,6 +2,7 @@ import ModalFunctionality from 'discourse/mixins/modal-functionality'; import IncomingEmail from 'admin/models/incoming-email'; import computed from 'ember-addons/ember-computed-decorators'; import { longDate } from 'discourse/lib/formatter'; +import { popupAjaxError } from 'discourse/lib/ajax-error'; export default Ember.Controller.extend(ModalFunctionality, { @@ -12,6 +13,15 @@ export default Ember.Controller.extend(ModalFunctionality, { load(id) { return IncomingEmail.find(id).then(result => this.set("model", result)); + }, + + loadFromBounced(id) { + return IncomingEmail.findByBounced(id) + .then(result => this.set("model", result)) + .catch(error => { + this.send("closeModal"); + popupAjaxError(error); + }); } }); diff --git a/app/assets/javascripts/admin/models/incoming-email.js.es6 b/app/assets/javascripts/admin/models/incoming-email.js.es6 index d0386b2bc4..470c3fa56f 100644 --- a/app/assets/javascripts/admin/models/incoming-email.js.es6 +++ b/app/assets/javascripts/admin/models/incoming-email.js.es6 @@ -19,6 +19,11 @@ IncomingEmail.reopenClass({ return ajax(`/admin/email/incoming/${id}.json`); }, + findByBounced(id) { + return ajax(`/admin/email/incoming_from_bounced/${id}.json`); + }, + + findAll(filter, offset) { filter = filter || {}; offset = offset || 0; diff --git a/app/assets/javascripts/admin/routes/admin-email-bounced.js.es6 b/app/assets/javascripts/admin/routes/admin-email-bounced.js.es6 index 027a6c0f30..40dbc5a75f 100644 --- a/app/assets/javascripts/admin/routes/admin-email-bounced.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-email-bounced.js.es6 @@ -1,2 +1,14 @@ +import showModal from 'discourse/lib/show-modal'; import AdminEmailLogs from 'admin/routes/admin-email-logs'; -export default AdminEmailLogs.extend({ status: "bounced" }); + +export default AdminEmailLogs.extend({ + status: "bounced", + + actions: { + showIncomingEmail(id) { + showModal('admin-incoming-email', { admin: true }); + this.controllerFor("modals/admin-incoming-email").loadFromBounced(id); + } + } + +}); diff --git a/app/assets/javascripts/admin/templates/email-bounced.hbs b/app/assets/javascripts/admin/templates/email-bounced.hbs index e2df9e04bf..9ebbb7d316 100644 --- a/app/assets/javascripts/admin/templates/email-bounced.hbs +++ b/app/assets/javascripts/admin/templates/email-bounced.hbs @@ -28,7 +28,7 @@ {{/if}} {{l.to_address}} - {{l.email_type}} + {{l.email_type}} {{else}} {{i18n 'admin.email.logs.none'}} diff --git a/app/controllers/admin/email_controller.rb b/app/controllers/admin/email_controller.rb index 2d7798e6c2..077937e021 100644 --- a/app/controllers/admin/email_controller.rb +++ b/app/controllers/admin/email_controller.rb @@ -88,6 +88,26 @@ class Admin::EmailController < Admin::AdminController render_json_dump(serializer) end + def incoming_from_bounced + params.require(:id) + + begin + bounced = EmailLog.find_by(id: params[:id].to_i) + raise Discourse::InvalidParameters if bounced.nil? + + email_local_part, email_domain = SiteSetting.notification_email.split('@') + bounced_to_address = "#{email_local_part}+verp-#{bounced.bounce_key}@#{email_domain}" + + incoming_email = IncomingEmail.find_by(to_addresses: bounced_to_address) + raise Discourse::NotFound if incoming_email.nil? + + serializer = IncomingEmailDetailsSerializer.new(incoming_email, root: false) + render_json_dump(serializer) + rescue => e + render json: {errors: [e.message]}, status: 404 + end + end + private def filter_email_logs(email_logs, params) diff --git a/config/routes.rb b/config/routes.rb index 2a1378e4cc..fc53ffb18f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -150,6 +150,7 @@ Discourse::Application.routes.draw do get "rejected" get "/incoming/:id/raw" => "email#raw_email" get "/incoming/:id" => "email#incoming" + get "/incoming_from_bounced/:id" => "email#incoming_from_bounced" get "preview-digest" => "email#preview_digest" get "send-digest" => "email#send_digest" post "handle_mail"