use of org.olat.core.util.mail.model.DBMailRecipient in project openolat by klemens.
the class MailManagerImpl method setMarked.
/**
* @param mail
* @param marked cannot be null
* @param identity
* @return true if the marked flag has been changed
*/
@Override
public boolean setMarked(DBMailLight mail, Boolean marked, Identity identity) {
if (mail == null || marked == null || identity == null)
throw new NullPointerException();
boolean changed = false;
for (DBMailRecipient recipient : mail.getRecipients()) {
if (recipient == null)
continue;
if (recipient != null && recipient.getRecipient() != null && recipient.getRecipient().equalsByPersistableKey(identity)) {
if (marked == null) {
marked = Boolean.FALSE;
}
if (!marked.equals(recipient.getMarked())) {
recipient.setMarked(marked.booleanValue());
dbInstance.updateObject(recipient);
changed |= true;
}
}
}
return changed;
}
use of org.olat.core.util.mail.model.DBMailRecipient in project openolat by klemens.
the class MailManagerImpl method toggleRead.
@Override
public DBMailLight toggleRead(DBMailLight mail, Identity identity) {
Boolean read = null;
for (DBMailRecipient recipient : mail.getRecipients()) {
if (recipient == null)
continue;
if (recipient.getRecipient() != null && recipient.getRecipient().equalsByPersistableKey(identity)) {
if (read == null) {
read = recipient.getRead() == null ? Boolean.FALSE : recipient.getRead();
}
recipient.setRead(read.booleanValue() ? Boolean.FALSE : Boolean.TRUE);
dbInstance.updateObject(recipient);
}
}
return mail;
}
use of org.olat.core.util.mail.model.DBMailRecipient in project openolat by klemens.
the class MailManagerImpl method saveDBMessage.
protected DBMail saveDBMessage(MailContext context, Identity fromId, String from, Identity toId, String to, Identity cc, List<ContactList> bccLists, String metaId, MailContent content, MailerResult result) {
try {
DBMailImpl mail = new DBMailImpl();
if (result == null) {
result = new MailerResult();
}
boolean makeRealMail = makeRealMail(toId, cc, bccLists);
Address fromAddress = null;
List<Address> toAddress = new ArrayList<Address>();
List<Address> ccAddress = new ArrayList<Address>();
List<Address> bccAddress = new ArrayList<Address>();
if (fromId != null) {
DBMailRecipient fromRecipient = new DBMailRecipient();
fromRecipient.setRecipient(fromId);
if (StringHelper.containsNonWhitespace(from)) {
fromRecipient.setEmailAddress(from);
fromAddress = createFromAddress(from, result);
} else {
fromAddress = createFromAddress(fromId, result);
}
fromRecipient.setVisible(Boolean.TRUE);
fromRecipient.setMarked(Boolean.FALSE);
fromRecipient.setDeleted(Boolean.FALSE);
mail.setFrom(fromRecipient);
} else {
if (!StringHelper.containsNonWhitespace(from)) {
from = WebappHelper.getMailConfig("mailFrom");
}
DBMailRecipient fromRecipient = new DBMailRecipient();
fromRecipient.setEmailAddress(from);
fromRecipient.setVisible(Boolean.TRUE);
fromRecipient.setMarked(Boolean.FALSE);
// marked as delted as nobody can read it
fromRecipient.setDeleted(Boolean.TRUE);
mail.setFrom(fromRecipient);
fromAddress = createFromAddress(from, result);
}
if (result.getReturnCode() != MailerResult.OK) {
return null;
}
mail.setMetaId(metaId);
String subject = content.getSubject();
if (subject != null && subject.length() > 500) {
log.warn("Cut a too long subkect in name. Size: " + subject.length(), null);
subject = subject.substring(0, 500);
}
mail.setSubject(subject);
String body = content.getBody();
if (body != null && body.length() > 16777210) {
log.warn("Cut a too long body in mail. Size: " + body.length(), null);
body = body.substring(0, 16000000);
}
mail.setBody(body);
mail.setLastModified(new Date());
if (context != null) {
OLATResourceable ores = context.getOLATResourceable();
if (ores != null) {
String resName = ores.getResourceableTypeName();
if (resName != null && resName.length() > 50) {
log.warn("Cut a too long resourceable type name in mail context: " + resName, null);
resName = resName.substring(0, 49);
}
mail.getContext().setResName(ores.getResourceableTypeName());
mail.getContext().setResId(ores.getResourceableId());
}
String resSubPath = context.getResSubPath();
if (resSubPath != null && resSubPath.length() > 2000) {
log.warn("Cut a too long resSubPath in mail context: " + resSubPath, null);
resSubPath = resSubPath.substring(0, 2000);
}
mail.getContext().setResSubPath(resSubPath);
String businessPath = context.getBusinessPath();
if (businessPath != null && businessPath.length() > 2000) {
log.warn("Cut a too long resSubPath in mail context: " + businessPath, null);
businessPath = businessPath.substring(0, 2000);
}
mail.getContext().setBusinessPath(businessPath);
}
// add to
DBMailRecipient recipientTo = null;
if (toId != null) {
recipientTo = new DBMailRecipient();
if (toId instanceof IdentityImpl) {
recipientTo.setRecipient(toId);
} else {
to = toId.getUser().getProperty(UserConstants.EMAIL, null);
}
if (StringHelper.containsNonWhitespace(to)) {
recipientTo.setEmailAddress(to);
}
recipientTo.setVisible(Boolean.TRUE);
recipientTo.setDeleted(Boolean.FALSE);
recipientTo.setMarked(Boolean.FALSE);
recipientTo.setRead(Boolean.FALSE);
} else if (StringHelper.containsNonWhitespace(to)) {
recipientTo = new DBMailRecipient();
recipientTo.setEmailAddress(to);
recipientTo.setVisible(Boolean.TRUE);
recipientTo.setDeleted(Boolean.TRUE);
recipientTo.setMarked(Boolean.FALSE);
recipientTo.setRead(Boolean.FALSE);
}
if (recipientTo != null) {
mail.getRecipients().add(recipientTo);
createAddress(toAddress, recipientTo, true, result, true);
}
if (makeRealMail && StringHelper.containsNonWhitespace(to)) {
createAddress(toAddress, to);
}
if (cc != null) {
DBMailRecipient recipient = new DBMailRecipient();
if (cc instanceof IdentityImpl) {
recipient.setRecipient(cc);
} else {
recipient.setEmailAddress(cc.getUser().getProperty(UserConstants.EMAIL, null));
}
recipient.setVisible(Boolean.TRUE);
recipient.setDeleted(Boolean.FALSE);
recipient.setMarked(Boolean.FALSE);
recipient.setRead(Boolean.FALSE);
mail.getRecipients().add(recipient);
createAddress(ccAddress, recipient, false, result, true);
}
// add bcc recipients
appendRecipients(mail, bccLists, toAddress, bccAddress, false, makeRealMail, result);
dbInstance.getCurrentEntityManager().persist(mail);
// save attachments
List<File> attachments = content.getAttachments();
if (attachments != null && !attachments.isEmpty()) {
for (File attachment : attachments) {
FileInputStream in = null;
try {
DBMailAttachment data = new DBMailAttachment();
data.setSize(attachment.length());
data.setName(attachment.getName());
long checksum = FileUtils.checksum(attachment, new Adler32()).getValue();
data.setChecksum(new Long(checksum));
data.setMimetype(WebappHelper.getMimeType(attachment.getName()));
in = new FileInputStream(attachment);
String path = saveAttachmentToStorage(data.getName(), data.getMimetype(), checksum, attachment.length(), in);
data.setPath(path);
data.setMail(mail);
dbInstance.getCurrentEntityManager().persist(data);
} catch (FileNotFoundException e) {
log.error("File attachment not found: " + attachment, e);
} catch (IOException e) {
log.error("Error with file attachment: " + attachment, e);
} finally {
IOUtils.closeQuietly(in);
}
}
}
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);
if (result != null && !result.isSuccessful()) {
handleErrors(result, fromId, toId, cc, bccLists);
}
}
}
// update subscription
for (DBMailRecipient recipient : mail.getRecipients()) {
if (recipient.getRecipient() != null) {
subscribe(recipient.getRecipient());
}
}
SubscriptionContext subContext = getSubscriptionContext();
notificationsManager.markPublisherNews(subContext, null, false);
return mail;
} catch (AddressException e) {
log.error("Cannot send e-mail: ", e);
result.setReturnCode(MailerResult.RECIPIENT_ADDRESS_ERROR);
return null;
}
}
use of org.olat.core.util.mail.model.DBMailRecipient in project openolat by klemens.
the class MailManagerImpl method appendRecipients.
private void appendRecipients(DBMailImpl mail, List<ContactList> ccLists, List<Address> toAddress, List<Address> ccAddress, boolean visible, boolean makeRealMail, MailerResult result) throws AddressException {
// append cc/bcc recipients
if (ccLists != null && !ccLists.isEmpty()) {
for (ContactList contactList : ccLists) {
if (makeRealMail && StringHelper.containsNonWhitespace(contactList.getName())) {
Address[] groupAddress = InternetAddress.parse(contactList.getRFC2822Name() + ";");
if (groupAddress != null && groupAddress.length > 0) {
for (Address groupAdd : groupAddress) {
toAddress.add(groupAdd);
}
}
}
for (String email : contactList.getStringEmails().values()) {
DBMailRecipient recipient = new DBMailRecipient();
recipient.setEmailAddress(email);
recipient.setGroup(contactList.getName());
recipient.setVisible(visible);
recipient.setDeleted(Boolean.FALSE);
recipient.setMarked(Boolean.FALSE);
recipient.setRead(Boolean.FALSE);
mail.getRecipients().add(recipient);
if (makeRealMail) {
createAddress(ccAddress, recipient, false, result, false);
}
}
for (Identity identityEmail : contactList.getIdentiEmails().values()) {
DBMailRecipient recipient = new DBMailRecipient();
if (identityEmail instanceof IdentityImpl) {
recipient.setRecipient(identityEmail);
} else {
recipient.setEmailAddress(identityEmail.getUser().getProperty(UserConstants.EMAIL, null));
}
recipient.setGroup(contactList.getName());
recipient.setVisible(visible);
recipient.setDeleted(Boolean.FALSE);
recipient.setMarked(Boolean.FALSE);
recipient.setRead(Boolean.FALSE);
mail.getRecipients().add(recipient);
if (makeRealMail) {
createAddress(ccAddress, recipient, false, result, false);
}
}
}
}
}
use of org.olat.core.util.mail.model.DBMailRecipient in project openolat by klemens.
the class MailListController method event.
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if (source == tableCtr) {
if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) {
TableEvent te = (TableEvent) event;
String actionid = te.getActionId();
int rowid = te.getRowId();
DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(rowid);
if (CMD_READ.equals(actionid)) {
if (outbox && StringHelper.containsNonWhitespace(mail.getMetaId()) && !mail.getMetaId().equals(metaId)) {
selectMetaMail(ureq, mail.getMetaId());
} else {
selectMail(ureq, mail.getKey());
}
} else if (CMD_PROFILE.equals(actionid)) {
DBMailRecipient from = mail.getFrom();
if (from != null && from.getRecipient() != null) {
contextResolver.open(ureq, getWindowControl(), "[Identity:" + from.getRecipient().getKey() + "]");
}
} else if (CMD_MARK_TOGGLE.equals(actionid)) {
mail = mailManager.toggleMarked(mail, getIdentity());
replaceInModel(mail);
} else if (CMD_READ_TOGGLE.equals(actionid)) {
mail = mailManager.toggleRead(mail, getIdentity());
replaceInModel(mail);
}
} else if (event.getCommand().equals(Table.COMMAND_MULTISELECT)) {
// Multiselect events
TableMultiSelectEvent tmse = (TableMultiSelectEvent) event;
BitSet selectedMails = tmse.getSelection();
if (selectedMails.isEmpty()) {
tableVC.setDirty(true);
showWarning("mail.action.emtpy");
return;
}
String actionid = tmse.getAction();
if (CMD_DELETE.equals(actionid)) {
String title = translate("mail.confirm.delete.title");
int selected = selectedMails.cardinality();
String text;
if (selected == 1) {
text = translate("mail.confirm.delete.single.text");
} else {
text = translate("mail.confirm.delete.multi.text", selected + "");
}
deleteConfirmationBox = activateYesNoDialog(ureq, title, text, deleteConfirmationBox);
deleteConfirmationBox.setUserObject(selectedMails);
} else if (CMD_SEND_REAL_MAIL.equals(actionid)) {
for (int i = selectedMails.nextSetBit(0); i >= 0; i = selectedMails.nextSetBit(i + 1)) {
DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(i);
MailerResult result = forwardToMyRealMail(mail);
if (result.getReturnCode() != MailerResult.OK) {
MailHelper.printErrorsAndWarnings(result, getWindowControl(), ureq.getUserSession().getRoles().isOLATAdmin(), getLocale());
} else {
showInfo("mail.action.send.real.success", mail.getSubject());
}
}
reloadModel();
} else if (CMD_MARK_MARKED.equals(actionid) || CMD_MARK_UNMARKED.equals(actionid)) {
for (int i = selectedMails.nextSetBit(0); i >= 0; i = selectedMails.nextSetBit(i + 1)) {
DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(i);
mailManager.setMarked(mail, CMD_MARK_MARKED.equals(actionid), getIdentity());
}
reloadModel();
} else if (CMD_MARK_READ.equals(actionid) || CMD_MARK_UNREAD.equals(actionid)) {
for (int i = selectedMails.nextSetBit(0); i >= 0; i = selectedMails.nextSetBit(i + 1)) {
DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(i);
mailManager.setRead(mail, CMD_MARK_READ.equals(actionid), getIdentity());
}
reloadModel();
}
} else if (TableController.EVENT_FILTER_SELECTED == event) {
MailDataModel dataModel = (MailDataModel) tableCtr.getTableDataModel();
MailContextShortName filter = (MailContextShortName) tableCtr.getActiveFilter();
dataModel.filter(filter);
tableCtr.setTableDataModel(dataModel);
} else if (TableController.EVENT_NOFILTER_SELECTED == event) {
MailDataModel dataModel = (MailDataModel) tableCtr.getTableDataModel();
dataModel.filter(null);
tableCtr.setTableDataModel(dataModel);
}
} else if (source == mailCtr) {
backFromMail();
} else if (source == metaMailCtr) {
removeAsListenerAndDispose(metaMailCtr);
metaMailCtr = null;
mainVC.put(MAIN_CMP, tableVC);
} else if (source == deleteConfirmationBox) {
if (DialogBoxUIFactory.isYesEvent(event)) {
BitSet deleteMails = (BitSet) deleteConfirmationBox.getUserObject();
for (int i = deleteMails.nextSetBit(0); i >= 0; i = deleteMails.nextSetBit(i + 1)) {
DBMailLight mail = (DBMailLight) tableCtr.getTableDataModel().getObject(i);
// reload the message
mail = mailManager.getMessageByKey(mail.getKey());
boolean deleteMetaMail = outbox && !StringHelper.containsNonWhitespace(metaId);
mailManager.delete(mail, getIdentity(), deleteMetaMail);
// Do not remove from model to prevent concurrent modification
// exception, instead just reload model afterwards
}
reloadModel();
}
} else {
super.event(ureq, source, event);
}
}
Aggregations