From 39cd795e6e296996dbaab790518ae266d410cbea Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 2 Jun 2017 10:11:42 +0200
Subject: [PATCH] OO-2796: show more informations by e-mail errors

---
 .../den/DENManageParticipantsController.java  |   2 +-
 .../securitygroup/gui/GroupController.java    |   4 +-
 .../user/course/CourseOverviewController.java |   4 +-
 .../user/groups/GroupOverviewController.java  |   2 +-
 .../olat/basesecurity/ui/GroupController.java |   4 +-
 .../org/olat/core/util/mail/MailHelper.java   | 112 +++++++++++-------
 .../org/olat/core/util/mail/MailerResult.java |  31 +++--
 .../mail/_i18n/LocalStrings_de.properties     |   2 +
 .../mail/_i18n/LocalStrings_en.properties     |   2 +
 .../util/mail/manager/MailManagerImpl.java    |   2 +
 .../core/util/mail/ui/MailListController.java |   2 +-
 .../ui/SendDocumentsByEMailController.java    |   2 +-
 .../member/MembersOverviewController.java     |   2 +-
 .../course/nodes/en/EnrollmentManager.java    |   8 +-
 .../projectbroker/ProjectGroupController.java |   2 +-
 .../nodes/ta/TACourseNodeEditController.java  |   2 +-
 .../ui/CourseReminderLogsController.java      |   2 +-
 .../ui/CourseSendReminderListController.java  |   2 +-
 .../edit/BusinessGroupMembersController.java  |   2 +-
 .../AbstractBusinessGroupListController.java  |   2 +-
 .../modules/co/ContactFormController.java     |  34 ++----
 .../repository/handlers/CourseHandler.java    |   2 +-
 .../author/RepositoryMembersController.java   |   2 +-
 .../wizard/UnpublishResourceCallback.java     |   2 +-
 24 files changed, 134 insertions(+), 97 deletions(-)

diff --git a/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java b/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
index f0cfb7631a1..2a256914f0e 100644
--- a/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
+++ b/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
@@ -241,7 +241,7 @@ public class DENManageParticipantsController extends BasicController {
 					MailBundle ccBundles = mailManager.makeMailBundle(context, sender, notificationCtr.getMailTemplate(), sender, metaId, result);
 					result.append(mailManager.sendMessage(ccBundles));
 				}
-				MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
+				MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 			}
 			notificationCmc.deactivate();
 			selectedIds.clear();
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
index f5ab938677e..9dd08931f1f 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
@@ -541,7 +541,7 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 		}
 	}
 
@@ -588,7 +588,7 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, ureq.getLocale());
+			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 		}
 		// report any errors on screen
 		if (infoMessage.length() > 0) getWindowControl().setWarning(infoMessage.toString());
diff --git a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
index 6e1db8aca41..a3b696987c5 100644
--- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
+++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java
@@ -493,7 +493,7 @@ public class CourseOverviewController extends BasicController  {
 		
 		//make sure all is committed before loading the model again (I see issues without)
 		DBFactory.getInstance().commitAndCloseSession();
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
 	}
 
 	/**
@@ -564,7 +564,7 @@ public class CourseOverviewController extends BasicController  {
 				MailPackage mailing = new MailPackage(doSendMail);
 				// 2) remove as participant
 				businessGroupService.removeParticipants(getIdentity(), membersToRemove, group, mailing);
-				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), getLocale());
+				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
 			}
 		}
 		
diff --git a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
index f2ed51d1ec4..cc80983c1b1 100644
--- a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
+++ b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
@@ -325,7 +325,7 @@ public class GroupOverviewController extends BasicController {
 				MailPackage mailing = new MailPackage(doSendMail);
 				// 2) remove as participant
 				businessGroupService.removeParticipants(getIdentity(), Collections.singletonList(identity), group, mailing);
-				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), getLocale());
+				MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
 			}
 		}
 
diff --git a/src/main/java/org/olat/basesecurity/ui/GroupController.java b/src/main/java/org/olat/basesecurity/ui/GroupController.java
index c73e58c5f96..466f356ecba 100644
--- a/src/main/java/org/olat/basesecurity/ui/GroupController.java
+++ b/src/main/java/org/olat/basesecurity/ui/GroupController.java
@@ -551,7 +551,7 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 		}
 	}
 
@@ -598,7 +598,7 @@ public class GroupController extends BasicController {
 				MailBundle ccBundle = mailManager.makeMailBundle(context, ureq.getIdentity(), mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, ureq.getLocale());
+			MailHelper.appendErrorsAndWarnings(result, errorMessage, infoMessage, ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 		}
 		// report any errors on screen
 		if (infoMessage.length() > 0) getWindowControl().setWarning(infoMessage.toString());
diff --git a/src/main/java/org/olat/core/util/mail/MailHelper.java b/src/main/java/org/olat/core/util/mail/MailHelper.java
index 440cda4f91f..5d081370450 100644
--- a/src/main/java/org/olat/core/util/mail/MailHelper.java
+++ b/src/main/java/org/olat/core/util/mail/MailHelper.java
@@ -40,6 +40,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.Preferences;
 import org.olat.core.id.User;
 import org.olat.core.id.UserConstants;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.i18n.I18nManager;
 import org.olat.core.util.i18n.I18nModule;
@@ -170,15 +171,19 @@ public class MailHelper {
 	 * @param wControl The current window controller
 	 * @param locale The users local
 	 */
