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