diff --git a/public/src/admin/manage/users.js b/public/src/admin/manage/users.js index 54eead3572..d4d5f50404 100644 --- a/public/src/admin/manage/users.js +++ b/public/src/admin/manage/users.js @@ -124,6 +124,20 @@ define('admin/manage/users', ['admin/modules/selectable'], function(selectable) return false; }); + $('.password-reset-email').on('click', function() { + var uids = getSelectedUids(); + if (!uids.length) { + return; + } + + bootbox.confirm('Do you want to send password reset email(s) to these user(s)?', function(confirm) { + if (confirm) { + socket.emit('admin.user.sendPasswordResetEmail', uids, done('Emails sent')); + } + }); + return false; + }); + $('.delete-user').on('click', function() { var uids = getSelectedUids(); if (!uids.length) { diff --git a/src/emailer.js b/src/emailer.js index d77cc9556a..d3b7d1f9aa 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -36,21 +36,25 @@ Emailer.send = function(template, uid, params) { next(undefined, translated); }); }, function(err, translated) { - if(err) { + if (err) { return winston.error(err.message); } else if (!results.email) { return winston.warn('uid : ' + uid + ' has no email, not sending.'); } - Plugins.fireHook('action:email.send', { - to: results.email, - from: meta.config['email:from'] || 'no-reply@localhost.lan', - subject: translated[2], - html: translated[0], - plaintext: translated[1], - template: template, - uid: uid - }); + if (Plugins.hasListeners('action:email.send')) { + Plugins.fireHook('action:email.send', { + to: results.email, + from: meta.config['email:from'] || 'no-reply@localhost.lan', + subject: translated[2], + html: translated[0], + plaintext: translated[1], + template: template, + uid: uid + }); + } else { + winston.warn('[emailer] No active email plugin found!'); + } }); }); }; diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js index 0647b1397b..a8ebe9659e 100644 --- a/src/socket.io/admin/user.js +++ b/src/socket.io/admin/user.js @@ -118,6 +118,28 @@ User.validateEmail = function(socket, uids, callback) { }, callback); }; +User.sendPasswordResetEmail = function(socket, uids, callback) { + if (!Array.isArray(uids)) { + return callback(new Error('[[error:invalid-data]]')); + } + + uids = uids.filter(function(uid) { + return parseInt(uid, 10); + }); + + async.each(uids, function(uid, next) { + user.getUserFields(uid, ['email', 'username'], function(err, userData) { + if (err) { + return next(err); + } + if (!userData.email) { + return next(new Error('[[error:user-doesnt-have-email, ' + userData.username + ']]')); + } + user.reset.send(userData.email, next); + }); + }, callback); +}; + User.deleteUsers = function(socket, uids, callback) { if(!Array.isArray(uids)) { return callback(new Error('[[error:invalid-data]]')); diff --git a/src/views/admin/manage/users.tpl b/src/views/admin/manage/users.tpl index 056ae48ad7..9f8ab3f322 100644 --- a/src/views/admin/manage/users.tpl +++ b/src/views/admin/manage/users.tpl @@ -18,6 +18,7 @@