001    package railo.runtime.spooler.mail;
002    
003    import javax.mail.internet.InternetAddress;
004    
005    import railo.commons.lang.StringUtil;
006    import railo.runtime.config.Config;
007    import railo.runtime.config.ConfigWeb;
008    import railo.runtime.exp.PageException;
009    import railo.runtime.net.mail.MailException;
010    import railo.runtime.net.smtp.SMTPClient;
011    import railo.runtime.op.Caster;
012    import railo.runtime.spooler.ExecutionPlan;
013    import railo.runtime.spooler.ExecutionPlanImpl;
014    import railo.runtime.spooler.SpoolerTaskSupport;
015    import railo.runtime.type.Struct;
016    import railo.runtime.type.StructImpl;
017    import railo.runtime.type.util.ArrayUtil;
018    
019    public class MailSpoolerTask extends SpoolerTaskSupport {
020            private static final ExecutionPlan[] EXECUTION_PLANS = new ExecutionPlan[]{
021                    new ExecutionPlanImpl(1,60),
022                    new ExecutionPlanImpl(1,5*60),
023                    new ExecutionPlanImpl(1,3600),
024                    new ExecutionPlanImpl(2,24*3600),
025            };
026            
027            
028            private SMTPClient client;
029    
030            public MailSpoolerTask(ExecutionPlan[] plans,SMTPClient client) {
031                    super(plans);
032                    this.client=client;
033            }
034            public MailSpoolerTask(SMTPClient client) {
035                    this(EXECUTION_PLANS,client);
036            }
037            
038    
039            @Override
040            public String getType() {
041                    return "mail";
042            }
043    
044            public String subject() {
045                    return client.getSubject();
046            }
047            
048            public Struct detail() {
049                    StructImpl sct = new StructImpl();
050                    sct.setEL("subject", client.getSubject());
051                    
052                    if(client.hasHTMLText())sct.setEL("body", StringUtil.max(client.getHTMLTextAsString(),1024,"..."));
053                    else if(client.hasPlainText())sct.setEL("body", StringUtil.max(client.getPlainTextAsString(),1024,"..."));
054                    
055                    sct.setEL("from", toString(client.getFrom()));
056                    
057                    InternetAddress[] adresses = client.getTos();
058                    sct.setEL("to", toString(adresses));
059    
060                    adresses = client.getCcs();
061                    if(!ArrayUtil.isEmpty(adresses))sct.setEL("cc", toString(adresses));
062    
063                    adresses = client.getBccs();
064                    if(!ArrayUtil.isEmpty(adresses))sct.setEL("bcc", toString(adresses));
065                    
066                    return sct;
067            }
068    
069            private static String toString(InternetAddress[] adresses) {
070                    if(adresses==null) return "";
071                    
072                    StringBuffer sb=new StringBuffer();
073                    for(int i=0;i<adresses.length;i++) {
074                            if(i>0)sb.append(", ");
075                            sb.append(toString(adresses[i]));
076                    }
077                    return sb.toString();
078            }
079            private static String toString(InternetAddress address) {
080                    if(address==null) return "";
081                    String addr = address.getAddress();
082                    String per = address.getPersonal();
083                    if(StringUtil.isEmpty(per)) return addr;
084                    if(StringUtil.isEmpty(addr)) return per;
085                    
086                    
087                    return per+" ("+addr+")";
088            }
089            public Object execute(Config config) throws PageException {
090                    try {
091                            client._send((ConfigWeb)config);
092                    } 
093                    catch (MailException e) {
094                            throw Caster.toPageException(e);
095                    }
096                    return null;
097            }
098    
099    }