X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2Ftarget%2FScript.java;h=d4933844ae12001efb9a68f445e2b46f3795298a;hb=ef94867a5697c21afd0e77899f5f075adc86e58d;hp=3a87567780b884047986bb4613033478333a1c52;hpb=b2202154c137b4d3d28dcf36a5a7f529bafc82f3;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/target/Script.java b/src/org/ibex/mail/target/Script.java index 3a87567..d493384 100644 --- a/src/org/ibex/mail/target/Script.java +++ b/src/org/ibex/mail/target/Script.java @@ -11,7 +11,7 @@ import org.ibex.mail.target.*; import java.io.*; import java.util.*; -public class Script extends Target { +public class Script extends JS.Obj implements Target { private static final JS.Method METHOD = new JS.Method(); @@ -62,6 +62,7 @@ public class Script extends Target { Object ret = js.call(null, new JS[] { m }); Log.debug(this, "configuration script returned " + ret); if (ret == null) throw new IOException("configuration script returned null"); + while (ret instanceof JSReflection.Wrapper) ret = ((JSReflection.Wrapper)ret).unwrap(); if (ret instanceof Target) ((Target)ret).accept(m); //else if (ret instanceof Filter) ((Filter)ret).process(m); else throw new IOException("configuration script returned a " + ret.getClass().getName()); @@ -111,10 +112,17 @@ public class Script extends Target { case "log.warn": return METHOD; case "log.error": return METHOD; case "list": return getSub("list"); + case "url": return getSub("url"); + case "url.encode": return METHOD; case "mail": return getSub("mail"); case "mail.forward": return METHOD; case "mail.forward2": return METHOD; case "mail.send": return METHOD; + case "mail.attempt": return METHOD; + case "mail.later": return Later.instance; + case "mail.drop": return Drop.instance; + case "mail.bounce": return METHOD; + case "mail.error": return METHOD; case "mail.my": return getSub("mail.my"); case "mail.my.prefs": try { return new org.ibex.js.Directory(new File("/etc/org.ibex.mail.prefs")); @@ -122,8 +130,8 @@ public class Script extends Target { case "mail.my.mailbox": FileBasedMailbox root = FileBasedMailbox.getFileBasedMailbox(Mailbox.STORAGE_ROOT, true); return root.slash("user", true).slash("megacz", true).slash("newmail", true); + case "mail.list": return METHOD; //#end - if (JSU.toString(name).startsWith("list.")) { return MailingList.getList(JSU.toString(name).substring(5)); } return super.get(name); } @@ -134,8 +142,11 @@ public class Script extends Target { final int nargs = args.length; String name = JSU.toString(name0); try { + if (name.equals("url.encode")) return JSU.S(java.net.URLEncoder.encode(JSU.toString(args[0]))); + if (name.equals("mail.list")) return JSReflection.wrap(MailingList.getMailingList(JSU.toString(args[0]))); if (name.equals("date")) { return new JSDate(args); } - if (name.equals("mail.send") || name.equals("send")) { + if (name.equals("mail.send") || name.equals("send") || name.equals("mail.attempt") || name.equals("attempt")) { + boolean attempt = name.equals("mail.attempt") || name.equals("attempt"); JS m = (JS)a; StringBuffer headers = new StringBuffer(); String body = ""; @@ -153,17 +164,41 @@ public class Script extends Target { } if (envelopeTo == null) envelopeTo = to; if (envelopeFrom == null) envelopeFrom = from; - Message message = Message.newMessage(new org.ibex.io.Stream(headers.toString() + "\r\n" + body), - envelopeFrom, - envelopeTo); - //org.ibex.mail.protocol.SMTP.Outgoing.accept(message); - boolean ok = org.ibex.mail.protocol.SMTP.Outgoing.attempt(message); - if (!ok) throw new JSExn("SMTP server rejected message"); - return JSU.T; + Message message = + Message.newMessage(new org.ibex.io.Fountain.StringFountain(headers.toString() + "\r\n" + body), + envelopeFrom, + envelopeTo + ); + + boolean ok = false; + try { + if (attempt) { + org.ibex.mail.protocol.SMTP.Outgoing.attempt(message); + } else { + org.ibex.mail.protocol.SMTP.Outgoing.accept(message); + } + ok = true; + } catch (Exception ex) { + if (!attempt) Log.warn(this, ex); + } + if (!ok && !attempt) throw new JSExn("SMTP server rejected message"); + return JSU.B(ok); + } + if (name.equals("mail.bounce")) { + return new JSTarget() { + public void accept(Message m) throws MailException { + try { + Message m2 = m.bounce(JSU.toString(a)); + org.ibex.mail.protocol.SMTP.Outgoing.accept(m2); + Log.error(this, "BOUNCING! " + m2.summary()); + } catch (Exception e) { + Log.warn(this, e); + } + } }; } if (name.equals("mail.forward2") || name.equals("forward2")) { try { - Message m2 = Message.newMessage(new org.ibex.io.Stream(m.toString()), + Message m2 = Message.newMessage(new org.ibex.io.Fountain.StringFountain(m.toString()), m.envelopeFrom, new Address(JSU.toString(a))); org.ibex.mail.protocol.SMTP.Outgoing.accept(m2); @@ -173,18 +208,13 @@ public class Script extends Target { } return null; } - if (name.equals("mail.forward") || name.equals("forward")) { return new Target() { - public void accept(Message m) throws MailException { - try { - Message m2 = Message.newMessage(new org.ibex.io.Stream(m.toString()), - m.envelopeFrom, - new Address(JSU.toString(a))); - org.ibex.mail.protocol.SMTP.Outgoing.accept(m2); - } catch (Exception e) { - throw new MailException(e.toString()); - } - } - }; } + if (name.equals("mail.forward") || name.equals("forward")) { + Message m2 = Message.newMessage(Script.this.m, Script.this.m.envelopeFrom, new Address(JSU.toString(a))); + org.ibex.mail.protocol.SMTP.Outgoing.attempt(m2); + return Drop.instance; + } + if (name.equals("mail.error")) + throw new MailException.Malformed(JSU.toString(a)); if (name.equals("log.debug") || name.equals("debug")) { JSU.debug(a== null ? "**null**" : JSU.toString(a)); return null; } if (name.equals("log.info") || name.equals("info")) { JSU.info(a== null ? "**null**" : JSU.toString(a)); return null; } if (name.equals("log.warn") || name.equals("warn")) { JSU.warn(a== null ? "**null**" : JSU.toString(a)); return null; } @@ -196,6 +226,7 @@ public class Script extends Target { case 2: if (name.equals("regexp")) {return new JSRegexp(a, b); } } + } catch (MailException e) { throw e; } catch (Exception e) { Log.warn(this, "ibex."+name+"() threw: " + e); Log.warn(this, e); @@ -236,4 +267,6 @@ public class Script extends Target { } }; } + + private static abstract class JSTarget extends JS.Obj implements Target { } }