> > the root of the problem, the usage of Return-Path header
> > will still be in the code
>
> That is what I've been looking at today.  It is a riskier
> change to make on a point release, but might be worthwhile.

I need to test this, and haven't even started.  But I'd like to get as many
eyes on this as possible.

        --- Noel
? src/java/org/apache/james/transport/mailets/LogHeaders.java
Index: src/java/org/apache/james/James.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/James.java,v
retrieving revision 1.35.4.16
diff -u -r1.35.4.16 James.java
--- src/java/org/apache/james/James.java        3 May 2004 03:58:07 -0000       
1.35.4.16
+++ src/java/org/apache/james/James.java        17 Aug 2004 20:44:46 -0000
@@ -638,32 +638,18 @@
         //Create the reply message
         MimeMessage reply = (MimeMessage) orig.reply(false);
 
-        //If there is a Return-Path header,
-        String[] returnPathHeaders = orig.getHeader(RFC2822Headers.RETURN_PATH);
-        String returnPathHeader = null;
-        if (returnPathHeaders != null) {
-            // TODO: Take a look at the JavaMail spec to see if the originating header
-            //       is guaranteed to be at position 0
-            returnPathHeader = returnPathHeaders[0];
-            if (returnPathHeader != null) {
-                returnPathHeader = returnPathHeader.trim();
-                if (returnPathHeader.equals("<>")) {
-                    if (getLogger().isInfoEnabled())
-                        getLogger().info("Processing a bounce request for a message 
with an empty return path.  No bounce will be sent.");
-                    return;
-                } else {
-                    if (getLogger().isInfoEnabled())
-                        getLogger().info("Processing a bounce request for a message 
with a return path header.  The bounce will be sent to " + returnPathHeader);
-                    //Return the message to that address, not to the Reply-To address
-                    reply.setRecipient(MimeMessage.RecipientType.TO, new 
InternetAddress(returnPathHeader));
-                }
-            }
+        if (mail.getSender() == null) {
+            if (getLogger().isInfoEnabled())
+                getLogger().info("Mail to be bounced contains a null (<>) reverse 
path.  No bounce will be sent.");
+            return;
         } else {
-            getLogger().warn("Mail to be bounced does not contain a Return-Path 
header.");
+            // Bounce message goes to the reverse path, not to the Reply-To address
+            if (getLogger().isInfoEnabled())
+                getLogger().info("Processing a bounce request for a message with a 
reverse path of " + mail.getSender().toString());
+            reply.setRecipient(MimeMessage.RecipientType.TO, 
mail.getSender().toInternetAddress());
         }
 
         reply.setSentDate(new Date());
-        reply.setHeader(RFC2822Headers.RETURN_PATH,"<>");
         //Create the list of recipients in our MailAddress format
         Collection recipients = new HashSet();
         Address addresses[] = reply.getAllRecipients();
Index: src/java/org/apache/james/smtpserver/SMTPHandler.java
===================================================================
RCS file: 
/home/cvs/james-server/src/java/org/apache/james/smtpserver/SMTPHandler.java,v
retrieving revision 1.35.4.19
diff -u -r1.35.4.19 SMTPHandler.java
--- src/java/org/apache/james/smtpserver/SMTPHandler.java       8 May 2004 02:28:30 
-0000       1.35.4.19
+++ src/java/org/apache/james/smtpserver/SMTPHandler.java       17 Aug 2004 20:44:47 
-0000
@@ -1346,20 +1346,20 @@
             headers.setHeader(RFC2822Headers.FROM, state.get(SENDER).toString());
         }
         // Determine the Return-Path
-        String returnPath = headers.getHeader(RFC2822Headers.RETURN_PATH, "\r\n");
-        headers.removeHeader(RFC2822Headers.RETURN_PATH);
+     // String returnPath = headers.getHeader(RFC2822Headers.RETURN_PATH, "\r\n");
+     // headers.removeHeader(RFC2822Headers.RETURN_PATH);
         StringBuffer headerLineBuffer = new StringBuffer(512);
-        if (returnPath == null) {
-            if (state.get(SENDER) == null) {
-                returnPath = "<>";
-            } else {
-                headerLineBuffer.append("<")
-                                .append(state.get(SENDER))
-                                .append(">");
-                returnPath = headerLineBuffer.toString();
-                headerLineBuffer.delete(0, headerLineBuffer.length());
-            }
-        }
+     // if (returnPath == null) {
+     //     if (state.get(SENDER) == null) {
+     //         returnPath = "<>";
+     //     } else {
+     //         headerLineBuffer.append("<")
+     //                         .append(state.get(SENDER))
+     //                         .append(">");
+     //         returnPath = headerLineBuffer.toString();
+     //         headerLineBuffer.delete(0, headerLineBuffer.length());
+     //     }
+     // }
         // We will rebuild the header object to put Return-Path and our
         // Received header at the top
         Enumeration headerLines = headers.getAllHeaderLines();
@@ -1367,11 +1367,11 @@
         // Put the Return-Path first
         // JAMES-281 fix for messages that improperly have multiple
         // Return-Path headers
-        StringTokenizer tokenizer = new StringTokenizer(returnPath, "\r\n");
-        while(tokenizer.hasMoreTokens()) {
-            String path = tokenizer.nextToken();
-            newHeaders.addHeaderLine(RFC2822Headers.RETURN_PATH + ": " + path);
-        }
+     // StringTokenizer tokenizer = new StringTokenizer(returnPath, "\r\n");
+     // while(tokenizer.hasMoreTokens()) {
+     //     String path = tokenizer.nextToken();
+     //     newHeaders.addHeaderLine(RFC2822Headers.RETURN_PATH + ": " + path);
+     // }
 
         // Put our Received header next
         headerLineBuffer.append(RFC2822Headers.RECEIVED + ": from ")
Index: src/java/org/apache/james/transport/mailets/AbstractRedirect.java
===================================================================
RCS file: 
/home/cvs/james-server/src/java/org/apache/james/transport/mailets/AbstractRedirect.java,v
retrieving revision 1.1.2.21
diff -u -r1.1.2.21 AbstractRedirect.java
--- src/java/org/apache/james/transport/mailets/AbstractRedirect.java   15 Mar 2004 
03:54:19 -0000      1.1.2.21
+++ src/java/org/apache/james/transport/mailets/AbstractRedirect.java   17 Aug 2004 
20:44:47 -0000
@@ -706,15 +706,10 @@
      */
     protected void setReversePath(Mail newMail, MailAddress reversePath, Mail 
originalMail) throws MessagingException {
         if(reversePath != null) {
-            String reversePathString;
             if (reversePath == SpecialAddress.NULL) {
                 reversePath = null;
-                reversePathString = "";
-            } else {
-                reversePathString = reversePath.toString();
             }
             ((MailImpl) newMail).setSender(reversePath);
-            newMail.getMessage().setHeader(RFC2822Headers.RETURN_PATH, "<" + 
reversePathString + ">");
             if (isDebug) {
                 log("reversePath set to: " + reversePath);
             }
Index: src/java/org/apache/james/transport/mailets/Bounce.java
===================================================================
RCS file: 
/home/cvs/james-server/src/java/org/apache/james/transport/mailets/Bounce.java,v
retrieving revision 1.1.2.10
diff -u -r1.1.2.10 Bounce.java
--- src/java/org/apache/james/transport/mailets/Bounce.java     15 Mar 2004 03:54:19 
-0000      1.1.2.10
+++ src/java/org/apache/james/transport/mailets/Bounce.java     17 Aug 2004 20:44:47 
-0000
@@ -169,20 +169,18 @@
      * @throws MessagingException if a problem arises formulating the redirected mail
      */
     public void service(Mail originalMail) throws MessagingException {
-        MailAddress returnAddress = getExistingReturnPath(originalMail);
-        if (returnAddress == SpecialAddress.NULL) {
+        if (originalMail.getSender() == null) {
             if (isDebug)
                 log("Processing a bounce request for a message with an empty 
reverse-path.  No bounce will be sent.");
             if(!getPassThrough(originalMail)) {
                 originalMail.setState(Mail.GHOST);
             }
             return;
-        } else if (returnAddress == null) {
-            log("WARNING: Mail to be bounced does not contain a reverse-path.");
-        } else {
-            if (isDebug)
-                log("Processing a bounce request for a message with a return path 
header.  The bounce will be sent to " + returnAddress);
         }
+
+        if (isDebug)
+            log("Processing a bounce request for a message with a reverse path.  The 
bounce will be sent to " + originalMail.getSender().toString());
+
         super.service(originalMail);
     }
 
Index: src/java/org/apache/james/transport/mailets/DSNBounce.java
===================================================================
RCS file: 
/home/cvs/james-server/src/java/org/apache/james/transport/mailets/Attic/DSNBounce.java,v
retrieving revision 1.1.2.1
diff -u -r1.1.2.1 DSNBounce.java
--- src/java/org/apache/james/transport/mailets/DSNBounce.java  5 May 2004 10:34:53 
-0000       1.1.2.1
+++ src/java/org/apache/james/transport/mailets/DSNBounce.java  17 Aug 2004 20:44:47 
-0000
@@ -498,23 +498,22 @@
             ((MailImpl) newMail).setRemoteAddr("127.0.0.1");
             ((MailImpl) newMail).setRemoteHost("localhost");
         }
-        MailAddress returnAddress = getExistingReturnPath(originalMail);
-        Collection newRecipients = new HashSet();
-        if (returnAddress == SpecialAddress.NULL) {
+
+        if (originalMail.getSender() == null) {
             if (isDebug)
                 log("Processing a bounce request for a message with an empty 
reverse-path.  No bounce will be sent.");
             if(!getPassThrough(originalMail)) {
                 originalMail.setState(Mail.GHOST);
             }
             return;
-        } else if (returnAddress == null) {
-            log("WARNING: Mail to be bounced does not contain a reverse-path.");
-        } else {
-            if (isDebug)
-                log("Processing a bounce request for a message with a return path 
header.  The bounce will be sent to " + returnAddress);
         }
 
-        newRecipients.add(returnAddress);
+        String reversePath = originalMail.getSender().toString();
+        if (isDebug)
+            log("Processing a bounce request for a message with a reverse path.  The 
bounce will be sent to " + reversePath);
+
+        Collection newRecipients = new HashSet();
+        newRecipients.add(reversePath);
         ((MailImpl)newMail).setRecipients(newRecipients);
 
         if (isDebug) {
Index: src/java/org/apache/james/transport/mailets/LocalDelivery.java
===================================================================
RCS file: 
/home/cvs/james-server/src/java/org/apache/james/transport/mailets/LocalDelivery.java,v
retrieving revision 1.6.4.7
diff -u -r1.6.4.7 LocalDelivery.java
--- src/java/org/apache/james/transport/mailets/LocalDelivery.java      15 Mar 2004 
03:54:19 -0000      1.6.4.7
+++ src/java/org/apache/james/transport/mailets/LocalDelivery.java      17 Aug 2004 
20:44:47 -0000
@@ -17,13 +17,19 @@
 
 package org.apache.james.transport.mailets;
 
+import org.apache.james.util.RFC2822Headers;
+
 import org.apache.mailet.GenericMailet;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailAddress;
 
+import javax.mail.Header;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
+import javax.mail.internet.InternetHeaders;
+
 import java.util.Collection;
+import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.Vector;
 
@@ -43,23 +49,40 @@
     public void service(Mail mail) throws MessagingException {
         Collection recipients = mail.getRecipients();
         Collection errors = new Vector();
+
         MimeMessage message = mail.getMessage();
+
+        // Create a new InternetHeader collection
+        InternetHeaders newHeaders = new InternetHeaders();
+        // Set our Return-Path header
+        newHeaders.setHeader(RFC2822Headers.RETURN_PATH, mail.getSender() == null ? 
"<>" : "<" + mail.getSender() + ">");
+        // Remove all Return-Path headers from the message
+        message.removeHeader(RFC2822Headers.RETURN_PATH);
+        // Copy all remaining header lines from the message to our new header set
+        Enumeration headerLines = message.getAllHeaderLines();
+        while (headerLines.hasMoreElements()) {
+            newHeaders.addHeaderLine((String) headerLines.nextElement());
+        }
+
         for (Iterator i = recipients.iterator(); i.hasNext(); ) {
             MailAddress recipient = (MailAddress) i.next();
             try {
+                // Remove all headers
+                Enumeration oldHeaders = message.getAllHeaders();
+                while (oldHeaders.hasMoreElements()) {
+                    
message.removeHeader(((Header)oldHeaders.nextElement()).getName());
+                }
+
+                // Copy our new header set to the message
+                headerLines = newHeaders.getAllHeaderLines();
+                while (headerLines.hasMoreElements()) {
+                    message.addHeaderLine((String) headerLines.nextElement());
+                }
+                
                 // Add qmail's de facto standard Delivered-To header
-                MimeMessage localMessage = new MimeMessage(message) {
-                    protected void updateHeaders() throws MessagingException {
-                        if (getMessageID() == null) super.updateHeaders();
-                        else {
-                            modified = false;
-                        }
-                    }
-                };
-                localMessage.addHeader("Delivered-To", recipient.toString());
-                localMessage.saveChanges();
+                message.addHeader("Delivered-To", recipient.toString());
 
-                getMailetContext().storeMail(mail.getSender(), recipient, 
localMessage);
+                getMailetContext().storeMail(mail.getSender(), recipient, message);
             } catch (Exception ex) {
                 getMailetContext().log("Error while storing mail.", ex);
                 errors.add(recipient);

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to