X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FMessage.java;h=793a3b4731c53350b5561a885e7d7c9852866f73;hb=8bc0112af0cd8efc628e17d529d515ece107c968;hp=477d88c84541ec87b3b59a32ae35a8b978955b8b;hpb=76be0d989d6b938e9304416515dcf898ff581230;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/Message.java b/src/org/ibex/mail/Message.java index 477d88c..793a3b4 100644 --- a/src/org/ibex/mail/Message.java +++ b/src/org/ibex/mail/Message.java @@ -7,10 +7,14 @@ import java.util.*; import java.net.*; import java.io.*; -// soft line limit (suggested): 78 chars / hard line limit: 998 chars +// FIXME this is important // folded headers: can insert CRLF anywhere that whitespace appears (before the whitespace) + +// soft line limit (suggested): 78 chars / hard line limit: 998 chars // date/time parsing: see spec, 3.3 +// FIXME: messages must NEVER contain 8-bit binary data; this is a violation of IMAP + // FEATURE: PGP-signature-parsing // FEATURE: mailing list header parsing // FEATURE: delivery status notification (and the sneaky variety) @@ -25,14 +29,14 @@ import java.io.*; public class Message extends JSReflection { public final String allHeaders; // pristine headers - public final Hashtable headers; // hash of headers (not including resent's and traces) + public final CaseInsensitiveHash headers; // hash of headers (not including resent's and traces) public final String body; // entire body public final int lines; // lines in the body public final Date date; public final Address to; - public final Address from; // if multiple From entries, this is sender - public final Address replyto; // if none provided, this is equal to sender + public final Address from; // if multiple From entries, this is sender + public final Address replyto; // if none provided, this is equal to sender public final String subject; public final String messageid; public final Address[] cc; @@ -41,16 +45,15 @@ public class Message extends JSReflection { public final Trace[] traces; public final Address envelopeFrom; - public final Address[] envelopeTo; + public final Address envelopeTo; public final Date arrival; // when the message first arrived at this machine; IMAP "internal date message attr" - // FIXME: need to be able to read back in the EnvelopeFrom / EnvelopeTo fields public void dump(OutputStream os) throws IOException { Writer w = new OutputStreamWriter(os); + w.write("X-org.ibex.mail.headers.envelope.From: " + envelopeFrom + "\r\n"); + w.write("X-org.ibex.mail.headers.envelope.To: " + envelopeTo + "\r\n"); w.write(allHeaders); - w.write("X-IbexMail-EnvelopeFrom: " + envelopeFrom + "\r\n"); - w.write("X-IbexMail-EnvelopeTo: "); for(int i=0; i 126) throw new Malformed("Header key \""+key+"\" contains invalid character \"" + key.charAt(i) + "\""); String val = s.substring(s.indexOf(':') + 1).trim(); - while(Character.isSpace(val.charAt(0))) val = val.substring(1); + while(val.length() > 0 && Character.isSpace(val.charAt(0))) val = val.substring(1); if (key.startsWith("Resent-")) { if (key.startsWith("Resent-From")) resent.addElement(new Hashtable()); ((Hashtable)resent.lastElement()).put(key.substring(7), val); - } else if (key.startsWith("Return-Path:")) { + } else if (key.startsWith("Return-Path")) { rs.pushback(s); traces.addElement(new Trace(rs)); + } else if (key.equals("X-org.ibex.mail.headers.envelope.From")) { + if (envelopeFrom == null) envelopeFrom = new Address(val); + } else if (key.equals("X-org.ibex.mail.headers.envelope.To")) { + if (envelopeTo == null) envelopeTo = new Address(val); } else { // just append it to the previous one; valid for Comments/Keywords if (headers.get(key) != null) val = headers.get(key) + " " + val; @@ -133,16 +147,17 @@ public class Message extends JSReflection { } // FIXME what if all are null? - this.to = headers.get("To") == null ? envelopeTo[0] : new Address((String)headers.get("To")); + this.to = headers.get("To") == null ? envelopeTo : new Address((String)headers.get("To")); this.from = headers.get("From") == null ? envelopeFrom : new Address((String)headers.get("From")); - this.envelopeFrom = envelopeFrom == null ? this.from : envelopeFrom; - this.envelopeTo = envelopeTo == null ? new Address[] { this.to } : envelopeTo; + this.envelopeFrom = envelopeFrom == null ? this.from : envelopeFrom; + this.envelopeTo = envelopeTo == null ? this.to : envelopeTo; - this.date = (Date)headers.get("Date"); + this.date = new Date(); // FIXME (Date)headers.get("Date"); this.replyto = headers.get("Reply-To") == null ? null : new Address((String)headers.get("Reply-To")); this.subject = (String)headers.get("Subject"); this.messageid = (String)headers.get("Message-Id"); if (headers.get("Cc") != null) { + // FIXME: tokenize better StringTokenizer st = new StringTokenizer((String)headers.get("Cc")); this.cc = new Address[st.countTokens()]; for(int i=0; i