Index: RemoteDelivery.java
===================================================================
RCS file: /home/cvspublic/jakarta-james/src/java/org/apache/james/transport/mailets/RemoteDelivery.java,v
retrieving revision 1.14
diff -u -r1.14 RemoteDelivery.java
--- RemoteDelivery.java	1 Mar 2002 15:58:40 -0000	1.14
+++ RemoteDelivery.java	3 Apr 2002 18:38:59 -0000
@@ -60,6 +60,8 @@
     private Collection deliveryThreads = new Vector();
     private MailServer mailServer;
 
+    private Random random;
+
     public void init() throws MessagingException {
         try {
             if (getInitParameter("delayTime") != null) {
@@ -82,6 +84,7 @@
         } catch (Exception e) {
             log("Invalid timeout setting: " + getInitParameter("timeout"));
         }
+
         gatewayServer = getInitParameter("gateway");
         gatewayPort = getInitParameter("gatewayPort");
         ComponentManager compMgr = (ComponentManager)getMailetContext().getAttribute(Constants.AVALON_COMPONENT_MANAGER);
@@ -105,6 +108,8 @@
             log("Failed to retrieve Store component:" + e.getMessage());
         }
 
+        random = new Random();
+
         //Start up a number of threads
         try {
             deliveryThreadCount = Integer.parseInt(getInitParameter("deliveryThreads"));
@@ -401,7 +406,14 @@
                        outgoing.remove(key);
                    } else {
                        //Something happened that will delay delivery.  Store any updates
+                       //outgoing.store(mail);
+
+                       // Store the mail with a new name.  This is because the store operation overwrites
+                       // the file stream before it calls the message wrapper class to load the stream,
+                       // hence data gets lost.
+                       mail.setName(newName(mail));
                        outgoing.store(mail);
+                       outgoing.remove(key);
                    }
                    //Clear the object handle to make sure it recycles this object.
                    mail = null;
@@ -416,4 +428,26 @@
             }
         }
     }
+
+    /**
+     * Create a unique new primary key name
+     */
+    private String newName(MailImpl mail) {
+        String name = mail.getName();
+        String prefix = null;
+        String suffix = null;
+
+        // Strip out old random number
+        int pos = name.indexOf("-!");
+        if (pos > 0) {
+            prefix = name.substring(0, pos);
+            suffix = name.substring(pos+1);
+            int pos2 = suffix.indexOf("-");
+            suffix = suffix.substring(pos2+1);
+            return prefix + "-!" + Math.abs(random.nextInt()) + "-" + suffix;
+        } else {
+            return name + "-!" + Math.abs(random.nextInt());
+        }
+    }
+
 }
