synthesize messageids when necessary
authoradam <adam@megacz.com>
Sun, 8 Jul 2007 22:51:55 +0000 (22:51 +0000)
committeradam <adam@megacz.com>
Sun, 8 Jul 2007 22:51:55 +0000 (22:51 +0000)
darcs-hash:20070708225155-5007d-a345fe9b3b933bff33a2887cef5a815fdf2b48a4.gz

src/org/ibex/mail/Message.java

index cb43039..73ab0f8 100644 (file)
@@ -71,15 +71,24 @@ public class Message extends MIME.Part {
         this.from         = headers.get("From") != null ? Address.parse(headers.get("From")) : this.envelopeFrom;
         this.replyto      = headers.get("Reply-To") == null ? null : Address.parse(headers.get("Reply-To"));
         this.subject      = headers.get("Subject");
-        this.messageid    = headers.get("Message-Id");
+        String messageid  = headers.get("Message-Id");
         this.cc           = Address.list(headers.get("Cc"));
         this.bcc          = Address.list(headers.get("Bcc"));
         Date date         = RobustDateParser.parseDate(headers.get("Date"));
         this.date         = date==null ? new Date() : date;
         this.arrival      = this.date; // FIXME wrong: should grab this from traces, I think?
 
-        if (this.messageid == null)
-            throw new RuntimeException("every RFC2822 message must have a Message-ID: header");
+        if (messageid == null) {
+            SHA1 sha1 = new SHA1();
+            Stream s = this.getStream();
+            s.setInputDigest(sha1);
+            s.transcribe(new Stream(new NullOutputStream()));
+            byte[] end = new byte[sha1.getDigestSize()];
+            sha1.doFinal(end, 0);
+            messageid = "<synthetic.messageid." + Encode.toBase64String(end) + ">";
+            Log.info(this, "synthesized messageid " + messageid);
+        }
+        this.messageid = messageid;
     }