diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index 7f239269262f218b91e641b2f3e4438bf24a5648..ee939f587ba2dd5e52afcc78fc52f899a6c964b7 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -335,7 +335,7 @@ class UsersController extends AUserData {
 			}
 
 			// Send new user mail only if a mail is set
-			if ($email !== '') {
+			if ($email !== '' && $this->config->getAppValue('core', 'newUser.sendEmail', 'yes') === 'yes') {
 				$newUser->setEMailAddress($email);
 				try {
 					$emailTemplate = $this->newUserMailHelper->generateTemplate($newUser, $generatePasswordResetToken);
diff --git a/apps/settings/appinfo/routes.php b/apps/settings/appinfo/routes.php
index 45f0cc25718d0b2a54c05a5a95fd746860cccf80..89b6c86993c2a1e47afb1b307103e67d172287d2 100644
--- a/apps/settings/appinfo/routes.php
+++ b/apps/settings/appinfo/routes.php
@@ -70,6 +70,7 @@ $application->registerRoutes($this, [
 		['name' => 'Users#getVerificationCode', 'url' => '/settings/users/{account}/verify', 'verb' => 'GET'],
 		['name' => 'Users#usersList', 'url' => '/settings/users', 'verb' => 'GET'],
 		['name' => 'Users#usersListByGroup', 'url' => '/settings/users/{group}', 'verb' => 'GET', 'requirements' => ['group' => '.+']],
+		['name' => 'Users#setPreference', 'url' => '/settings/users/preferences/{key}', 'verb' => 'POST'],
 		['name' => 'LogSettings#setLogLevel', 'url' => '/settings/admin/log/level', 'verb' => 'POST'],
 		['name' => 'LogSettings#getEntries', 'url' => '/settings/admin/log/entries', 'verb' => 'GET'],
 		['name' => 'LogSettings#download', 'url' => '/settings/admin/log/download', 'verb' => 'GET'],
diff --git a/apps/settings/js/vue-0.js b/apps/settings/js/vue-0.js
index 6c6d69b577c9fba6e9dfff47771ba954b2ec385a..8b9bebc4c5e089d5cd52cc78e7894b4363ba8ced 100644
Binary files a/apps/settings/js/vue-0.js and b/apps/settings/js/vue-0.js differ
diff --git a/apps/settings/js/vue-0.js.map b/apps/settings/js/vue-0.js.map
index ad3d1b282324842744b7a825020d289a17521cca..26f2c76258abf201466d97cbaaba9c7cb7b20fe4 100644
Binary files a/apps/settings/js/vue-0.js.map and b/apps/settings/js/vue-0.js.map differ
diff --git a/apps/settings/js/vue-5.js b/apps/settings/js/vue-5.js
index cd1bcb6bfcfb94cc13149f9d4c6ec3e76fb408a9..813f2ee09946e0bde65260fa840bdacd613cd436 100644
Binary files a/apps/settings/js/vue-5.js and b/apps/settings/js/vue-5.js differ
diff --git a/apps/settings/js/vue-5.js.map b/apps/settings/js/vue-5.js.map
index 898b8e2f0855bf24bbe0de78d6472f087a42b6bb..a880696a998b580f5330be69dc269ddcf8d26339 100644
Binary files a/apps/settings/js/vue-5.js.map and b/apps/settings/js/vue-5.js.map differ
diff --git a/apps/settings/js/vue-7.js b/apps/settings/js/vue-7.js
index 468a4e7a6d0aac263e3db88cbfd981f6a1f0fd00..6d7c55bcae96bd49ba2b8b174381260f8fa5c647 100644
Binary files a/apps/settings/js/vue-7.js and b/apps/settings/js/vue-7.js differ
diff --git a/apps/settings/js/vue-7.js.map b/apps/settings/js/vue-7.js.map
index 755b16acdfada866ad113be16b3fbf8957b5877b..709d9faf94647f742e209a2be513228aaba04d30 100644
Binary files a/apps/settings/js/vue-7.js.map and b/apps/settings/js/vue-7.js.map differ
diff --git a/apps/settings/js/vue-settings-admin-security.js b/apps/settings/js/vue-settings-admin-security.js
index d551a824607b4af5eb65a78d43215363b9d45fc4..65082ff9d77ea9b20399f64cb11663ea280b9bcc 100644
Binary files a/apps/settings/js/vue-settings-admin-security.js and b/apps/settings/js/vue-settings-admin-security.js differ
diff --git a/apps/settings/js/vue-settings-admin-security.js.map b/apps/settings/js/vue-settings-admin-security.js.map
index d675fd6284e16aabbf41c258fb3bb3d437e4e8bb..464b970a7a199420ac23682c3b965c2484e69c04 100644
Binary files a/apps/settings/js/vue-settings-admin-security.js.map and b/apps/settings/js/vue-settings-admin-security.js.map differ
diff --git a/apps/settings/js/vue-settings-apps-users-management.js b/apps/settings/js/vue-settings-apps-users-management.js
index 7c29df6f9b05d12c8c2acef39d629f6ed38b92f8..a3e723a88716f286f1e281f825af7aa6aa8c64e3 100644
Binary files a/apps/settings/js/vue-settings-apps-users-management.js and b/apps/settings/js/vue-settings-apps-users-management.js differ
diff --git a/apps/settings/js/vue-settings-apps-users-management.js.map b/apps/settings/js/vue-settings-apps-users-management.js.map
index a2eb9a54d3c8b256d2dc5e3ec9bce857abec081b..4e5a37f099012597ddda1fe8d46b2b0f413eca24 100644
Binary files a/apps/settings/js/vue-settings-apps-users-management.js.map and b/apps/settings/js/vue-settings-apps-users-management.js.map differ
diff --git a/apps/settings/js/vue-settings-personal-security.js b/apps/settings/js/vue-settings-personal-security.js
index 8984f8a1985e90bbb34a0135305823d8ba7f1d8c..b2d41e25611da7eb2f6693f39798d4de12c8a65e 100644
Binary files a/apps/settings/js/vue-settings-personal-security.js and b/apps/settings/js/vue-settings-personal-security.js differ
diff --git a/apps/settings/js/vue-settings-personal-security.js.map b/apps/settings/js/vue-settings-personal-security.js.map
index 3e20e96153215250160a0c4d98e1482aed22298a..13efe2fb6ff952f10474b3d25be13a36db0494df 100644
Binary files a/apps/settings/js/vue-settings-personal-security.js.map and b/apps/settings/js/vue-settings-personal-security.js.map differ
diff --git a/apps/settings/lib/Controller/UsersController.php b/apps/settings/lib/Controller/UsersController.php
index 2c20ce36caa63e314a1840e0e39ecf19adfbed10..cfbe35eb201c71ebffa43ddd9fb7d6933be46def 100644
--- a/apps/settings/lib/Controller/UsersController.php
+++ b/apps/settings/lib/Controller/UsersController.php
@@ -35,11 +35,13 @@ use OC\AppFramework\Http;
 use OC\Encryption\Exceptions\ModuleDoesNotExistsException;
 use OC\ForbiddenException;
 use OC\Security\IdentityProof\Manager;
+use OCA\Settings\AppInfo\Application;
 use OCA\Settings\BackgroundJobs\VerifyUserData;
 use OCA\User_LDAP\User_Proxy;
 use OCP\App\IAppManager;
 use OCP\AppFramework\Controller;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\Http\JSONResponse;
 use OCP\AppFramework\Http\TemplateResponse;
 use OCP\BackgroundJob\IJobList;
 use OCP\Encryption\IManager;
@@ -52,6 +54,7 @@ use OCP\IUserManager;
 use OCP\IUserSession;
 use OCP\L10N\IFactory;
 use OCP\Mail\IMailer;
+use function in_array;
 
 class UsersController extends Controller {
 	/** @var IUserManager */
@@ -238,10 +241,28 @@ class UsersController extends Controller {
 		$serverData['canChangePassword'] = $canChangePassword;
 		$serverData['newUserGenerateUserID'] = $this->config->getAppValue('core', 'newUser.generateUserID', 'no') === 'yes';
 		$serverData['newUserRequireEmail'] = $this->config->getAppValue('core', 'newUser.requireEmail', 'no') === 'yes';
+		$serverData['newUserSendEmail'] = $this->config->getAppValue('core', 'newUser.sendEmail', 'yes') === 'yes';
 
 		return new TemplateResponse('settings', 'settings-vue', ['serverData' => $serverData]);
 	}
 
+	/**
+	 * @param string $key
+	 * @param string $value
+	 *
+	 * @return JSONResponse
+	 */
+	public function setPreference(string $key, string $value): JSONResponse {
+		$allowed = ['newUser.sendEmail'];
+		if (!in_array($key, $allowed, true)) {
+			return new JSONResponse([], Http::STATUS_FORBIDDEN);
+		}
+
+		$this->config->setAppValue('core', $key, $value);
+
+		return new JSONResponse([]);
+	}
+
 	/**
 	 * Parse the app value for quota_present
 	 *
diff --git a/apps/settings/src/views/Users.vue b/apps/settings/src/views/Users.vue
index 01fb9a9b48ad3fbfaf88c7fec1b0b5e386339950..284317f2588041a9c2b477a96bdd5ba21f35284a 100644
--- a/apps/settings/src/views/Users.vue
+++ b/apps/settings/src/views/Users.vue
@@ -135,6 +135,14 @@
 						class="checkbox">
 					<label for="showStoragePath">{{ t('settings', 'Show storage path') }}</label>
 				</div>
+				<div>
+					<input id="sendWelcomeMail"
+						v-model="sendWelcomeMail"
+						:disabled="loadingSendMail"
+						type="checkbox"
+						class="checkbox">
+					<label for="sendWelcomeMail">{{ t('settings', 'Send email to new user') }}</label>
+				</div>
 			</AppNavigationSettings>
 		</AppNavigation>
 		<AppContent>
@@ -156,7 +164,9 @@ import AppNavigationCounter from '@nextcloud/vue/dist/Components/AppNavigationCo
 import AppNavigationItem from '@nextcloud/vue/dist/Components/AppNavigationItem'
 import AppNavigationNew from '@nextcloud/vue/dist/Components/AppNavigationNew'
 import AppNavigationSettings from '@nextcloud/vue/dist/Components/AppNavigationSettings'
+import axios from '@nextcloud/axios'
 import Content from '@nextcloud/vue/dist/Components/Content'
+import { generateUrl } from '@nextcloud/router'
 import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
 import Vue from 'vue'
 import VueLocalStorage from 'vue-localstorage'
@@ -194,6 +204,7 @@ export default {
 			selectedQuota: false,
 			externalActions: [],
 			loadingAddGroup: false,
+			loadingSendMail: false,
 			showConfig: {
 				showStoragePath: false,
 				showUserBackend: false,
@@ -276,6 +287,26 @@ export default {
 
 		},
 
+		sendWelcomeMail: {
+			get() {
+				return this.settings.newUserSendEmail
+			},
+			async set(value) {
+				try {
+					this.loadingSendMail = true
+					this.$store.commit('setServerData', {
+						...this.settings,
+						newUserSendEmail: value,
+					})
+					await axios.post(generateUrl(`/settings/users/preferences/newUser.sendEmail`), { value: value ? 'yes' : 'no' })
+				} catch (e) {
+					console.error('could not update newUser.sendEmail preference: ' + e.message, e)
+				} finally {
+					this.loadingSendMail = false
+				}
+			},
+		},
+
 		groupList() {
 			const groups = Array.isArray(this.groups) ? this.groups : []