X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FMessage.java;h=b4db07e5dbcabb933edebf738f825df52ba3c474;hb=73aabb0888eea91734fc408f8fbaf1e88a52fe13;hp=6d160d52684562f3b54e7c65144e8960b79428f4;hpb=18304db7ddfb63f25cd83ee06781d924f7a6b496;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/Message.java b/src/org/ibex/mail/Message.java index 6d160d5..b4db07e 100644 --- a/src/org/ibex/mail/Message.java +++ b/src/org/ibex/mail/Message.java @@ -13,13 +13,11 @@ import java.util.*; import java.net.*; import java.io.*; -// FIXME: this is important: folded headers: can insert CRLF anywhere that whitespace appears (before the whitespace) // FIXME: messages must NEVER contain 8-bit binary data; this is a violation of IMAP // FIXME: RFC822 1,000-char limit per line [soft line limit (suggested): 78 chars / hard line limit: 998 chars] // FEATURE: PGP-signature-parsing -// FEATURE: mailing list header parsing -// FEATURE: delivery status notification (and the sneaky variety) +// FEATURE: mailing list header parsing (?) // FEATURE: threading as in http://www.jwz.org/doc/threading.html /** @@ -45,7 +43,28 @@ public class Message extends MIME.Part { public static Message newMessage(Fountain in) throws Malformed { return new Message(in); } + public Message reply(Fountain in, Address from, boolean includeReInSubject) throws Malformed { + /* + Address to = null; + if (to==null) to = Address.parse(headers.get("reply-to")); + if (to==null) to = Address.parse(headers.get("from")); + if (to==null) to = envelopeFrom; + Message ret = newMessage(in, from, to); + ret.headers.put("In-Reply-To", messageid); + String references = headers.get("references"); + ret.headers.put("References", messageid + (references==null?"":(" "+references))); + if (includeReInSubject && subject!=null && !subject.toLowerCase().trim().startsWith("re:")) + headers.put("subject", "Re: "+subject); + return ret; + */ + // FIXME + return null; + } + // FIXME + //public static Message newMessage(Headers headers, Fountain body, Address from, Address to) throws Malformed { + //} + public static Message newMessage(Fountain in, Address from, Address to) throws Malformed { StringBuffer sb = new StringBuffer(); if (from != null) sb.append("Return-Path: " + from.toString(true) + "\r\n"); @@ -81,9 +100,36 @@ public class Message extends MIME.Part { this.cc = Address.list(headers.get("Cc")); this.bcc = Address.list(headers.get("Bcc")); this.date = parseDate(headers.get("Date")) == null ? new Date() : parseDate(headers.get("Date")); + + if (this.messageid==null) + throw new RuntimeException("every RFC2822 message must have a Message-ID: header"); + + /* + // synthesize a message-id if not provided + this.messageid = headers.get("Message-Id") == null ? generateFreshMessageId(sha1(in.getStream())) : headers.get("Message-Id"); + if (headers.get("Message-Id") == null) { + headers = headers.set("Message-Id", this.messageid); + Log.warn(Message.class, "synthesizing message-id for " + summary()); + } + */ + this.arrival = this.date; // FIXME wrong; grab this from traces? } + /* + private static String sha1(Stream stream) { + SHA1 sha1 = new SHA1(); + byte[] b = new byte[1024]; + while(true) { + int numread = stream.read(b, 0, b.length); + if (numread == -1) break; + sha1.update(b, 0, numread); + } + byte[] results = new byte[sha1.getDigestSize()]; + sha1.doFinal(results, 0); + return new String(Encode.toBase64(results)); + } + */ // Helpers ///////////////////////////////////////////////////////////////////////////// @@ -111,12 +157,15 @@ public class Message extends MIME.Part { public Message bounce(String reason) { if (envelopeFrom==null || envelopeFrom.toString().equals("")) return null; - Headers h = new Headers(headers.getStream()); - h.put("Envelope-To", envelopeFrom.toString()); - h.put("Return-Path", "<>"); - h.put("From", "MAILER-DAEMON <>"); - h.put("To", envelopeFrom.toString()); - h.put("Subject", "failure notice"); + Log.warn(Message.class, "bouncing message due to: " + reason); + Headers h = new Headers.Original(headers.getStream()); + h = h.set(new String[] { + "Envelope-To", envelopeFrom.toString(), + "Return-Path", "<>", + "From", "MAILER-DAEMON <>", + "To", envelopeFrom.toString(), + "Subject", "failure notice" + }); String error = "Hi. This is the Ibex Mail Server. I'm afraid I wasn't able to deliver\r\n"+ @@ -138,8 +187,8 @@ public class Message extends MIME.Part { } } - public String toString() { throw new RuntimeException("Message.toString() called"); } - public String summary() { return "[" + envelopeFrom + " -> " + envelopeTo + "] " + subject; } + public String toString() { throw new RuntimeException("Message.toString() called"); } + public final String summary() { return "[" + envelopeFrom + " -> " + envelopeTo + "] " + subject; } public static class Malformed extends MailException { public Malformed(String s) { super(s); } } }