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 @@
@@ -154,7 +154,7 @@
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.
*/