-	public static void printErrorsAndWarnings(MailerResult mailerResult, WindowControl wControl, Locale locale) {
+	public static void printErrorsAndWarnings(MailerResult mailerResult, WindowControl wControl, boolean admin, Locale locale) {
+		if(mailerResult == null || wControl == null) return;
+		
 		StringBuilder errors = new StringBuilder();
 		StringBuilder warnings = new StringBuilder();
-		appendErrorsAndWarnings(mailerResult, errors, warnings, locale);
+		appendErrorsAndWarnings(mailerResult, errors, warnings, admin, locale);
 		// now print a warning to the users screen
 		if (errors.length() > 0) {
+			if (warnings.length() > 0) {
+				errors.append(warnings);
+			}
 			wControl.setError(errors.toString());
-		}
-		if (warnings.length() > 0) {
+		} else if (warnings.length() > 0) {
 			wControl.setWarning(warnings.toString());
 		}
 	}
@@ -194,44 +199,72 @@ public class MailHelper {
 	 * @param warnings StringBuilder for the warnings
 	 * @param locale The users local
 	 */
-	public static void appendErrorsAndWarnings(MailerResult mailerResult, StringBuilder errors, StringBuilder warnings, Locale locale) {
-		Translator trans = Util.createPackageTranslator(MailerResult.class, locale);
+	public static void appendErrorsAndWarnings(MailerResult mailerResult, StringBuilder errors, StringBuilder warnings, boolean admin, Locale locale) {
+		if(mailerResult == null) return;
+
 		int returnCode = mailerResult.getReturnCode();
-		List<Identity> failedIdentites = mailerResult.getFailedIdentites();
+		Translator trans = Util.createPackageTranslator(MailerResult.class, locale);
 
 		// first the severe errors
-		if (returnCode == MailerResult.SEND_GENERAL_ERROR) {
-			errors.append("<p>").append(trans.translate("mailhelper.error.send.general")).append("</p>");
-		} else if (returnCode == MailerResult.SENDER_ADDRESS_ERROR) {
-			errors.append("<p>").append(trans.translate("mailhelper.error.sender.address")).append("</p>");
-		} else if (returnCode == MailerResult.RECIPIENT_ADDRESS_ERROR) {
-			errors.append("<p>").append(trans.translate("mailhelper.error.recipient.address")).append("</p>");
-		} else if (returnCode == MailerResult.TEMPLATE_GENERAL_ERROR) {
-			errors.append("<p>").append(trans.translate("mailhelper.error.template.general")).append("</p>");
-		} else if (returnCode == MailerResult.TEMPLATE_PARSE_ERROR) {
-			errors.append("<p>").append(trans.translate("mailhelper.error.template.parse")).append("</p>");
-		} else if (returnCode == MailerResult.ATTACHMENT_INVALID) {
-			errors.append("<p>").append(trans.translate("mailhelper.error.attachment")).append("</p>");
-		} else {
-			// mail could be send, but maybe not to all the users (e.g. invalid mail
-			// adresses or a temporary problem)
-			if (failedIdentites != null && failedIdentites.size() > 0) {
-				warnings.append("<p>").append(trans.translate("mailhelper.error.failedusers"));
-				warnings.append("<ul>");
-				for (Identity identity : failedIdentites) {
-					User user = identity.getUser();
-					warnings.append("<li>");
-					String fullname = UserManager.getInstance().getUserDisplayName(identity);
-					warnings.append(trans.translate("mailhelper.error.failedusers.user", new String[] {
-							user.getProperty(UserConstants.FIRSTNAME, null),
-							user.getProperty(UserConstants.LASTNAME, null),
-							user.getProperty(UserConstants.EMAIL, null),
-							fullname
-						}));
-					warnings.append("</li>");
+		switch(returnCode) {
+			case MailerResult.MAILHOST_UNDEFINED: {	
+				errors.append("<p><strong>").append(trans.translate("mailhelper.error.undefined.smtp")).append("</strong></p>");
+				break;
+			}
+			case MailerResult.SEND_GENERAL_ERROR: {
+				errors.append("<p>").append(trans.translate("mailhelper.error.send.general")).append("</p>");
+				if(admin && StringHelper.containsNonWhitespace(mailerResult.getErrorMessage())) {
+					errors.append("<p><em>").append(mailerResult.getErrorMessage()).append("</em></p>");
+				}
+				break;
+			}
+			case MailerResult.SENDER_ADDRESS_ERROR: {
+				errors.append("<p>").append(trans.translate("mailhelper.error.sender.address")).append("</p>");
+				if(admin && StringHelper.containsNonWhitespace(mailerResult.getErrorMessage())) {
+					errors.append("<p><em>").append(mailerResult.getErrorMessage()).append("</em></p>");
 				}
-				warnings.append("</ul></p>");
+				break;
+			}
+			case MailerResult.TEMPLATE_GENERAL_ERROR: {
+				errors.append("<p>").append(trans.translate("mailhelper.error.template.general")).append("</p>");
+				break;
+			}
+			case MailerResult.TEMPLATE_PARSE_ERROR: {
+				errors.append("<p>").append(trans.translate("mailhelper.error.template.parse")).append("</p>");
+				break;
 			}
+			case MailerResult.ATTACHMENT_INVALID: {	
+				errors.append("<p>").append(trans.translate("mailhelper.error.attachment")).append("</p>");
+				break;
+			}
+		}
+
+		List<Identity> failedIdentites = mailerResult.getFailedIdentites();
+		if (failedIdentites != null && failedIdentites.size() > 0) {
+			warnings.append("<p>").append(trans.translate("mailhelper.error.failedusers"));
+			warnings.append("<ul>");
+			for (Identity identity : failedIdentites) {
+				User user = identity.getUser();
+				warnings.append("<li>");
+				String fullname = UserManager.getInstance().getUserDisplayName(identity);
+				warnings.append(trans.translate("mailhelper.error.failedusers.user", new String[] {
+						user.getProperty(UserConstants.FIRSTNAME, null),
+						user.getProperty(UserConstants.LASTNAME, null),
+						user.getProperty(UserConstants.EMAIL, null),
+						fullname
+					}));
+				warnings.append("</li>");
+			}
+			warnings.append("</ul></p>");
+		}
+
+		List<String> invalidAddresses = mailerResult.getInvalidAddresses();
+		if (invalidAddresses != null && invalidAddresses.size() > 0) {
+			warnings.append("<p>").append(trans.translate("mailhelper.error.failedadresses")).append("<ul>");
+			for (String invalidAddress:invalidAddresses) {
+				warnings.append("<li>").append(invalidAddress).append("</li>");
+			}
+			warnings.append("<ul>");
 		}
 	}
 
@@ -274,7 +307,4 @@ public class MailHelper {
 		}
 		return attachmentList;
 	}
-}
-
-
-
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/util/mail/MailerResult.java b/src/main/java/org/olat/core/util/mail/MailerResult.java
index 2e4aed7a48a..032c5e63454 100644
--- a/src/main/java/org/olat/core/util/mail/MailerResult.java
+++ b/src/main/java/org/olat/core/util/mail/MailerResult.java
@@ -51,10 +51,12 @@ public class MailerResult {
 	public static final int TEMPLATE_GENERAL_ERROR = 6;
 	public static final int ATTACHMENT_INVALID = 7;
 
+
 	private final List<String> invalidAddresses = new ArrayList<>();
 	private final List<Identity> failedIdentites = new ArrayList<>();
 	
 	private int returnCode = OK;
+	private String errorMessage;
 
 	/**
 	 * @return list of identities to which the mail could not be send, e.g.
@@ -75,6 +77,26 @@ public class MailerResult {
 		return returnCode;
 	}
 
+	/**
+	 * Package helper to set the return code.
+	 * 
+	 * @param returnCode
+	 */
+	public void setReturnCode(int returnCode) {
+		this.returnCode = returnCode;
+	}
+	
+	/**
+	 * @return The error message returned by the JavaMail library and / or the mail server.
+	 */
+	public String getErrorMessage() {
+		return errorMessage;
+	}
+
+	public void setErrorMessage(String errorMessage) {
+		this.errorMessage = errorMessage;
+	}
+
 	/**
 	 * Package helper to add an identity to which for whatever reason the mail
 	 * could not be sent
@@ -96,15 +118,6 @@ public class MailerResult {
 			}
 		}
 	}
-
-	/**
-	 * Package helper to set the return code.
-	 * 
-	 * @param returnCode
-	 */
-	public void setReturnCode(int returnCode) {
-		this.returnCode = returnCode;
-	}
 	
 	public void append(MailerResult newResult) {
 		if(newResult.getReturnCode() != MailerResult.OK) {
diff --git a/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_de.properties
index 2c3cbe5d568..003333d24ef 100644
--- a/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_de.properties
@@ -18,9 +18,11 @@ footer.no.userdata=<p>Diese Nachricht wurde automatisch von der Lernplattform Op
 footer.with.userdata=<p>Absender: {2} {3} ({0}), {4} {5}</p><p>Diese Nachricht wurde \u00FCber die Lernplattform OpenOLAT versandt: {1}</p>
 
 mailhelper.error.attachment=Die E-Mail konnte nicht verschickt werden\: ung\u00FCltiges Attachment. Bitte benachrichtigen Sie die Empf\u00E4nger manuell. 
+mailhelper.error.failedadresses=Diese Email Adresses konnte inval sein:
 mailhelper.error.failedusers=Den folgenden Benutzern kann Ihre Nachricht nicht zugestellt werden. Bitte benachrichtigen Sie diese Benutzer manuell und bitten Sie diese, ihre E-Mail-Adresse zu \u00FCberpr\u00FCfen\:
 mailhelper.error.failedusers.title = Gesperrte Empf\u00e4nger-Adressen
 mailhelper.error.failedusers.user = {0} {1} mit Mailadresse {2} und Login {3}
+mailhelper.error.undefined.smtp=Der SMTP-Server ist nicht konfiguriert.
 mailhelper.error.recipient.address=Die E-Mail konnte nicht verschickt werden\: ung\u00FCltige Empf\u00E4ngeradresse. Bitte benachrichtigen Sie die Empf\u00E4nger manuell. 
 mailhelper.error.send.general=Die E-Mail konnte aus unbekannten Problemen nicht verschickt werden. Bitte benachrichtigen Sie die Empf\u00E4nger manuell. 
 mailhelper.error.sender.address=Die E-Mail konnte nicht verschickt werden\: ung\u00FCltige Absenderadresse. Bitte benachrichtigen Sie die Empf\u00E4nger manuell. 
diff --git a/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_en.properties
index 55e3802a2d8..5a032641129 100644
--- a/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/core/util/mail/_i18n/LocalStrings_en.properties
@@ -52,9 +52,11 @@ mail.unmarked=Unmarked
 mail.unread=Unread
 mailhelper.error.addressinvalid=One or more addresses are invalid\: {0}
 mailhelper.error.attachment=Mail could not be sent\: invalid attachments. Please notify your recipients manually.
+mailhelper.error.failedadresses=These e-mail addresses are perhaps invalid:
 mailhelper.error.failedusers=Your e-mail cannot be sent to the following users. Please notify them manually and ask them to check their e-mail address\:
 mailhelper.error.failedusers.title=Disabled recipients' addresses
 mailhelper.error.failedusers.user={0} {1} using mail address {2} and login {3}
+mailhelper.error.undefined.smtp=The SMTP server is not configured.
 mailhelper.error.recipient.address=Mail could not be sent\: invalid recipient address. Please notify your recipients manually.
 mailhelper.error.send.general=Mail could not be sent due to unknown problems. Please notify your recipients manually.
 mailhelper.error.sender.address=Mail could not be sent\: invalid sender address. Please notify your recipients manually. 
diff --git a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
index fcdcf4db538..5f15ce49b91 100644
--- a/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
+++ b/src/main/java/org/olat/core/util/mail/manager/MailManagerImpl.java
@@ -1694,9 +1694,11 @@ public class MailManagerImpl implements MailManager, InitializingBean  {
 			result.setReturnCode(MailerResult.RECIPIENT_ADDRESS_ERROR);
 			result.addInvalidAddresses(e.getInvalidAddresses());
 			result.addInvalidAddresses(e.getValidUnsentAddresses());
+			result.setErrorMessage(e.getMessage());
 			log.warn("Could not send mail", e);
 		} catch (MessagingException e) {
 			result.setReturnCode(MailerResult.SEND_GENERAL_ERROR);
+			result.setErrorMessage(e.getMessage());
 			log.warn("Could not send mail", e);
 		}
 	}
diff --git a/src/main/java/org/olat/core/util/mail/ui/MailListController.java b/src/main/java/org/olat/core/util/mail/ui/MailListController.java
index cf80e594682..779e9592376 100644
--- a/src/main/java/org/olat/core/util/mail/ui/MailListController.java
+++ b/src/main/java/org/olat/core/util/mail/ui/MailListController.java
@@ -356,7 +356,7 @@ public class MailListController extends BasicController implements Activateable2
 						DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(i);						
 						MailerResult result = forwardToMyRealMail(mail);
 						if(result.getReturnCode() != MailerResult.OK) {
-							MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
+							MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
 						} else {
 							showInfo("mail.action.send.real.success", mail.getSubject());
 						}
diff --git a/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java b/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
index ac5fa28c195..1472db08f7f 100644
--- a/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
+++ b/src/main/java/org/olat/core/util/mail/ui/SendDocumentsByEMailController.java
@@ -549,7 +549,7 @@ public class SendDocumentsByEMailController extends FormBasicController implemen
 			result.append(mailManager.sendMessage(bundle));
 		}
 
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 	}
 
 	public class FileInfo {
diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java
index 718dd80a593..25d01ba219c 100644
--- a/src/main/java/org/olat/course/member/MembersOverviewController.java
+++ b/src/main/java/org/olat/course/member/MembersOverviewController.java
@@ -387,7 +387,7 @@ public class MembersOverviewController extends BasicController implements Activa
 		
 		MailPackage mailing = new MailPackage(template, result, getWindowControl().getBusinessControl().getAsString(), template != null);
 		businessGroupService.updateMemberships(getIdentity(), allModifications, mailing);
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
 		
 		switchToAllMembers(ureq);
 	}
diff --git a/src/main/java/org/olat/course/nodes/en/EnrollmentManager.java b/src/main/java/org/olat/course/nodes/en/EnrollmentManager.java
index 51d8252224a..a201774b274 100644
--- a/src/main/java/org/olat/course/nodes/en/EnrollmentManager.java
+++ b/src/main/java/org/olat/course/nodes/en/EnrollmentManager.java
@@ -150,7 +150,7 @@ public class EnrollmentManager extends BasicManager {
 		if(bundle != null) {
 			mailManager.sendMessage(bundle);
 		}
-		MailHelper.printErrorsAndWarnings(result, wControl, trans.getLocale());
+		MailHelper.printErrorsAndWarnings(result, wControl, false, trans.getLocale());
 	}
 
 	public void doCancelEnrollmentInWaitingList(final Identity identity, final BusinessGroup enrolledWaitingListGroup, final ENCourseNode enNode,
@@ -174,7 +174,7 @@ public class EnrollmentManager extends BasicManager {
 		if(bundle != null) {
 			mailManager.sendMessage(bundle);
 		}
-		MailHelper.printErrorsAndWarnings(result, wControl, trans.getLocale());
+		MailHelper.printErrorsAndWarnings(result, wControl, false, trans.getLocale());
 	}
 
 	// Helper Methods
@@ -396,7 +396,7 @@ public class EnrollmentManager extends BasicManager {
 		if(bundle != null) {
 			mailManager.sendMessage(bundle);
 		}
-		MailHelper.printErrorsAndWarnings(result, wControl, trans.getLocale());
+		MailHelper.printErrorsAndWarnings(result, wControl, false, trans.getLocale());
 		return true;
 	}
 
@@ -433,7 +433,7 @@ public class EnrollmentManager extends BasicManager {
 		if(bundle != null) {
 			mailManager.sendMessage(bundle);
 		}
-		MailHelper.printErrorsAndWarnings(result, wControl, trans.getLocale());
+		MailHelper.printErrorsAndWarnings(result, wControl, false, trans.getLocale());
 		return true;
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
index 1e562f6339c..0a2960162f2 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
@@ -190,7 +190,7 @@ public class ProjectGroupController extends BasicController {
 					MailBundle ccBundle = mailManager.makeMailBundle(context, urequest.getIdentity(), mailTemplate, null, metaId, result);
 					result.append(mailManager.sendMessage(ccBundle));
 				}
-				MailHelper.printErrorsAndWarnings(result, getWindowControl(), urequest.getLocale());
+				MailHelper.printErrorsAndWarnings(result, getWindowControl(), urequest.getUserSession().getRoles().isOLATAdmin(), urequest.getLocale());
 			}
 			fireEvent(urequest, Event.CHANGED_EVENT );		
 			// Participant and waiting-list were changed => reload both
diff --git a/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java b/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
index bb25b959299..213c2d01797 100644
--- a/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
+++ b/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
@@ -535,7 +535,7 @@ public class TACourseNodeEditController extends ActivateableTabbableDefaultContr
 				MailBundle ccBundle = mailManager.makeMailBundle(context, sender, mailTemplate, sender, metaId, result);
 				result.append(mailManager.sendMessage(ccBundle));
 			}
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getLocale());
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 		}
 	}
 	
diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java
index 514d14cf257..ac952facba4 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderLogsController.java
@@ -218,7 +218,7 @@ public class CourseReminderLogsController extends FormBasicController {
 		List<Identity> identitiesToRemind = Collections.singletonList(id);
 		MailerResult result = reminderService.sendReminder(reloadedReminder, identitiesToRemind);
 		if(result.getReturnCode() != MailerResult.OK) {
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), false, getLocale());
 		} else {
 			showInfo("reminder.resend");
 		}
