diff --git a/NEWS b/NEWS index c68be4a39..d2d3e27ab 100644 --- a/NEWS +++ b/NEWS @@ -51,6 +51,7 @@ Bug fixes - [web] fixed messages archiving as zip file - [web] adapted time picker to match changes of md calendar picker - [web] fixed sender addresses of draft when using multiple IMAP accounts (#3577) + - [web] create a new message when clicking on a "mailto" link (#3588) - [dav] we now handle the default classifications for tasks (#3541) - [eas] properly unfold long mail headers (#3152) - [eas] correctly set EAS message class for S/MIME messages (#3576) diff --git a/UI/Templates/MailerUI/UIxMailViewTemplate.wox b/UI/Templates/MailerUI/UIxMailViewTemplate.wox index aae77d487..b459f45ec 100644 --- a/UI/Templates/MailerUI/UIxMailViewTemplate.wox +++ b/UI/Templates/MailerUI/UIxMailViewTemplate.wox @@ -127,7 +127,7 @@ {{ viewer.message.from[0].name }}
+ ng-click="viewer.newMessage($event, { to: [viewer.message.from[0].full] })"> @@ -143,7 +143,7 @@
+ ng-click="viewer.newMessage($event, { to: [recipient.full] })">
@@ -154,7 +154,7 @@
+ ng-click="viewer.newMessage($event, { to: [recipient.full] })"> -
-
+
+
diff --git a/UI/WebServerResources/js/Mailer/MessageController.js b/UI/WebServerResources/js/Mailer/MessageController.js index a62741c6a..877853400 100644 --- a/UI/WebServerResources/js/Mailer/MessageController.js +++ b/UI/WebServerResources/js/Mailer/MessageController.js @@ -23,6 +23,7 @@ vm.showFlags = stateMessage.flags && stateMessage.flags.length > 0; vm.$showDetailedRecipients = false; vm.toggleDetailedRecipients = toggleDetailedRecipients; + vm.filterMailtoLinks = filterMailtoLinks; vm.doDelete = doDelete; vm.close = close; vm.reply = reply; @@ -120,6 +121,37 @@ $event.preventDefault(); } + function filterMailtoLinks($event) { + var href, match, to, cc, bcc, subject, body, data; + if ($event.target.tagName == 'A' && 'href' in $event.target.attributes) { + href = $event.target.attributes.href.value; + match = /^mailto:([^\?]+)/.exec(href); + if (match) { + // Recipients + to = _.map(decodeURIComponent(match[1]).split(','), function(email) { + return '<' + email + '>'; + }); + data = { to: to }; + // Subject & body + _.forEach(['subject', 'body'], function(param) { + var re = new RegExp(param + '=([^&]+)'); + param = (param == 'body')? 'text' : param; + match = re.exec(href); + if (match) + data[param] = [decodeURIComponent(match[1])]; + }); + // Recipients + _.forEach(['cc', 'bcc'], function(param) { + var re = new RegExp(param + '=([^&]+)'); + match = re.exec(href); + if (match) + data[param] = [decodeURIComponent(match[1])]; + }); + newMessage($event, data); // will stop event propagation + } + } + } + function doDelete() { var mailbox, message, state, nextMessage, previousMessage, parentCtrls = $parentControllers(); @@ -177,11 +209,8 @@ }); } - function showMailEditor($event, message, recipients) { + function showMailEditor($event, message) { if (messageDialog === null) { - if (!angular.isDefined(recipients)) - recipients = []; - messageDialog = $mdDialog .show({ parent: angular.element(document.body), @@ -194,8 +223,7 @@ locals: { stateAccounts: vm.accounts, stateAccount: vm.account, - stateMessage: message, - stateRecipients: recipients + stateMessage: message } }) .finally(function() { @@ -261,9 +289,11 @@ $window.close(); } - function newMessage($event, recipient) { - var message = vm.account.$newMessage(); - showMailEditor($event, message, [recipient]); + function newMessage($event, editableContent) { + vm.account.$newMessage().then(function(message) { + angular.extend(message.editable, editableContent); + showMailEditor($event, message); + }); $event.stopPropagation(); $event.preventDefault(); } diff --git a/UI/WebServerResources/js/Mailer/MessageEditorController.js b/UI/WebServerResources/js/Mailer/MessageEditorController.js index 86e27e6aa..71021aefb 100644 --- a/UI/WebServerResources/js/Mailer/MessageEditorController.js +++ b/UI/WebServerResources/js/Mailer/MessageEditorController.js @@ -6,8 +6,8 @@ /** * @ngInject */ - MessageEditorController.$inject = ['$window', '$stateParams', '$mdConstant', '$mdDialog', '$mdToast', 'FileUploader', 'stateAccount', 'stateMessage', 'stateRecipients', 'encodeUriFilter', '$timeout', 'Dialog', 'AddressBook', 'Card', 'Preferences']; - function MessageEditorController($window, $stateParams, $mdConstant, $mdDialog, $mdToast, FileUploader, stateAccount, stateMessage, stateRecipients, encodeUriFilter, $timeout, Dialog, AddressBook, Card, Preferences) { + MessageEditorController.$inject = ['$window', '$stateParams', '$mdConstant', '$mdDialog', '$mdToast', 'FileUploader', 'stateAccount', 'stateMessage', 'encodeUriFilter', '$timeout', 'Dialog', 'AddressBook', 'Card', 'Preferences']; + function MessageEditorController($window, $stateParams, $mdConstant, $mdDialog, $mdToast, FileUploader, stateAccount, stateMessage, encodeUriFilter, $timeout, Dialog, AddressBook, Card, Preferences) { var vm = this, semicolon = 186; vm.addRecipient = addRecipient; @@ -79,10 +79,6 @@ addAttachments(); } - if (angular.isDefined(stateRecipients)) { - vm.message.editable.to = _.union(vm.message.editable.to, _.map(stateRecipients, 'full')); - } - /** * If this is a popup window, retrieve the mailbox controller of the parent window. */