You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2004/08/19 02:45:16 UTC
cvs commit: james-server/src/java/org/apache/james/transport/mailets AbstractRedirect.java Bounce.java DSNBounce.java LocalDelivery.java
noel 2004/08/18 17:45:16
Modified: src/java/org/apache/james Tag: branch_2_1_fcs James.java
src/java/org/apache/james/smtpserver Tag: branch_2_1_fcs
SMTPHandler.java
src/java/org/apache/james/transport/mailets Tag:
branch_2_1_fcs AbstractRedirect.java Bounce.java
DSNBounce.java LocalDelivery.java
Log:
Change to remove improper use of Return-Path header and support proper RFC 2821 reverse path handling. Should also fix JAMES-264.
Revision Changes Path
No revision
No revision
1.35.4.17 +9 -23 james-server/src/java/org/apache/james/James.java
Index: James.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/James.java,v
retrieving revision 1.35.4.16
retrieving revision 1.35.4.17
diff -u -r1.35.4.16 -r1.35.4.17
--- James.java 3 May 2004 03:58:07 -0000 1.35.4.16
+++ James.java 19 Aug 2004 00:45:15 -0000 1.35.4.17
@@ -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();
No revision
No revision
1.35.4.20 +8 -27 james-server/src/java/org/apache/james/smtpserver/SMTPHandler.java
Index: SMTPHandler.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/smtpserver/SMTPHandler.java,v
retrieving revision 1.35.4.19
retrieving revision 1.35.4.20
diff -u -r1.35.4.19 -r1.35.4.20
--- SMTPHandler.java 8 May 2004 02:28:30 -0000 1.35.4.19
+++ SMTPHandler.java 19 Aug 2004 00:45:16 -0000 1.35.4.20
@@ -1345,35 +1345,16 @@
if (!headers.isSet(RFC2822Headers.FROM) && state.get(SENDER) != null) {
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);
+ // RFC 2821 says that we cannot examine the message to see if
+ // Return-Path headers are present. If there is one, our
+ // Received: header may precede it, but the Return-Path header
+ // should be removed when making final delivery.
+ // 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());
- }
- }
- // We will rebuild the header object to put Return-Path and our
- // Received header at the top
+ // We will rebuild the header object to put our Received header at the top
Enumeration headerLines = headers.getAllHeaderLines();
MailHeaders newHeaders = new MailHeaders();
- // 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);
- }
-
- // Put our Received header next
+ // Put our Received header first
headerLineBuffer.append(RFC2822Headers.RECEIVED + ": from ")
.append(remoteHost)
.append(" ([")
No revision
No revision
1.1.2.22 +1 -6 james-server/src/java/org/apache/james/transport/mailets/AbstractRedirect.java
Index: AbstractRedirect.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/AbstractRedirect.java,v
retrieving revision 1.1.2.21
retrieving revision 1.1.2.22
diff -u -r1.1.2.21 -r1.1.2.22
--- AbstractRedirect.java 15 Mar 2004 03:54:19 -0000 1.1.2.21
+++ AbstractRedirect.java 19 Aug 2004 00:45:16 -0000 1.1.2.22
@@ -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);
}
1.1.2.11 +6 -8 james-server/src/java/org/apache/james/transport/mailets/Bounce.java
Index: Bounce.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/Bounce.java,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -r1.1.2.10 -r1.1.2.11
--- Bounce.java 15 Mar 2004 03:54:19 -0000 1.1.2.10
+++ Bounce.java 19 Aug 2004 00:45:16 -0000 1.1.2.11
@@ -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);
}
1.1.2.2 +8 -9 james-server/src/java/org/apache/james/transport/mailets/Attic/DSNBounce.java
Index: 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
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- DSNBounce.java 5 May 2004 10:34:53 -0000 1.1.2.1
+++ DSNBounce.java 19 Aug 2004 00:45:16 -0000 1.1.2.2
@@ -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) {
1.6.4.8 +42 -11 james-server/src/java/org/apache/james/transport/mailets/LocalDelivery.java
Index: LocalDelivery.java
===================================================================
RCS file: /home/cvs/james-server/src/java/org/apache/james/transport/mailets/LocalDelivery.java,v
retrieving revision 1.6.4.7
retrieving revision 1.6.4.8
diff -u -r1.6.4.7 -r1.6.4.8
--- LocalDelivery.java 15 Mar 2004 03:54:19 -0000 1.6.4.7
+++ LocalDelivery.java 19 Aug 2004 00:45:16 -0000 1.6.4.8
@@ -17,13 +17,20 @@
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.ArrayList;
import java.util.Collection;
+import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;
@@ -43,23 +50,47 @@
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 headers = message.getAllHeaderLines();
+ while (headers.hasMoreElements()) {
+ newHeaders.addHeaderLine((String) headers.nextElement());
+ }
+ // Remember all Header names
+ headers = message.getAllHeaders();
+ ArrayList names = new ArrayList();
+ while (headers.hasMoreElements()) {
+ names.add(((Header)headers.nextElement()).getName());
+ }
+ final String[] headerNames = (String[]) names.toArray(new String[0]);
+ names = null;
+
for (Iterator i = recipients.iterator(); i.hasNext(); ) {
MailAddress recipient = (MailAddress) i.next();
try {
+ // Remove all headers
+ for(int h = 0; h < headerNames.length; h++) {
+ message.removeHeader(headerNames[h]);
+ }
+
+ // Copy our new header set to the message
+ headers = newHeaders.getAllHeaderLines();
+ while (headers.hasMoreElements()) {
+ message.addHeaderLine((String) headers.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.addHeaderLine("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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org