package fi.otavanopisto.muikku.plugins.mail.jndi;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Asynchronous;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.naming.InitialContext;
import fi.otavanopisto.muikku.mail.MailAttachment;
import fi.otavanopisto.muikku.mail.MailType;
@Singleton
public class JndiMailService {
@Inject
private Logger logger;
@Asynchronous
@Lock (LockType.READ)
public void onMailEvent(@Observes JndiMailEvent event) {
try {
MailType mimeType = event.getMimeType();
String from = event.getFrom();
List<String> to = event.getTo();
List<String> cc = event.getCc();
List<String> bcc = event.getBcc();
String subject = event.getSubject();
String content = event.getContent();
List<MailAttachment> attachments = event.getAttachments();
Properties props = new Properties();
InitialContext initialContext = new InitialContext(props);
Session mailSession = (Session) initialContext.lookup("java:/mail/muikku");
MimeMessage message = new MimeMessage(mailSession);
// Recipients
if (!to.isEmpty()) {
message.setRecipients(Message.RecipientType.TO, parseToAddressArray(to));
}
if (!cc.isEmpty()) {
message.setRecipients(Message.RecipientType.CC, parseToAddressArray(cc));
}
if (!bcc.isEmpty()) {
message.setRecipients(Message.RecipientType.BCC, parseToAddressArray(bcc));
}
// Sender
if (from != null) {
InternetAddress fromAddress = new InternetAddress(from);
message.setFrom(fromAddress);
message.setReplyTo(new InternetAddress[] { fromAddress });
}
// Content
if (subject != null) {
message.setSubject(subject);
}
message.setSentDate(new Date());
// Attachments
if (!attachments.isEmpty()) {
Multipart multipart = new MimeMultipart();
if (content != null) {
MimeBodyPart contentBodyPart = new MimeBodyPart();
contentBodyPart.setContent(content, mimeType.toString());
multipart.addBodyPart(contentBodyPart);
}
for (MailAttachment attachment : attachments) {
MimeBodyPart attachmentBodyPart = new MimeBodyPart();
attachmentBodyPart.setContent(attachment.getContent(), attachment.getMimeType());
attachmentBodyPart.setFileName(attachment.getFileName());
multipart.addBodyPart(attachmentBodyPart);
}
message.setContent(multipart);
} else {
if (content != null) {
message.setContent(content, mimeType.toString());
}
}
// Sending
Transport.send(message);
} catch (Exception e) {
logger.log(Level.SEVERE, "Error sending mail", e);
}
}
private Address[] parseToAddressArray(List<String> list) throws AddressException {
Address[] addresses = new Address[list.size()];
for (int i = 0; i < list.size(); i++) {
addresses[i] = new InternetAddress(list.get(i));
}
return addresses;
}
}