package railo.runtime.spooler.mail;
import javax.mail.internet.InternetAddress;
import railo.commons.lang.StringUtil;
import railo.runtime.config.Config;
import railo.runtime.config.ConfigWeb;
import railo.runtime.exp.PageException;
import railo.runtime.net.mail.MailException;
import railo.runtime.net.smtp.SMTPClient;
import railo.runtime.op.Caster;
import railo.runtime.spooler.ExecutionPlan;
import railo.runtime.spooler.ExecutionPlanImpl;
import railo.runtime.spooler.SpoolerTaskSupport;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.util.ArrayUtil;
public class MailSpoolerTask extends SpoolerTaskSupport {
private static final ExecutionPlan[] EXECUTION_PLANS = new ExecutionPlan[]{
new ExecutionPlanImpl(1,60),
new ExecutionPlanImpl(1,5*60),
new ExecutionPlanImpl(1,3600),
new ExecutionPlanImpl(2,24*3600),
};
private SMTPClient client;
public MailSpoolerTask(ExecutionPlan[] plans,SMTPClient client) {
super(plans);
this.client=client;
}
public MailSpoolerTask(SMTPClient client) {
this(EXECUTION_PLANS,client);
}
@Override
public String getType() {
return "mail";
}
public String subject() {
return client.getSubject();
}
public Struct detail() {
StructImpl sct = new StructImpl();
sct.setEL("subject", client.getSubject());
if(client.hasHTMLText())sct.setEL("body", StringUtil.max(client.getHTMLTextAsString(),1024,"..."));
else if(client.hasPlainText())sct.setEL("body", StringUtil.max(client.getPlainTextAsString(),1024,"..."));
sct.setEL("from", toString(client.getFrom()));
InternetAddress[] adresses = client.getTos();
sct.setEL("to", toString(adresses));
adresses = client.getCcs();
if(!ArrayUtil.isEmpty(adresses))sct.setEL("cc", toString(adresses));
adresses = client.getBccs();
if(!ArrayUtil.isEmpty(adresses))sct.setEL("bcc", toString(adresses));
return sct;
}
private static String toString(InternetAddress[] adresses) {
if(adresses==null) return "";
StringBuffer sb=new StringBuffer();
for(int i=0;i<adresses.length;i++) {
if(i>0)sb.append(", ");
sb.append(toString(adresses[i]));
}
return sb.toString();
}
private static String toString(InternetAddress address) {
if(address==null) return "";
String addr = address.getAddress();
String per = address.getPersonal();
if(StringUtil.isEmpty(per)) return addr;
if(StringUtil.isEmpty(addr)) return per;
return per+" ("+addr+")";
}
public Object execute(Config config) throws PageException {
try {
client._send((ConfigWeb)config);
}
catch (MailException e) {
throw Caster.toPageException(e);
}
return null;
}
}