diff --git a/src/main/java/org/olat/core/util/mail/MailBundle.java b/src/main/java/org/olat/core/util/mail/MailBundle.java index f0fd4cefa05465e54bd5ebdb1b477224b5484f9d..de3a734f7c629c3cca5ada2687ae001943181c9c 100644 --- a/src/main/java/org/olat/core/util/mail/MailBundle.java +++ b/src/main/java/org/olat/core/util/mail/MailBundle.java @@ -38,6 +38,8 @@ public class MailBundle { private MailContext context; private Identity fromId; private String from; + private String mimeFromEmail; + private String mimeFromName; private Identity toId; private String to; private Identity cc; @@ -77,6 +79,22 @@ public class MailBundle { this.from = from; } + public String getMimeFromEmail() { + return mimeFromEmail; + } + + public void setMimeFromEmail(String mimeFromEmail) { + this.mimeFromEmail = mimeFromEmail; + } + + public String getMimeFromName() { + return mimeFromName; + } + + public void setMimeFromName(String mimeFromName) { + this.mimeFromName = mimeFromName; + } + public Identity getToId() { return toId; } 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 cc71b444f5107aefb3a2ea1cfb2a5209d2f5c7a0..2959ee950aa32253191c7024212b09068cd99de4 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 @@ -692,19 +692,19 @@ public class MailManagerImpl implements MailManager, InitializingBean { MailerResult result = new MailerResult(); for(MailBundle bundle:bundles) { MailContent content = decorateMail(bundle); - if(mailModule.isInternSystem()) { - saveDBMessage(bundle.getContext(), bundle.getFromId(), bundle.getFrom(), - bundle.getToId(), bundle.getTo(), bundle.getCc(), - bundle.getContactLists(), bundle.getMetaId(), content, result); + InternetAddress mimeFrom = createMimeFrom(bundle.getMimeFromEmail(), bundle.getMimeFromName()); + if (mailModule.isInternSystem()) { + saveDBMessage(bundle.getContext(), mimeFrom, bundle.getFromId(), bundle.getFrom(), bundle.getToId(), + bundle.getTo(), bundle.getCc(), bundle.getContactLists(), bundle.getMetaId(), content, result); } else { - sendExternMessage(bundle.getFromId(), bundle.getFrom(), + sendExternMessage(mimeFrom, bundle.getFromId(), bundle.getFrom(), bundle.getToId(), bundle.getTo(), bundle.getCc(), bundle.getContactLists(), content, result); } } return result; } - + @Override public MailContent decorateMail(MailBundle bundle) { MailContent content = bundle.getContent(); @@ -758,6 +758,7 @@ public class MailManagerImpl implements MailManager, InitializingBean { return new SimpleMailContent(subjectWriter.toString(), bodyWriter.toString(), template.getAttachments()); } + @Override public String decorateMailBody(String body, Locale locale) { String template = getMailTemplate(); boolean htmlTemplate = StringHelper.isHtml(template); @@ -875,13 +876,15 @@ public class MailManagerImpl implements MailManager, InitializingBean { if(useTemplate) { content = decorateMail(bundle); } - return sendExternMessage(bundle.getFromId(), bundle.getFrom(), bundle.getToId(), bundle.getTo(), bundle.getCc(), - bundle.getContactLists(), content, result); + Address mimeFrom = createMimeFrom(bundle.getMimeFromEmail(), bundle.getMimeFromName()); + return sendExternMessage(mimeFrom, bundle.getFromId(), bundle.getFrom(), bundle.getToId(), bundle.getTo(), + bundle.getCc(), bundle.getContactLists(), content, result); } /** * Send the message via e-mail, always. + * @param mimeFrom * @param from * @param to * @param cc @@ -892,13 +895,13 @@ public class MailManagerImpl implements MailManager, InitializingBean { * @param attachments * @return */ - private MailerResult sendExternMessage(Identity fromId, String from, Identity toId, String to, Identity cc, List<ContactList> bccLists, - MailContent content, MailerResult result) { + private MailerResult sendExternMessage(Address mimeFrom, Identity fromId, String from, Identity toId, String to, + Identity cc, List<ContactList> bccLists, MailContent content, MailerResult result) { if(result == null) { result = new MailerResult(); } - MimeMessage mail = createMimeMessage(fromId, from, toId, to, cc, bccLists, content, result); + MimeMessage mail = createMimeMessage(mimeFrom, fromId, from, toId, to, cc, bccLists, content, result); if(mail != null) { sendMessage(mail, result); if(result != null && !result.isSuccessful()) { @@ -919,8 +922,8 @@ public class MailManagerImpl implements MailManager, InitializingBean { return mailModule.isReceiveRealMailUserDefaultSetting(); } - protected DBMail saveDBMessage(MailContext context, Identity fromId, String from, Identity toId, String to, - Identity cc, List<ContactList> bccLists, String metaId, MailContent content, MailerResult result) { + protected DBMail saveDBMessage(MailContext context, InternetAddress mimeFromAddress, Identity fromId, String from, Identity toId, String to, + Identity cc, List<ContactList> bccLists, String metaId, MailContent content, MailerResult result) { try { DBMailImpl mail = new DBMailImpl(); @@ -949,7 +952,13 @@ public class MailManagerImpl implements MailManager, InitializingBean { mail.setFrom(fromRecipient); } else { if(!StringHelper.containsNonWhitespace(from)) { - from = WebappHelper.getMailConfig("mailFrom"); + if (mimeFromAddress != null) { + from = mimeFromAddress.getPersonal(); + fromAddress = mimeFromAddress; + } else { + from = WebappHelper.getMailConfig("mailFrom"); + fromAddress = createFromAddress(from, result); + } } DBMailRecipient fromRecipient = new DBMailRecipient(); fromRecipient.setEmailAddress(from); @@ -957,7 +966,6 @@ public class MailManagerImpl implements MailManager, InitializingBean { fromRecipient.setMarked(Boolean.FALSE); fromRecipient.setDeleted(Boolean.TRUE);//marked as delted as nobody can read it mail.setFrom(fromRecipient); - fromAddress = createFromAddress(from, result); } if(result.getReturnCode() != MailerResult.OK) { @@ -1088,7 +1096,7 @@ public class MailManagerImpl implements MailManager, InitializingBean { if(makeRealMail) { //check that we send an email to someone if(!toAddress.isEmpty() || !ccAddress.isEmpty() || !bccAddress.isEmpty()) { - sendRealMessage(fromAddress, toAddress, ccAddress, bccAddress, subject, body, attachments, result); + sendRealMessage(mimeFromAddress, fromAddress, toAddress, ccAddress, bccAddress, subject, body, attachments, result); if(result != null && !result.isSuccessful()) { handleErrors(result, fromId, toId, cc, bccLists); } @@ -1271,8 +1279,8 @@ public class MailManagerImpl implements MailManager, InitializingBean { return makeRealMail; } - private MimeMessage createMimeMessage(Identity fromId, String mailFrom, Identity toId, String to, Identity ccId, - List<ContactList> bccLists, MailContent content, MailerResult result) { + private MimeMessage createMimeMessage(Address mimeFrom, Identity fromId, String mailFrom, Identity toId, String to, + Identity ccId, List<ContactList> bccLists, MailContent content, MailerResult result) { try { Address from; if(StringHelper.containsNonWhitespace(mailFrom)) { @@ -1329,7 +1337,7 @@ public class MailManagerImpl implements MailManager, InitializingBean { Address[] tos = toList.toArray(new Address[toList.size()]); Address[] ccs = ccList.toArray(new Address[ccList.size()]); Address[] bccs = bccList.toArray(new Address[bccList.size()]); - return createMimeMessage(from, tos, ccs, bccs, content.getSubject(), content.getBody(), content.getAttachments(), result); + return createMimeMessage(mimeFrom, from, tos, ccs, bccs, content.getSubject(), content.getBody(), content.getAttachments(), result); } catch (MessagingException e) { log.error("", e); return null; @@ -1352,6 +1360,24 @@ public class MailManagerImpl implements MailManager, InitializingBean { return add; } + private InternetAddress createMimeFrom(String mimeFromEmail, String mimeFromName) { + InternetAddress mimeFromAddress = null; + + try { + if (StringHelper.containsNonWhitespace(mimeFromEmail)) { + if (StringHelper.containsNonWhitespace(mimeFromName)) { + mimeFromAddress = new InternetAddress(mimeFromEmail, mimeFromName); + } else { + mimeFromAddress = new InternetAddress(mimeFromEmail); + } + } + } catch (Exception e) { + log.warn("Unable to create mime from address: email={}, name={}", mimeFromEmail, mimeFromName); + } + + return mimeFromAddress; + } + private Address createFromAddress(String address, MailerResult result) throws AddressException { if (!StringHelper.containsNonWhitespace(address)) { address = WebappHelper.getMailConfig("mailFrom"); @@ -1477,8 +1503,8 @@ public class MailManagerImpl implements MailManager, InitializingBean { return null; } - private void sendRealMessage(Address from, List<Address> toList, List<Address> ccList, List<Address> bccList, String subject, String body, - List<File> attachments, MailerResult result) { + private void sendRealMessage(Address mimeFrom, Address from, List<Address> toList, List<Address> ccList, + List<Address> bccList, String subject, String body, List<File> attachments, MailerResult result) { Address[] tos = null; if(toList != null && !toList.isEmpty()) { @@ -1498,7 +1524,7 @@ public class MailManagerImpl implements MailManager, InitializingBean { bccs = bccList.toArray(bccs); } - MimeMessage msg = createMimeMessage(from, tos, ccs, bccs, subject, body, attachments, result); + MimeMessage msg = createMimeMessage(mimeFrom, from, tos, ccs, bccs, subject, body, attachments, result); sendMessage(msg, result); } @@ -1659,10 +1685,15 @@ public class MailManagerImpl implements MailManager, InitializingBean { return !(Arrays.stream(addressArray).map(r -> ((InternetAddress) r).getAddress()) .filter(x -> x.contains("@")).allMatch(x -> x.endsWith(fromDomain))); } - + @Override public MimeMessage createMimeMessage(Address from, Address[] tos, Address[] ccs, Address[] bccs, String subject, String body, List<File> attachments, MailerResult result) { + return createMimeMessage(from, tos, ccs, bccs, subject, body, attachments, result); + } + + public MimeMessage createMimeMessage(Address mimeSender, Address from, Address[] tos, Address[] ccs, Address[] bccs, String subject, String body, + List<File> attachments, MailerResult result) { if (from == null || ((tos == null || tos.length == 0) && ((ccs == null || ccs.length == 0)) && (bccs == null || bccs.length == 0))) return null; try { @@ -1678,18 +1709,19 @@ public class MailManagerImpl implements MailManager, InitializingBean { if(bccs != null && bccs.length > 0) { msg.addRecipients(RecipientType.BCC, bccs); } - - String platformFrom = WebappHelper.getMailConfig("mailFrom"); - String platformName = WebappHelper.getMailConfig("mailFromName"); - Address viewablePlatformFrom = createAddressWithName(platformFrom, platformName); - // in case the sender and one of the recipients has an external mail address domain we set - // the from header to the admin address to prevent rejected or messages detected as spam. - msg.setFrom(from); - // from has to be set for this check to work - if (hasExternalFromAndRecipient(msg)) { - msg.setFrom(viewablePlatformFrom); + + // If custom mime from address, use it. + if (mimeSender != null) { + msg.setFrom(mimeSender); + Address rawMimeSender = getRawEmailFromAddress(mimeSender); + msg.setReplyTo(new Address[] {rawMimeSender}); + } else if (!hasExternalFromAndRecipient(msg)) { + // Only if whether the sender nor one of the recipients have an external email address, + // we set the from to the sender email address. In all other cases we use the admin address + // to prevent rejected or messages detected as spam (see createMessage(subject, from)). + msg.setFrom(from); } - + if (attachments != null && !attachments.isEmpty()) { // with attachment use multipart message Multipart multipart = new MimeMultipart("mixed"); diff --git a/src/main/java/org/olat/modules/quality/QualityModule.java b/src/main/java/org/olat/modules/quality/QualityModule.java index ddf32dfbefa045d9c099d039452c0a76a990a73b..40f74a6e3fd620b8a6d6a48fa43e287f1b9d5eb9 100644 --- a/src/main/java/org/olat/modules/quality/QualityModule.java +++ b/src/main/java/org/olat/modules/quality/QualityModule.java @@ -49,6 +49,8 @@ public class QualityModule extends AbstractSpringModule implements ConfigOnOff { private static final String SUGGESTION_EMAIL_SUBJECT = "quality.suggestion.email.subject"; private static final String SUGGESTION_EMAIL_BODY = "quality.suggestion.email.body"; private static final String DELIMITER = ","; + private static final String FROM_EMAIL = "quality.from.email"; + private static final String FROM_NAME = "quality.from.name"; @Value("${quality.enabled:false}") private boolean enabled; @@ -58,6 +60,10 @@ public class QualityModule extends AbstractSpringModule implements ConfigOnOff { private String suggestionEmailAddresses; private String suggestionEmailSubject; private String suggestionEmailBody; + @Value("${quality.from.email}") + private String fromEmail; + @Value("${quality.from.name}") + private String fromName; @Autowired public QualityModule(CoordinatorManager coordinatorManager) { @@ -102,6 +108,16 @@ public class QualityModule extends AbstractSpringModule implements ConfigOnOff { if (StringHelper.containsNonWhitespace(suggestionEmailBodyObj)) { suggestionEmailBody = suggestionEmailBodyObj; } + + String fromEmailObj = getStringPropertyValue(FROM_EMAIL, true); + if (StringHelper.containsNonWhitespace(fromEmailObj)) { + fromEmail = fromEmailObj; + } + + String fromNameObj = getStringPropertyValue(FROM_NAME, true); + if (StringHelper.containsNonWhitespace(fromNameObj)) { + fromName = fromNameObj; + } } @Override @@ -153,4 +169,22 @@ public class QualityModule extends AbstractSpringModule implements ConfigOnOff { setStringProperty(SUGGESTION_EMAIL_BODY, suggestionEmailBody, true); } + public String getFromEmail() { + return fromEmail; + } + + public void setFromEmail(String fromEmail) { + this.fromEmail = fromEmail; + setStringProperty(FROM_EMAIL, fromEmail, true); + } + + public String getFromName() { + return fromName; + } + + public void setFromName(String fromName) { + this.fromName = fromName; + setStringProperty(FROM_NAME, fromName, true); + } + } diff --git a/src/main/java/org/olat/modules/quality/manager/QualityMailing.java b/src/main/java/org/olat/modules/quality/manager/QualityMailing.java index c9100d0c2b064a59a57e99f42b1727d804ffe9cc..251040ecb8b9676198b3606c15edc3ecee9508c2 100644 --- a/src/main/java/org/olat/modules/quality/manager/QualityMailing.java +++ b/src/main/java/org/olat/modules/quality/manager/QualityMailing.java @@ -88,6 +88,7 @@ import org.olat.modules.quality.QualityDataCollectionView; import org.olat.modules.quality.QualityDataCollectionViewSearchParams; import org.olat.modules.quality.QualityExecutorParticipation; import org.olat.modules.quality.QualityExecutorParticipationSearchParams; +import org.olat.modules.quality.QualityModule; import org.olat.modules.quality.QualityReminder; import org.olat.modules.quality.model.QualityMailTemplateBuilder; import org.olat.modules.quality.ui.FiguresFactory; @@ -116,6 +117,8 @@ class QualityMailing { QualityDataCollectionStatus.RUNNING, QualityDataCollectionStatus.FINISHED); + @Autowired + private QualityModule qualityModule; @Autowired private QualityParticipationDAO participationDao; @Autowired @@ -138,6 +141,7 @@ class QualityMailing { MailManager mailManager = CoreSpringFactory.getImpl(MailManager.class); MailBundle bundle = mailManager.makeMailBundle(null, executor, template, null, null, result); if(bundle != null) { + appendMimeFrom(bundle); result = mailManager.sendMessage(bundle); if (result.isSuccessful()) { log.info(MessageFormat.format("{0} for quality data collection [key={1}] sent to {2}", @@ -246,6 +250,7 @@ class QualityMailing { MailManager mailManager = CoreSpringFactory.getImpl(MailManager.class); MailBundle bundle = mailManager.makeMailBundle(null, recipient, template, null, null, result); if(bundle != null) { + appendMimeFrom(bundle); result = mailManager.sendMessage(bundle); if (result.isSuccessful()) { log.info("Report access email send"); @@ -462,5 +467,14 @@ class QualityMailing { return new EvaluationFormPrintControllerCreator(form, storage, filter, figures, reportHelper, printSelection, dataCollection.getTitle()); } + + private void appendMimeFrom(MailBundle bundle) { + if (StringHelper.containsNonWhitespace(qualityModule.getFromEmail())) { + bundle.setMimeFromEmail(qualityModule.getFromEmail()); + bundle.setMimeFromName(qualityModule.getFromName()); + } + + } + } diff --git a/src/main/java/org/olat/modules/quality/ui/QualityAdminGeneralController.java b/src/main/java/org/olat/modules/quality/ui/QualityAdminGeneralController.java index 2e642816f51206024202c455cc864d6902c74b02..8d11363037408f0df63a6cb30c5bf12468031530 100644 --- a/src/main/java/org/olat/modules/quality/ui/QualityAdminGeneralController.java +++ b/src/main/java/org/olat/modules/quality/ui/QualityAdminGeneralController.java @@ -20,13 +20,15 @@ package org.olat.modules.quality.ui; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; -import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; +import org.olat.core.util.StringHelper; +import org.olat.core.util.mail.MailHelper; import org.olat.modules.quality.QualityModule; import org.springframework.beans.factory.annotation.Autowired; @@ -41,6 +43,8 @@ public class QualityAdminGeneralController extends FormBasicController { private static final String[] onKeys = new String[] { "on" }; private MultipleSelectionElement enableEl; + private TextElement fromEmailEl; + private TextElement fromNameEl; @Autowired private QualityModule qualityModule; @@ -56,27 +60,50 @@ public class QualityAdminGeneralController extends FormBasicController { String[] onValues = new String[] { translate("on") }; enableEl = uifactory.addCheckboxesHorizontal("admin.enabled", formLayout, onKeys, onValues); - enableEl.addActionListener(FormEvent.ONCHANGE); if (qualityModule.isEnabled()) { enableEl.select(onKeys[0], true); } + + fromEmailEl = uifactory.addTextElement("admin.from.email", 500, qualityModule.getFromEmail(), formLayout); + fromEmailEl.setHelpTextKey("admin.from.email.help", null); + + fromNameEl = uifactory.addTextElement("admin.from.name", 500, qualityModule.getFromName(), formLayout); + + FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonLayout.setRootForm(mainForm); + formLayout.add(buttonLayout); + uifactory.addFormSubmitButton("save", buttonLayout); } - + @Override - protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(enableEl == source) { - qualityModule.setEnabled(enableEl.isAtLeastSelected(1)); + protected boolean validateFormLogic(UserRequest ureq) { + boolean allOk = super.validateFormLogic(ureq); + + fromEmailEl.clearError(); + fromNameEl.clearError(); + if (StringHelper.containsNonWhitespace(fromEmailEl.getValue())) { + if (!MailHelper.isValidEmailAddress(fromEmailEl.getValue())) { + fromEmailEl.setErrorKey("error.email.invalid", null); + allOk = false; + } + } else if (StringHelper.containsNonWhitespace(fromNameEl.getValue())) { + fromNameEl.setErrorKey("error.email.name.no.address", null); + allOk = false; } - super.formInnerEvent(ureq, source, event); + + return allOk; } @Override - protected void doDispose() { - // + protected void formOK(UserRequest ureq) { + qualityModule.setEnabled(enableEl.isAtLeastSelected(1)); + + qualityModule.setFromEmail(fromEmailEl.getValue()); + qualityModule.setFromName(fromNameEl.getValue()); } - + @Override - protected void formOK(UserRequest ureq) { + protected void doDispose() { // } diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties index 6e76c6004fa5130e784d3c26b86fb05ee8d4ed5b..d32036adacaef5fb0ccfa9a736c9a103518af6a9 100644 --- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_de.properties @@ -1,6 +1,9 @@ #Wed Dec 19 17:17:44 CET 2018 admin.config.title=Einstellungen Qualit\u00E4tsmanagement admin.enabled=Qualit\u00E4tsmanagement +admin.from.email=Absender Email-Adresse +admin.from.email.help=Hier k\u00F6nnen Sie optional eine spezielle Email-Adresse f\u00FCr Emails des Qualit\u00E4tsmanagement konfigurieren (Einladungen, Erinnerungen, ...). +admin.from.name=Absender Name admin.menu.title=Qualit\u00E4tsmanagement admin.menu.title.alt=$\:admin.menu.title admin.suggestion.email.addresses=Empf\u00E4nger Email-Adressen @@ -77,9 +80,14 @@ data.collection.topic.type.select=Gegenstandsart data.collections=Datenerhebungen error.deadline.before.start=Der Endtermin muss sp\u00E4ter sein als der Starttermin. error.email.invalid=Email-Adresse ung\u00FCltig. +<<<<<<< Upstream, based on origin/master error.input.toolong=Der eingegebene Text ist mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen. error.number.greater=Die Zahl muss gr\u00F6sser oder gleich {0} sein. error.number.lower=Die Zahl muss kleiner oder gleich {0} sein. +======= +error.email.name.no.address=Sie k\u00F6nnen den Namen nur angeben, wenn Sie auch eine Email-Adresse angeben. +error.input.toolong=Der eingegebene Text ist mit {1} Zeichen zu lang. Bitte beschr\u00E4nken Sie sich auf maximal {0} Zeichen. +>>>>>>> f9f79a8 OO-4390: Specific sender address of QM e-mails error.repo.entry.missing=Der Fragebogen, welchen Sie anzeigen m\u00F6chten, wurde in der Zwischenzeit aus der Ablage der Lernressourcen gel\u00F6scht. error.repo.entry.not.replaceable=Der Fragebogen kann nicht mehr ge\u00E4ndert werden. error.wrong.number=Ung\u00FCltiges Zahlenfomat. diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties index f8a15ad74eecb4c163f94e0fa0689383095a572d..054d27dd11c29b0255a3b5bd842ef8eb4f00e0e1 100644 --- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties @@ -1,6 +1,9 @@ #Thu Nov 08 16:18:28 CET 2018 admin.config.title=Configuration quality management admin.enabled=Quality management +admin.from.email=Sender email address +admin.from.email.help=Here you can optionally configure a special email address for emails from quality management (invitations, remeinders, ...). +admin.from.name=Sender email name admin.menu.title=Quality management admin.menu.title.alt=$\:admin.menu.title admin.suggestion.email.addresses=Recipient email addresses @@ -77,6 +80,7 @@ data.collection.topic.type.select=Topic type data.collections=Data collections error.deadline.before.start=The deadline has to be after the start date. error.email.invalid=Email address not valid. +error.email.name.no.address=You can only enter the name if you also provide an email address. error.input.toolong=The text you entered is to long ({1} characters). Only {0} characters are allowed. error.number.greater=The number must be greater than or equal to {0}. error.number.lower=The number must be less than or equal to {0}. diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index 661ae44894faf9c02ddd84436f4b6b8d8cfc3b91..d0747c9e73203f2cfc79683309bb28b01f503aef 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1454,6 +1454,16 @@ lecture.assessment.mode.seb.keys= relation.role.enabled=enabled relation.role.enabled.values=enabled,disabled +######################################## +# Quality management +######################################## +quality.enabled=false + +# Custom email address and name for emails sent by the quality module. +# If empty, the values of $fromemail and $fromname are used. +quality.from.email= +quality.from.name= + ######################################## # Options for Virtual Classrooms ########################################