package com.brightgenerous.mail.delegate;
import static com.brightgenerous.commons.ObjectUtils.*;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.brightgenerous.lang.Args;
import com.brightgenerous.mail.MailException;
import com.brightgenerous.mail.MailInfo;
class MailDelegaterImpl implements MailDelegater {
{
check();
}
private static void check() {
try {
Class.forName(Message.class.getName());
Class.forName(MessagingException.class.getName());
Class.forName(Session.class.getName());
Class.forName(Transport.class.getName());
Class.forName(AddressException.class.getName());
Class.forName(InternetAddress.class.getName());
Class.forName(MimeMessage.class.getName());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
@Override
public void send(Properties prop, MailInfo info) throws MailException {
Args.notNull(prop, "prop");
Args.notNull(info, "info");
MimeMessage message = new MimeMessage(Session.getDefaultInstance(prop));
try {
{
InternetAddress[] addrs = getInternetAddress(info.getTos());
if (isNotNoSize(addrs)) {
message.setRecipients(Message.RecipientType.TO, addrs);
}
}
{
InternetAddress[] addrs = getInternetAddress(info.getCcs());
if (isNotNoSize(addrs)) {
message.setRecipients(Message.RecipientType.CC, addrs);
}
}
{
InternetAddress[] addrs = getInternetAddress(info.getBccs());
if (isNotNoSize(addrs)) {
message.setRecipients(Message.RecipientType.BCC, addrs);
}
}
{
InternetAddress[] addrs = getInternetAddress(info.getReplyTos());
if (isNotNoSize(addrs)) {
message.setReplyTo(addrs);
}
}
{
Date sentDate = info.getSentDate();
if (sentDate != null) {
message.setSentDate(sentDate);
}
}
{
String fromAddress = info.getFromAddress();
if (fromAddress != null) {
String fromPersonal = info.getFromPersonal();
if (fromPersonal != null) {
message.setFrom(new InternetAddress(fromAddress, fromPersonal));
} else {
message.setFrom(new InternetAddress(fromAddress));
}
}
}
{
String senderAddress = info.getSenderAddress();
if (senderAddress != null) {
String senderPersonal = info.getSenderPersonal();
if (senderPersonal != null) {
message.setSender(new InternetAddress(senderAddress, senderPersonal));
} else {
message.setSender(new InternetAddress(senderAddress));
}
}
}
{
String subjectText = info.getSubjectText();
if (subjectText != null) {
String subjectEncode = info.getSubjectEncode();
if (subjectEncode != null) {
message.setSubject(subjectText, subjectEncode);
} else {
message.setSubject(subjectText);
}
}
}
{
String bodyText = info.getBodyText();
if (bodyText != null) {
String bodyEncode = info.getBodyEncode();
if (bodyEncode != null) {
message.setText(bodyText, bodyEncode);
} else {
message.setText(bodyText);
}
}
}
Transport.send(message);
} catch (UnsupportedEncodingException | MessagingException e) {
throw new MailException(e);
}
}
private static final InternetAddress[] EMPTY_ADDRESSES = new InternetAddress[0];
private static InternetAddress[] getInternetAddress(Set<String> addrs) throws AddressException {
if (addrs == null) {
return null;
}
if (addrs.isEmpty()) {
return EMPTY_ADDRESSES;
}
List<InternetAddress> ret = new ArrayList<>();
for (String addr : addrs) {
if (addr != null) {
ret.add(new InternetAddress(addr));
}
}
if (ret.isEmpty()) {
return EMPTY_ADDRESSES;
}
return ret.toArray(new InternetAddress[ret.size()]);
}
}