diff --git a/src/js/client.js b/src/js/client.js index 8fb9cb667..d63ef52d8 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -2717,6 +2717,38 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout }); }; + Client.prototype.listMailQueue = function (search, page, perPage, callback) { + var config = { + params: { + search: search, + page: page, + per_page: perPage + } + }; + + get('/api/v1/mailserver/tempfail_queue', config, function (error, data, status) { + if (error) return callback(error); + if (status !== 200) return callback(new ClientError(status, data)); + callback(null, data.usage); + }); + }; + + Client.prototype.delMailQueueItem = function (file, callback) { + del('/api/v1/mailserver/tempfail_queue/' + file, {}, config, function (error, data, status) { + if (error) return callback(error); + if (status !== 200) return callback(new ClientError(status, data)); + callback(null, data.usage); + }); + }; + + Client.prototype.resendMailQueueItem = function (file, callback) { + post('/api/v1/mailserver/tempfail_queue/' + file + '/resend', {}, config, function (error, data, status) { + if (error) return callback(error); + if (status !== 201) return callback(new ClientError(status, data)); + callback(null, data.usage); + }); + }; + Client.prototype.getMailConfigForDomain = function (domain, callback) { get('/api/v1/mail/' + domain, null, function (error, data, status) { if (error) return callback(error); diff --git a/src/js/index.js b/src/js/index.js index 6825f7fd7..c9c45276b 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -83,6 +83,9 @@ app.config(['$routeProvider', function ($routeProvider) { }).when('/emails-eventlog', { controller: 'EmailsEventlogController', templateUrl: 'views/emails-eventlog.html?<%= revision %>' + }).when('/emails-queue', { + controller: 'EmailsQueueController', + templateUrl: 'views/emails-queue.html?<%= revision %>' }).when('/email/:domain/:view?', { controller: 'EmailController', templateUrl: 'views/email.html?<%= revision %>' diff --git a/src/views/emails-eventlog.html b/src/views/emails-eventlog.html index 752848d63..af3f777d8 100644 --- a/src/views/emails-eventlog.html +++ b/src/views/emails-eventlog.html @@ -8,6 +8,7 @@ {{ 'emails.eventlog.title' | tr }} {{ 'main.action.logs' | tr }} + {{ 'emails.action.queue' | tr }} diff --git a/src/views/emails-queue.html b/src/views/emails-queue.html new file mode 100644 index 000000000..b5156906f --- /dev/null +++ b/src/views/emails-queue.html @@ -0,0 +1,98 @@ +
+ {{ 'email.backAction' | tr }} + +
+ +
+

+ {{ 'emails.queue.title' | tr }} + + {{ 'main.action.logs' | tr }} +

+
+
+ +
+
+
+ + +
+ +
+
+ +
+
+
+
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ 'emails.eventlog.time' | tr }}{{ 'emails.eventlog.mailFrom' | tr }}{{ 'emails.eventlog.rcptTo' | tr }}{{ 'emails.eventlog.details' | tr }}
+
+
+ {{ 'emails.eventlog.empty' | tr }} +
+
+
+ + + + + + + + + + {{ eventlog.ts | prettyDate }}{{ (eventlog.mailFrom | prettyEmailAddresses) || '-' }}{{ (eventlog.rcptTo | prettyEmailAddresses) || eventlog.mailbox || '-' }} + {{ 'emails.eventlog.type.bounceInfo' | tr }}. {{ eventlog.message || eventlog.reason }} + {{ 'emails.eventlog.type.deferredInfo' | tr: { delay:eventlog.delay } }}. {{ eventlog.message || eventlog.reason }} + + {{ 'emails.eventlog.type.inboundInfo' | tr }} + {{ 'emails.eventlog.type.outboundInfo' | tr }} + + {{ 'emails.eventlog.type.receivedInfo' | tr }} + {{ 'emails.eventlog.type.deliveredInfo' | tr }} + {{ 'emails.eventlog.type.deniedInfo' | tr }}. {{ eventlog.message || eventlog.reason }} + {{ 'emails.eventlog.type.spamFilterTrainedInfo' | tr }} + + {{ 'emails.eventlog.type.overQuotaInfo' | tr: { mailbox: eventlog.mailbox, quotaPercent: eventlog.quotaPercent } }} + {{ 'emails.eventlog.type.underQuotaInfo' | tr: { mailbox: eventlog.mailbox, quotaPercent: -eventlog.quotaPercent } }} + +
+
{{ item | json }}
+
+
+
+
+
diff --git a/src/views/emails-queue.js b/src/views/emails-queue.js new file mode 100644 index 000000000..d3520f330 --- /dev/null +++ b/src/views/emails-queue.js @@ -0,0 +1,69 @@ +'use strict'; + +/* global $ */ +/* global angular */ + +angular.module('Application').controller('EmailsQueueController', ['$scope', '$location', '$translate', '$timeout', 'Client', function ($scope, $location, $translate, $timeout, Client) { + Client.onReady(function () { if (!Client.getUserInfo().isAtLeastOwner) $location.path('/'); }); + + $scope.ready = false; + $scope.config = Client.getConfig(); + $scope.user = Client.getUserInfo(); + + $scope.pageItemCount = [ + { name: $translate.instant('main.pagination.perPageSelector', { n: 20 }), value: 20 }, + { name: $translate.instant('main.pagination.perPageSelector', { n: 50 }), value: 50 }, + { name: $translate.instant('main.pagination.perPageSelector', { n: 100 }), value: 100 } + ]; + + $scope.queue = { + busy: true, + items: [], + activeItem: null, + currentPage: 1, + perPage: 20, + pageItems: $scope.pageItemCount[0], + search: '', + + refresh: function () { + $scope.queue.busy = true; + + Client.listMailQueue($scope.queue.search, $scope.queue.currentPage, $scope.queue.pageItems.value, function (error, result) { + if (error) return console.error('Failed to fetch mail eventlogs.', error); + + $scope.queue.busy = false; + + $scope.queue.items = result; + }); + }, + + showNextPage: function () { + $scope.queue.currentPage++; + $scope.queue.refresh(); + }, + + showPrevPage: function () { + if ($scope.queue.currentPage > 1) $scope.queue.currentPage--; + else $scope.queue.currentPage = 1; + $scope.queue.refresh(); + }, + + showItemDetails: function (item) { + if ($scope.queue.activeItem === item) $scope.queue.activeItem = null; + else $scope.queue.activeItem = item; + }, + + updateFilter: function (fresh) { + if (fresh) $scope.queue.currentPage = 1; + $scope.queue.refresh(); + } + }; + + Client.onReady(function () { + $scope.ready = true; + + $scope.queue.refresh(); + }); + + $('.modal-backdrop').remove(); +}]); diff --git a/src/views/emails.html b/src/views/emails.html index 3cb860a37..2cccde43a 100644 --- a/src/views/emails.html +++ b/src/views/emails.html @@ -213,8 +213,9 @@

{{ 'emails.title' | tr }} -
- {{ 'main.action.logs' | tr }} +