package org.akaza.openclinica.core;
import org.akaza.openclinica.exception.OpenClinicaSystemException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import java.util.ArrayList;
import java.util.Date;
import java.util.StringTokenizer;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class OpenClinicaMailSender {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
JavaMailSenderImpl mailSender;
public void sendEmail(String to, String subject, String body, Boolean htmlEmail) throws OpenClinicaSystemException {
sendEmail(to, EmailEngine.getAdminEmail(), subject, body, htmlEmail);
}
public void sendEmail(String to, String from, String subject, String body, Boolean htmlEmail) throws OpenClinicaSystemException {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, htmlEmail);
helper.setFrom(from);
helper.setTo(processMultipleImailAddresses(to.trim()));
helper.setSubject(subject);
helper.setText(body, true);
mailSender.send(mimeMessage);
logger.debug("Email sent successfully on {}", new Date());
} catch (MailException me) {
logger.debug("Email could not be sent on {} due to: {}", new Date(), me.toString());
throw new OpenClinicaSystemException(me.getMessage());
} catch (MessagingException e) {
logger.debug("Email could not be sent on {} due to: {}", new Date(), e.toString());
throw new OpenClinicaSystemException(e.getMessage());
}
}
private InternetAddress[] processMultipleImailAddresses(String to) throws MessagingException {
ArrayList<String> recipientsArray = new ArrayList<String>();
StringTokenizer st = new StringTokenizer(to, ",");
while (st.hasMoreTokens()) {
recipientsArray.add(st.nextToken());
}
int sizeTo = recipientsArray.size();
InternetAddress[] addressTo = new InternetAddress[sizeTo];
for (int i = 0; i < sizeTo; i++) {
addressTo[i] = new InternetAddress(recipientsArray.get(i).toString());
}
return addressTo;
}
public JavaMailSenderImpl getMailSender() {
return mailSender;
}
public void setMailSender(JavaMailSenderImpl mailSender) {
this.mailSender = mailSender;
}
}