From: adam Date: Fri, 7 May 2004 23:19:36 +0000 (+0000) Subject: outgoing smtp X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=4a84e96e64310fdfd9d24c691d12586b758a31de;p=org.ibex.mail.git outgoing smtp darcs-hash:20040507231936-5007d-c25d4976a117dc406469b4e4b91ed5b42c3edc3d.gz --- diff --git a/mail.jar b/mail.jar new file mode 100644 index 0000000..e5ad502 Binary files /dev/null and b/mail.jar differ diff --git a/src/org/ibex/mail/filter/Filter.java b/src/org/ibex/mail/Filter.java similarity index 76% rename from src/org/ibex/mail/filter/Filter.java rename to src/org/ibex/mail/Filter.java index ed6aaa0..1b8364b 100644 --- a/src/org/ibex/mail/filter/Filter.java +++ b/src/org/ibex/mail/Filter.java @@ -1,5 +1,4 @@ -package org.ibex.mail.filter; -import org.ibex.mail.*; +package org.ibex.mail; /** generic superclass for processing elements that recieve a message and "usually" pass it on */ public class Filter { public Message process(Message m) { return null; } diff --git a/src/org/ibex/mail/Message.java b/src/org/ibex/mail/Message.java index 8303ea8..35840bf 100644 --- a/src/org/ibex/mail/Message.java +++ b/src/org/ibex/mail/Message.java @@ -7,13 +7,8 @@ import java.util.*; import java.net.*; import java.io.*; -// NOTE: always use Win32 line endings -// hard line limit: 998 chars -// soft line limit (suggested): 78 chars -// header fields: ascii 33-126 (but no colon) -// field body: anything ASCII except CRLF +// soft line limit (suggested): 78 chars / hard line limit: 998 chars // folded headers: can insert CRLF anywhere that whitespace appears (before the whitespace) -// body needs CRLF; one or the other alone is not acceptable // date/time parsing: see 3.3 // FEATURE: MIME RFC2045, 2046, 2049 @@ -42,6 +37,8 @@ public class Message extends JSReflection { public final Address envelopeFrom; public final Address[] envelopeTo; + public Date arrival = null; // when the message first arrived at this machine + public void dump(OutputStream os) throws IOException { Writer w = new OutputStreamWriter(os); w.write(allHeaders); @@ -124,6 +121,9 @@ public class Message extends JSReflection { } if (s.indexOf(':') == -1) throw new Malformed("Header line does not contain colon: " + s); key = s.substring(0, s.indexOf(':')); + for(int i=0; i 126) + throw new Malformed("Header key contains invalid character \"" + s.charAt(i) + "\""); String val = s.substring(0, s.indexOf(':') + 1); while(Character.isSpace(val.charAt(0))) val = val.substring(1); @@ -167,4 +167,18 @@ public class Message extends JSReflection { } private static final Random random = new Random(); + + public String summary() { + return + " Subject: " + m.subject + "\n" + + " EnvelopeFrom: " + m.envelopeFrom + "\n" + + " EnvelopeTo: " + m.envelopeTo + "\n" + + " MessageId: " + m.messageid; + } + + public Message bounce(String reason) { + // use null-sender for error messages (don't send errors to the null addr) + // FIXME + return null; + } } diff --git a/src/org/ibex/mail/target/Target.java b/src/org/ibex/mail/Target.java similarity index 82% rename from src/org/ibex/mail/target/Target.java rename to src/org/ibex/mail/Target.java index b4425a9..0fea645 100644 --- a/src/org/ibex/mail/target/Target.java +++ b/src/org/ibex/mail/Target.java @@ -1,5 +1,4 @@ -package org.ibex.mail.target; -import org.ibex.mail.*; +package org.ibex.mail; import java.io.*; import org.ibex.js.*; diff --git a/src/org/ibex/mail/protocol/Incoming.java b/src/org/ibex/mail/protocol/Incoming.java index d46a75e..2fb68eb 100644 --- a/src/org/ibex/mail/protocol/Incoming.java +++ b/src/org/ibex/mail/protocol/Incoming.java @@ -1,12 +1,11 @@ package org.ibex.mail.protocol; import org.ibex.mail.*; -import org.ibex.mail.store.*; import org.ibex.mail.target.*; import java.io.*; public class Incoming { protected void accept(Message m) throws IOException, MailException { - MessageStore.transcript.add(m); // currently, we write all inbound messages to the transcript + FileSystem.transcript.add(m); // currently, we write all inbound messages to the transcript Target.root.accept(m); } } diff --git a/src/org/ibex/mail/protocol/SMTP.java b/src/org/ibex/mail/protocol/SMTP.java index ff1a5d7..f996c09 100644 --- a/src/org/ibex/mail/protocol/SMTP.java +++ b/src/org/ibex/mail/protocol/SMTP.java @@ -1,15 +1,17 @@ package org.ibex.mail.protocol; import org.ibex.mail.*; -import org.ibex.mail.store.*; import org.ibex.mail.target.*; import org.ibex.util.*; import java.net.*; import java.io.*; import java.util.*; import java.text.*; +import javax.naming.*; +import javax.naming.directory.*; public class SMTP extends MessageProtocol { + static { new Thread() { public void run() { Outgoing.runq(); } }.start(); } public static String convdir = null; public static void main(String[] s) throws Exception { String logto = System.getProperty("ibex.mail.root", File.separatorChar + "var" + File.separatorChar + "org.ibex.mail"); @@ -34,29 +36,92 @@ public class SMTP extends MessageProtocol { public void handle(Socket s) { new Listener(s, "megacz.com").handleRequest(); } + // FEATURE: exponential backoff on retry time? public static class Outgoing { - // recommended retry interval is 30 minutes - // give up after 4-5 days - // should keep per-host success/failure so we don't retry on every message - // exponential backoff on retry time? - // check DNS resolvability as soon as domain is provided - // only use implicit A-record if there are no MX-records - // use null-sender for error messages (don't send errors to the null addr) - // to prevent mail loops, drop messages with >100 Recieved headers - private final org.ibex.util.Queue queue = new org.ibex.util.Queue(100); - public static void send(Message m) { } - public static void enqueue(Message m) { } - public static void bounce(Message m, String reason) { } - private void runq() { - /* - MessageStore store = MessageStore.root.slash("smtp").slash("outgoing"); + private static final HashSet deadHosts = new HashSet(); + private static final org.ibex.util.Queue queue = new org.ibex.util.Queue(100); + private static FileSystem store = FileSystem.root.slash("outgoing"); + + public static void send(Message m) { + if (m.traces.length >= 100) { + Log.warn("Message with " + m.traces.length + " trace hops; silently dropping\n" + m.summary()); + return; + } + synchronized(Outgoing.class) { + store.add(m); + queue.append(m); + Outgoing.class.notify(); + } + } + + private static boolean attempt(Message m) { + InetAddress[] mx = getMailExchangerIPs(m.envelopeTo.host); + if (mx.length == 0) { + Log.warn("could not resolve " + m.envelopeTo.host + "; bouncing it\n" + m.summary()); + send(m.bounce("could not resolve " + m.envelopeTo.host)); + return true; + } + if (new Date().getTime() - m.arrival.getTime() > 1000 * 60 * 60 * 24 * 5) { + Log.warn("could not send message after 5 days; bouncing it\n" + m.summary()); + send(m.bounce("could not send for 5 days")); + return true; + } + for(int i=0; i + - Original Architect + - Ibex Engine + - Most of the widget set + +[david] David Crawshaw + - Widget Czar + - Fixes to slider.ibex + +[corey] Corey Jewett + - Patch to make build.xml not depend on task + +[ejones] Evan Jones + - Google demo + - Dynamic Trees + diff --git a/upstream/org.ibex.core/CHANGES b/upstream/org.ibex.core/CHANGES new file mode 100644 index 0000000..c40c796 --- /dev/null +++ b/upstream/org.ibex.core/CHANGES @@ -0,0 +1,1066 @@ + +== 2002 ================================================================= + +10-Apr megacz Box.java, Surface.java: fixed rendering glitch caused by + lastDirtiedTimeStamp hack. + +10-Apr megacz org/xwt/html/p.xwt: Improved flow performance. + +10-Apr megacz org/xwt/Box.java: fixed a bug that prevented regions from being + dirtied properly when boxes are removed from the tree and then + re-added. + +10-Apr megacz org/xwt/Box.java, org/xwt/SpecialBoxProperties.java: + hshrink/vshrink are no longer implemented by + manipulating dmax; the prerender pass understands them + natively. + +11-Apr megacz org/xwt/server/HTTP.java: fixed some CDATA misbehaviors. + +11-Apr megacz org/xwt/html/p.xwt, org/xwt/html/test.xwt: improved HTML + rendering; we can now render pretty much any

tag + +13-Apr megacz README: updated to note that build process requires + libgcj.jar even for jvm builds. + +21-Apr megacz src/org/xwt/plat/GCJ.xml: removed -fno-rtti + +21-Apr megacz src/org/xwt/Surface.java: workaround for GCJ PR java/6393 + +22-Apr megacz src/org/xwt/plat/Java2.java: fixed bug that caused + RasterFormatException on jdk1.4 + +22-Apr megacz README: included instructions on how to build without gcc. + +26-Apr megacz src/org/xwt/Main.java: included text description on splash screen + +26-Apr megacz src/org/xwt/plat/Win32.xml, src/org/xwt/plat/Java2.xml: + adjusted dist / signature process. + +26-Apr megacz README: included printStackTrace() patch + +26-Apr megacz src/org/xwt/XWT.java: fixed bug 53 + +26-Apr megacz src/org/xwt/TinySSL.java: fixed PKCS1 bug + +26-Apr megacz build.xml: staging/production push process + +26-Apr megacz src/org/xwt/tasks/BashTask.java: now checks exit codes + +26-Apr megacz src/org/xwt/tasks/BashTask.java: added ssh support + +27-Apr megacz README: added file locking patch + +27-Apr megacz [lots of files]: introduced notion of buildid's, to make + XWT upgrades work more smoothly, and to prevent problems + with browser/plugin caches. + +27-Apr megacz JSObject.java: added extra debugging info + +27-Apr megacz XWT.java, Platform.java, Main.java, Java2.java, + Win32.java, Win32.cc, faq.html: added support for + xwt.newBrowserWindow() + +27-Apr megacz Surface.java, Box.java: nuked dirtiedTimeStamp + altogether; it caused more problems than it solved. + +27-Apr megacz reference.html: Changed capitalization of + faultstring/faultcode for xwt.soap() to match SOAP spec. + +27-Apr megacz XWT.java, Box.java: fixed ConversionError bug + +27-Apr megacz Platform.java: added a 3-pixel minimum for a font's + descent -- ensures that we have space for underlining. + +28-Apr megacz Template.java: fixed a bug where would + misbehave if used on a scriptless