> > 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]