diff --git a/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java b/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java
index 7e43e1381e3..8f57cf40f85 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseSendReminderListController.java
@@ -176,7 +176,7 @@ public class CourseSendReminderListController extends FormBasicController {
 		List<Identity> identitiesToRemind = Collections.singletonList(id);
 		MailerResult result = reminderService.sendReminder(reloadedReminder, identitiesToRemind);
 		if(result.getReturnCode() != MailerResult.OK) {
-			MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
+			MailHelper.printErrorsAndWarnings(result, getWindowControl(), false, getLocale());
 		} else {
 			showInfo("reminder.resend");
 		}
diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
index 195cc234585..1369f2bbd10 100644
--- a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
+++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
@@ -247,6 +247,6 @@ public class BusinessGroupMembersController extends BasicController {
 		MailTemplate template = (MailTemplate)runContext.get("mailTemplate");
 		MailPackage mailing = new MailPackage(template, getWindowControl().getBusinessControl().getAsString(), template != null);
 		businessGroupService.updateMemberships(getIdentity(), allModifications, mailing);
-		MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), getLocale());
+		MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), false, getLocale());
 	}
 }
diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
index 9e6e9bb70dd..bab3d43ab63 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
@@ -910,7 +910,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 	private void finishUserManagement(MembershipModification mod, List<BusinessGroup> groups, MailTemplate template, boolean sendMail) {
 		MailPackage mailing = new MailPackage(template, getWindowControl().getBusinessControl().getAsString(), sendMail);
 		businessGroupService.updateMembership(getIdentity(), mod, groups, mailing);
-		MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), getLocale());
+		MailHelper.printErrorsAndWarnings(mailing.getResult(), getWindowControl(), false, getLocale());
 	}
 	
 	protected void doSearch(UserRequest ureq, SearchEvent event) {
diff --git a/src/main/java/org/olat/modules/co/ContactFormController.java b/src/main/java/org/olat/modules/co/ContactFormController.java
index 18353f54cdf..07b0b9dc591 100644
--- a/src/main/java/org/olat/modules/co/ContactFormController.java
+++ b/src/main/java/org/olat/modules/co/ContactFormController.java
@@ -40,7 +40,6 @@ import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
-import org.olat.core.util.StringHelper;
 import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.ContactMessage;
 import org.olat.core.util.mail.MailBundle;
@@ -50,7 +49,6 @@ import org.olat.core.util.mail.MailHelper;
 import org.olat.core.util.mail.MailLoggingAction;
 import org.olat.core.util.mail.MailManager;
 import org.olat.core.util.mail.MailerResult;
-import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -99,8 +97,6 @@ public class ContactFormController extends BasicController {
 	
 	@Autowired
 	private MailManager mailService;
-	@Autowired
-	private UserManager userManager;
 	
 	/**
 	 * 
@@ -242,7 +238,7 @@ public class ContactFormController extends BasicController {
 					ThreadLocalUserActivityLogger.log(MailLoggingAction.MAIL_SENT, getClass());
 					fireEvent(ureq, Event.DONE_EVENT);
 				} else {
-					showError(result);
+					showError(ureq, result);
 					fireEvent(ureq, Event.FAILED_EVENT);
 				}
 			}
@@ -253,26 +249,18 @@ public class ContactFormController extends BasicController {
 		cntctForm.setDisplayOnly(true);
 	}
 	
-	private void showError(MailerResult result) {
+	private void showError(UserRequest ureq, MailerResult result) {
+		StringBuilder errors = new StringBuilder(1024);
+		StringBuilder warnings = new StringBuilder(1024);
+		MailHelper.appendErrorsAndWarnings(result, errors, warnings, ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
+
 		StringBuilder error = new StringBuilder(1024);
 		error.append(translate("error.msg.send.nok"));
-		if(result != null && (result.getFailedIdentites().size() > 0 || result.getInvalidAddresses().size() > 0)) {
-			error.append("<br />");
-
-			StringBuilder ids = new StringBuilder(1024);
-			for(Identity identity:result.getFailedIdentites()) {
-				if(ids.length() > 0) ids.append(", ");
-				
-				String fullname = userManager.getUserDisplayName(identity);
-				if(StringHelper.containsNonWhitespace(fullname)) {
-					ids.append(fullname);
-				}
-			}
-			for(String invalidAddress:result.getInvalidAddresses()) {
-				if(ids.length() > 0) ids.append(", ");
-				ids.append(invalidAddress);
-			}
-			error.append(translate("error.msg.send.invalid.rcps", new String[]{ ids.toString() }));
+		if(errors.length() > 0) {
+			error.append("<br>").append(errors);
+		}
+		if(warnings.length() > 0) {
+			warnings.append("<br>").append(warnings);
 		}
 		getWindowControl().setError(error.toString());
 	}
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index 8dd88878ec6..2b367873147 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -547,7 +547,7 @@ public class CourseHandler implements RepositoryHandler {
 				control.setInfo(CourseCreationMailHelper.getSuccessMessageString(uureq));
 				// send notification mail
 				final MailerResult mr = CourseCreationMailHelper.sentNotificationMail(uureq, ccHelper.getConfiguration());
-				MailHelper.printErrorsAndWarnings(mr, control, uureq.getLocale());
+				MailHelper.printErrorsAndWarnings(mr, control, uureq.getUserSession().getRoles().isOLATAdmin(), uureq.getLocale());
 				return StepsMainRunController.DONE_MODIFIED;
 			}
 		};
diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java b/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java
index 2a4d75a895e..3a1d9b7b2bc 100644
--- a/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java
+++ b/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java
@@ -187,6 +187,6 @@ public class RepositoryMembersController extends AbstractMemberListController {
 		List<BusinessGroupMembershipChange> allModifications = changes.generateBusinessGroupMembershipChange(members);
 		MailPackage bgMailing = new MailPackage(template, result, getWindowControl().getBusinessControl().getAsString(), template != null);
 		businessGroupService.updateMemberships(getIdentity(), allModifications, bgMailing);
-		MailHelper.printErrorsAndWarnings(result, getWindowControl(), getLocale());
+		MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
 	}
 }
diff --git a/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java b/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java
index 4f3e301cb60..09b580a1524 100644
--- a/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java
+++ b/src/main/java/org/olat/repository/ui/author/wizard/UnpublishResourceCallback.java
@@ -102,7 +102,7 @@ public class UnpublishResourceCallback implements StepRunnerCallback {
 			
 			StringBuilder errorMessage = new StringBuilder();
 			StringBuilder warningMessage = new StringBuilder();
-			MailHelper.appendErrorsAndWarnings(result, errorMessage, warningMessage, ureq.getLocale());
+			MailHelper.appendErrorsAndWarnings(result, errorMessage, warningMessage, ureq.getUserSession().getRoles().isOLATAdmin(), ureq.getLocale());
 			if (warningMessage.length() > 0) {
 				wControl.setWarning(warningMessage.toString());
 			}
-- 
GitLab