noel        2004/08/19 20:48:15

  Modified:    src/java/org/apache/james/core Tag: branch_2_1_fcs
                        MimeMessageWrapper.java
               src/java/org/apache/james/transport/mailets Tag:
                        branch_2_1_fcs LocalDelivery.java
  Log:
  Additional adjustments to fix JAMES-264.  InternetHeaders is an awkward class to 
work with due its own internal handling of header order.  This change takes advantage 
of how InternetHeaders works, pre-placing a null placeholder for a possible 
Return-Path header so that when setHeader is called, it will use that placeholder, and 
remove any other Return-Path headers.  It also ensures that there are no other 
placeholders, providing a bit more control as we manipulate the Delivered-To headers 
(and possibly other headers that JavaMail may want to change internally, such as 
Message-ID, Date and Mime-Version).
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.17.4.11 +9 -2      
james-server/src/java/org/apache/james/core/MimeMessageWrapper.java
  
  Index: MimeMessageWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/james-server/src/java/org/apache/james/core/MimeMessageWrapper.java,v
  retrieving revision 1.17.4.10
  retrieving revision 1.17.4.11
  diff -u -r1.17.4.10 -r1.17.4.11
  --- MimeMessageWrapper.java   15 Mar 2004 03:54:15 -0000      1.17.4.10
  +++ MimeMessageWrapper.java   20 Aug 2004 03:48:15 -0000      1.17.4.11
  @@ -103,6 +103,13 @@
           return source.getSourceId();
       }
   
  +    private synchronized MailHeaders loadHeaders(InputStream is) throws 
MessagingException {
  +        headers = new MailHeaders(new 
ByteArrayInputStream((RFC2822Headers.RETURN_PATH + ": placeholder").getBytes()));
  +        headers.setHeader(RFC2822Headers.RETURN_PATH, null);
  +        headers.load(is);
  +        return headers;
  +    }
  +
       /**
        * Load the message headers from the internal source.
        *
  @@ -117,7 +124,7 @@
           try {
               InputStream in = source.getInputStream();
               try {
  -                headers = new MailHeaders(in);
  +                headers = loadHeaders(in);
               } finally {
                   IOUtil.shutdownStream(in);
               }
  @@ -140,7 +147,7 @@
           InputStream in = null;
           try {
               in = source.getInputStream();
  -            headers = new MailHeaders(in);
  +            headers = loadHeaders(in);
   
               ByteArrayInputStream headersIn
                       = new ByteArrayInputStream(headers.toByteArray());
  
  
  
  No                   revision
  No                   revision
  1.6.4.10  +28 -29    
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.9
  retrieving revision 1.6.4.10
  diff -u -r1.6.4.9 -r1.6.4.10
  --- LocalDelivery.java        19 Aug 2004 05:07:56 -0000      1.6.4.9
  +++ LocalDelivery.java        20 Aug 2004 03:48:15 -0000      1.6.4.10
  @@ -25,6 +25,7 @@
   
   import javax.mail.Header;
   import javax.mail.MessagingException;
  +import javax.mail.Session;
   import javax.mail.internet.MimeMessage;
   import javax.mail.internet.InternetHeaders;
   
  @@ -53,45 +54,43 @@
   
           MimeMessage message = mail.getMessage();
   
  -        // Create an InternetHeader collection with only our Return-Path
  -        // header.  The InternetHeader() constructor creates an
  -        // InternetHeader instance with invisible placehoders for
  -        // various headers.
  -        InternetHeaders newHeaders = new InternetHeaders(new 
java.io.ByteArrayInputStream((RFC2822Headers.RETURN_PATH + ": " + (mail.getSender() == 
null ? "<>" : "<" + mail.getSender() + ">\r\n")).getBytes()));
  -        // 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());
  +        // Set Return-Path and remove all other Return-Path headers from the message
  +        // This only works because there is a placeholder inserted by 
MimeMessageWrapper
  +        message.setHeader(RFC2822Headers.RETURN_PATH, (mail.getSender() == null ? 
"<>" : "<" + mail.getSender() + ">"));
  +
  +/*
  +        if(message.getMessageID() == null) {
  +            MimeMessage midMsg = new 
MimeMessage(Session.getDefaultInstance(System.getProperties(), null));
  +            midMsg.saveChanges();
  +            message.addHeaderLine("Message-ID: " + midMsg.getMessageID());
           }
  -        // Remember all Header names
  -        headers = message.getAllHeaders();
  -        ArrayList names = new ArrayList();
  +*/
  +        // Copy any Delivered-To headers from the message
  +        InternetHeaders deliveredTo = new InternetHeaders();
  +        Enumeration headers = message.getMatchingHeaders(new String[] 
{"Delivered-To"});
           while (headers.hasMoreElements()) {
  -            names.add(((Header)headers.nextElement()).getName());
  +            Header header = (Header) headers.nextElement();
  +            deliveredTo.addHeader(header.getName(), header.getValue());
           }
  -        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
  -                message.addHeaderLine("Delivered-To: " + recipient.toString());
  +                message.addHeader("Delivered-To", recipient.toString());
   
                   getMailetContext().storeMail(mail.getSender(), recipient, message);
  +
  +                if (i.hasNext()) {
  +                    // Remove headers but leave all placeholders
  +                    message.removeHeader("Delivered-To");
  +                    headers = deliveredTo.getAllHeaders();
  +                    // And restore any original Delivered-To headers
  +                    while (headers.hasMoreElements()) {
  +                        Header header = (Header) headers.nextElement();
  +                        message.addHeader(header.getName(), header.getValue());
  +                    }
  +                }
               } 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