You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by mb...@apache.org on 2005/02/02 21:08:58 UTC

cvs commit: ant/src/main/org/apache/tools/ant/taskdefs/email Header.java EmailTask.java Mailer.java MimeMailer.java PlainMailer.java

mbenson     2005/02/02 12:08:58

  Modified:    .        WHATSNEW
               docs/manual/CoreTasks mail.html
               src/main/org/apache/tools/ant/taskdefs/email EmailTask.java
                        Mailer.java MimeMailer.java PlainMailer.java
  Added:       src/main/org/apache/tools/ant/taskdefs/email Header.java
  Log:
  Add nested header element to the mail task.
  PR: 24713
  
  Revision  Changes    Path
  1.738     +2 -0      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.737
  retrieving revision 1.738
  diff -u -r1.737 -r1.738
  --- WHATSNEW	2 Feb 2005 14:24:59 -0000	1.737
  +++ WHATSNEW	2 Feb 2005 20:08:57 -0000	1.738
  @@ -99,6 +99,8 @@
   
   * ant -diagnostics lists contents of ${user.home}/.ant/lib
   
  +* mail task accepts nested header element.  Bugzilla report 24713.
  +
   Changes from Ant 1.6.2 to current Ant 1.6 CVS version
   =====================================================
   
  
  
  
  1.25      +26 -1     ant/docs/manual/CoreTasks/mail.html
  
  Index: mail.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTasks/mail.html,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- mail.html	19 Nov 2004 09:07:09 -0000	1.24
  +++ mail.html	2 Feb 2005 20:08:57 -0000	1.25
  @@ -212,6 +212,31 @@
   in the message, whether it is specified as an external file or as text within
   the <code>&lt;message&gt;</code> element.</p>
   
  +<h4>header</h4>
  +<p><strong>Since Ant 1.7</strong>, arbitrary mail headers can be added by
  +  specifying these attributes on one or more nested header elements:</p>
  +
  +<table width="60%" border="1" cellpadding="2" cellspacing="0">
  +  <tr>
  +    <td valign="top"><b>Attribute</b></td>
  +    <td valign="top"><b>Description</b></td>
  +    <td align="center" valign="top"><b>Required</b></td>
  +  </tr>
  +  <tr>
  +    <td valign="top">name</td>
  +    <td valign="top">The name associated with this mail header.</td>
  +    <td align="center" valign="top">Yes</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">value</td>
  +    <td valign="top">The value to assign to this mail header.</td>
  +    <td align="center" valign="top">Yes</td>
  +  </tr>
  +</table>
  +
  +<p>It is permissible to duplicate the name attribute amongst multiple headers.
  +</p>
  +
   <h3>Examples</h3>
   
   <blockquote><pre>
  @@ -259,7 +284,7 @@
   <i>Test Build</i>, the message body being coded in UTF-8
   
   <hr>
  -<p align="center">Copyright &copy; 2000-2004 The Apache Software Foundation. All rights
  +<p align="center">Copyright &copy; 2000-2005 The Apache Software Foundation. All rights
   Reserved.</p>
   
   </body>
  
  
  
  1.30      +90 -117   ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java
  
  Index: EmailTask.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- EmailTask.java	9 Mar 2004 16:48:14 -0000	1.29
  +++ EmailTask.java	2 Feb 2005 20:08:57 -0000	1.30
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2000-2004 The Apache Software Foundation
  + * Copyright  2000-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -16,12 +16,11 @@
    */
   package org.apache.tools.ant.taskdefs.email;
   
  -// Ant imports
  -
   import java.io.File;
  +import java.util.Vector;
   import java.util.Enumeration;
   import java.util.StringTokenizer;
  -import java.util.Vector;
  +
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.DirectoryScanner;
   import org.apache.tools.ant.Project;
  @@ -36,8 +35,7 @@
    * @since Ant 1.5
    * @ant.task name="mail" category="network"
    */
  -public class EmailTask
  -     extends Task {
  +public class EmailTask extends Task {
       /** Constant to show that the best available mailer should be used.  */
       public static final String AUTO = "auto";
       /** Constant to allow the Mime mailer to be requested  */
  @@ -47,9 +45,8 @@
       /** Constant to allow the plaintext mailer to be requested  */
       public static final String PLAIN = "plain";
   
  -
       /**
  -     * Enumerates the encoding constants
  +     * Enumerates the encoding constants.
        */
       public static class Encoding extends EnumeratedAttribute {
           /**
  @@ -74,7 +71,7 @@
       private boolean failOnError = true;
       private boolean includeFileNames = false;
       private String messageMimeType = null;
  -    /** special headers */
  +    /* special headers */
       /** sender  */
       private EmailAddress from = null;
       /** replyto */
  @@ -86,6 +83,9 @@
       /** BCC (Blind Carbon Copy) recipients  */
       private Vector bccList = new Vector();
   
  +    /** generic headers */
  +    private Vector headers = new Vector();
  +
       /** file list  */
       private Vector files = new Vector();
       private Vector filesets = new Vector();
  @@ -99,64 +99,61 @@
       private boolean SSL = false;
   
       /**
  -     * sets the user for SMTP auth; this requires JavaMail
  -     * @param user
  -     * @since ant 1.6
  +     * Set the user for SMTP auth; this requires JavaMail.
  +     * @param user the String username.
  +     * @since Ant 1.6
        */
       public void setUser(String user) {
           this.user = user;
       }
   
       /**
  -     * sets the password for SMTP auth; this requires JavaMail
  -     * @param password
  -     * @since ant 1.6
  +     * Set the password for SMTP auth; this requires JavaMail.
  +     * @param password the String password.
  +     * @since Ant 1.6
        */
       public void setPassword(String password) {
           this.password = password;
       }
   
       /**
  -     * tells if the user needs to send his data over SSL
  -     * @param SSL
  -     * @since ant 1.6
  +     * Set whether to send data over SSL.
  +     * @param SSL boolean; if true SSL will be used.
  +     * @since Ant 1.6
        */
       public void setSSL(boolean SSL) {
           this.SSL = SSL;
       }
   
       /**
  -     * Allows the build writer to choose the preferred encoding method
  +     * Set the preferred encoding method.
        *
  -     * @param encoding The encoding (one of AUTO,MIME,UU,PLAIN)
  +     * @param encoding The encoding (one of AUTO, MIME, UU, PLAIN).
        */
       public void setEncoding(Encoding encoding) {
           this.encoding = encoding.getValue();
       }
   
  -
       /**
  -     * Sets the mail server port
  +     * Set the mail server port.
        *
  -     * @param port The port to use
  +     * @param port The port to use.
        */
       public void setMailport(int port) {
           this.port = port;
       }
   
  -
       /**
  -     * Sets the host
  +     * Set the host.
        *
  -     * @param host The host to connect to
  +     * @param host The host to connect to.
        */
       public void setMailhost(String host) {
           this.host = host;
       }
   
  -
       /**
  -     * Sets the subject line of the email
  +     * Set the subject line of the email.
        *
        * @param subject Subject of this email.
        */
  @@ -164,9 +161,8 @@
           this.subject = subject;
       }
   
  -
       /**
  -     * Shorthand method to set the message
  +     * Shorthand method to set the message.
        *
        * @param message Message body of this email.
        */
  @@ -175,120 +171,105 @@
               throw new BuildException("Only one message can be sent in an "
                    + "email");
           }
  -
           this.message = new Message(message);
           this.message.setProject(getProject());
       }
   
  -
       /**
  -     * Shorthand method to set the message from a file
  +     * Shorthand method to set the message from a file.
        *
  -     * @param file The file from which to take the message
  +     * @param file The file from which to take the message.
        */
       public void setMessageFile(File file) {
           if (this.message != null) {
               throw new BuildException("Only one message can be sent in an "
                    + "email");
           }
  -
           this.message = new Message(file);
           this.message.setProject(getProject());
       }
   
  -
       /**
        * Shorthand method to set type of the text message, text/plain by default
        * but text/html or text/xml is quite feasible.
        *
  -     * @param type The new MessageMimeType value
  +     * @param type The new MessageMimeType value.
        */
       public void setMessageMimeType(String type) {
           this.messageMimeType = type;
       }
   
  -
       /**
  -     * Add a message element
  +     * Add a message element.
        *
  -     * @param message The message object
  -     * @throws BuildException if a message has already been added
  +     * @param message The message object.
  +     * @throws BuildException if a message has already been added.
        */
  -    public void addMessage(Message message)
  -         throws BuildException {
  +    public void addMessage(Message message) throws BuildException {
           if (this.message != null) {
  -            throw new BuildException("Only one message can be sent in an "
  -                 + "email");
  +            throw new BuildException(
  +                "Only one message can be sent in an email");
           }
  -
           this.message = message;
       }
   
  -
       /**
  -     * Adds a from address element
  +     * Add a from address element.
        *
  -     * @param address The address to send from
  +     * @param address The address to send from.
        */
       public void addFrom(EmailAddress address) {
           if (this.from != null) {
               throw new BuildException("Emails can only be from one address");
           }
  -
           this.from = address;
       }
   
  -
       /**
  -     * Shorthand to set the from address element
  +     * Shorthand to set the from address element.
        *
  -     * @param address The address to send mail from
  +     * @param address The address to send mail from.
        */
       public void setFrom(String address) {
           if (this.from != null) {
               throw new BuildException("Emails can only be from one address");
           }
  -
           this.from = new EmailAddress(address);
       }
   
  -
       /**
  -     * Adds a replyto address element
  +     * Add a replyto address element.
        *
  -     * @param address The address to reply to
  -     * @since ant 1.6
  +     * @param address The address to reply to.
  +     * @since Ant 1.6
        */
       public void addReplyTo(EmailAddress address) {
           this.replyToList.add(address);
       }
   
  -
       /**
  -     * Shorthand to set the replyto address element
  +     * Shorthand to set the replyto address element.
        *
  -     * @param address The address to which replies should be directed
  -     * @since ant 1.6
  +     * @param address The address to which replies should be directed.
  +     * @since Ant 1.6
        */
       public void setReplyTo(String address) {
           this.replyToList.add(new EmailAddress(address));
       }
   
  -
       /**
  -     * Adds a to address element
  +     * Add a to address element.
        *
  -     * @param address An email address
  +     * @param address An email address.
        */
       public void addTo(EmailAddress address) {
           toList.addElement(address);
       }
   
  -
       /**
  -     * Adds "to" address elements
  +     * Shorthand to set the "to" address element.
        *
  -     * @param list Comma separated list of addresses
  +     * @param list Comma-separated list of addresses.
        */
       public void setToList(String list) {
           StringTokenizer tokens = new StringTokenizer(list, ",");
  @@ -298,21 +279,19 @@
           }
       }
   
  -
       /**
  -     * Adds "cc" address element
  +     * Add a "cc" address element.
        *
  -     * @param address The email address
  +     * @param address The email address.
        */
       public void addCc(EmailAddress address) {
           ccList.addElement(address);
       }
   
  -
       /**
  -     * Adds "cc" address elements
  +     * Shorthand to set the "cc" address element.
        *
  -     * @param list Comma separated list of addresses
  +     * @param list Comma separated list of addresses.
        */
       public void setCcList(String list) {
           StringTokenizer tokens = new StringTokenizer(list, ",");
  @@ -322,21 +301,19 @@
           }
       }
   
  -
       /**
  -     * Adds "bcc" address elements
  +     * Add a "bcc" address element.
        *
  -     * @param address The email address
  +     * @param address The email address.
        */
       public void addBcc(EmailAddress address) {
           bccList.addElement(address);
       }
   
  -
       /**
  -     * Adds "bcc" address elements
  +     * Shorthand to set the "bcc" address element.
        *
  -     * @param list comma separated list of addresses
  +     * @param list comma separated list of addresses.
        */
       public void setBccList(String list) {
           StringTokenizer tokens = new StringTokenizer(list, ",");
  @@ -346,21 +323,19 @@
           }
       }
   
  -
       /**
  -     * Indicates whether BuildExceptions should be passed back to the core
  +     * Set whether BuildExceptions should be passed back to the core.
        *
  -     * @param failOnError The new FailOnError value
  +     * @param failOnError The new FailOnError value.
        */
       public void setFailOnError(boolean failOnError) {
           this.failOnError = failOnError;
       }
   
  -
       /**
  -     * Adds a list of files to be attached
  +     * Set the list of files to be attached.
        *
  -     * @param filenames Comma separated list of files
  +     * @param filenames Comma-separated list of files.
        */
       public void setFiles(String filenames) {
           StringTokenizer t = new StringTokenizer(filenames, ", ");
  @@ -370,39 +345,47 @@
           }
       }
   
  -
       /**
  -     * Adds a set of files (nested fileset attribute).
  +     * Add a set of files (nested fileset attribute).
        *
  -     * @param fs The fileset
  +     * @param fs The fileset.
        */
       public void addFileset(FileSet fs) {
           filesets.addElement(fs);
       }
   
  +    /**
  +     * Create a nested header element.
  +     * @return a Header instance.
  +     */
  +    public Header createHeader() {
  +        Header h = new Header();
  +        headers.add(h);
  +        return h;
  +    }
   
       /**
  -     * Sets Includefilenames attribute
  +     * Set whether to include filenames.
        *
        * @param includeFileNames Whether to include filenames in the text of the
  -     *      message
  +     *      message.
        */
       public void setIncludefilenames(boolean includeFileNames) {
           this.includeFileNames = includeFileNames;
       }
   
  -
       /**
  -     * Identifies whether file names should be included
  +     * Get whether file names should be included.
        *
  -     * @return Identifies whether file names should be included
  +     * @return Identifies whether file names should be included.
        */
       public boolean getIncludeFileNames() {
           return includeFileNames;
       }
   
  -
  -    /** Sends an email  */
  +    /**
  +     * Send an email.
  +     */
       public void execute() {
           Message savedMessage = message;
           Vector savedFiles = (Vector) files.clone();
  @@ -416,8 +399,8 @@
               if (encoding.equals(MIME)
                    || (encoding.equals(AUTO) && !autoFound)) {
                   try {
  -                    mailer =
  -                        (Mailer) Class.forName("org.apache.tools.ant.taskdefs.email.MimeMailer")
  +                    mailer = (Mailer) Class.forName(
  +                        "org.apache.tools.ant.taskdefs.email.MimeMailer")
                           .newInstance();
                       autoFound = true;
                       log("Using MIME mail", Project.MSG_VERBOSE);
  @@ -436,8 +419,6 @@
                   && (encoding.equals(UU) || encoding.equals(PLAIN))) {
                   throw new BuildException("SSL only possible with MIME mail");
               }
  -
  -
               // try UU format
               if (encoding.equals(UU)
                    || (encoding.equals(AUTO) && !autoFound)) {
  @@ -451,7 +432,6 @@
                       log("Failed to initialise UU mail", Project.MSG_WARN);
                   }
               }
  -
               // try plain format
               if (encoding.equals(PLAIN)
                    || (encoding.equals(AUTO) && !autoFound)) {
  @@ -459,49 +439,41 @@
                   autoFound = true;
                   log("Using plain mail", Project.MSG_VERBOSE);
               }
  -
               // a valid mailer must be present by now
               if (mailer == null) {
                   throw new BuildException("Failed to initialise encoding: "
                        + encoding);
               }
  -
               // a valid message is required
               if (message == null) {
                   message = new Message();
                   message.setProject(getProject());
               }
  -
               // an address to send from is required
               if (from == null || from.getAddress() == null) {
                   throw new BuildException("A from element is required");
               }
  -
               // at least one address to send to/cc/bcc is required
               if (toList.isEmpty() && ccList.isEmpty() && bccList.isEmpty()) {
  -                throw new BuildException("At least one of to,cc or bcc must "
  +                throw new BuildException("At least one of to, cc or bcc must "
                        + "be supplied");
               }
  -
               // set the mimetype if not done already (and required)
               if (messageMimeType != null) {
                   if (message.isMimeTypeSpecified()) {
                       throw new BuildException("The mime type can only be "
                            + "specified in one location");
  -                } else {
  -                    message.setMimeType(messageMimeType);
                   }
  +                message.setMimeType(messageMimeType);
               }
               // set the character set if not done already (and required)
               if (charset != null) {
                   if (message.getCharset() != null) {
                       throw new BuildException("The charset can only be "
                            + "specified in one location");
  -                } else {
  -                    message.setCharset(charset);
                   }
  +                message.setCharset(charset);
               }
  -
               // identify which files should be attached
               Enumeration e = filesets.elements();
   
  @@ -513,12 +485,9 @@
                   File baseDir = ds.getBasedir();
   
                   for (int j = 0; j < includedFiles.length; ++j) {
  -                    File file = new File(baseDir, includedFiles[j]);
  -
  -                    files.addElement(file);
  +                    files.addElement(new File(baseDir, includedFiles[j]));
                   }
               }
  -
               // let the user know what's going to happen
               log("Sending email: " + subject, Project.MSG_INFO);
               log("From " + from, Project.MSG_VERBOSE);
  @@ -543,6 +512,7 @@
               mailer.setSubject(subject);
               mailer.setTask(this);
               mailer.setIncludeFileNames(includeFileNames);
  +            mailer.setHeaders(headers);
   
               // send the email
               mailer.send();
  @@ -567,15 +537,17 @@
               files = savedFiles;
           }
       }
  +
       /**
        * Sets the character set of mail message.
        * Will be ignored if mimeType contains ....; Charset=... substring or
  -     * encoding is not a <code>mime</code>
  +     * encoding is not a <code>mime</code>.
        * @since Ant 1.6
        */
       public void setCharset(String charset) {
         this.charset = charset;
       }
  +
       /**
        * Returns the character set of mail message.
        *
  @@ -585,5 +557,6 @@
       public String getCharset() {
         return charset;
       }
  +
   }
   
  
  
  
  1.18      +44 -45    ant/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java
  
  Index: Mailer.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- Mailer.java	9 Mar 2004 16:48:14 -0000	1.17
  +++ Mailer.java	2 Feb 2005 20:08:57 -0000	1.18
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2002-2004 The Apache Software Foundation
  + * Copyright  2002-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -42,119 +42,113 @@
       protected String subject = null;
       protected Task task;
       protected boolean includeFileNames = false;
  +    protected Vector headers = null;
   
       /**
  -     * Sets the mail server
  +     * Set the mail server.
        *
  -     * @param host the mail server name
  +     * @param host the mail server name.
        */
       public void setHost(String host) {
           this.host = host;
       }
   
  -
       /**
  -     * Sets the smtp port
  +     * Set the smtp port.
        *
  -     * @param port the SMTP port
  +     * @param port the SMTP port.
        */
       public void setPort(int port) {
           this.port = port;
       }
   
       /**
  -     * Sets the user for smtp auth
  +     * Set the user for smtp auth.
        *
  -     * @param user the username
  -     * @since ant 1.6
  +     * @param user the username.
  +     * @since Ant 1.6
        */
       public void setUser(String user) {
           this.user = user;
       }
   
       /**
  -     * Sets the password for smtp auth
  +     * Set the password for smtp auth.
        *
  -     * @param password the authentication password
  -     * @since ant 1.6
  +     * @param password the authentication password.
  +     * @since Ant 1.6
        */
       public void setPassword(String password) {
           this.password = password;
       }
   
       /**
  -     * Sets whether the user wants to send the mail through SSL
  +     * Set whether to send the mail through SSL.
        *
  -     * @param SSL if true use SSL transport
  -     * @since ant 1.6
  +     * @param SSL if true use SSL transport.
  +     * @since Ant 1.6
        */
       public void setSSL(boolean SSL) {
           this.SSL = SSL;
       }
   
       /**
  -     * Sets the message
  +     * Set the message.
        *
  -     * @param m the message content
  +     * @param m the message content.
        */
       public void setMessage(Message m) {
           this.message = m;
       }
   
  -
       /**
  -     * Sets the address to send from
  +     * Set the address to send from.
        *
  -     * @param from the sender
  +     * @param from the sender.
        */
       public void setFrom(EmailAddress from) {
           this.from = from;
       }
   
  -
       /**
  -     * Sets the replyto addresses
  +     * Set the replyto addresses.
        *
  -     * @param list a vector of reployTo addresses
  -     * @since ant 1.6
  +     * @param list a vector of reployTo addresses.
  +     * @since Ant 1.6
        */
       public void setReplyToList(Vector list) {
           this.replyToList = list;
       }
   
  -
       /**
  -     * Set the to addresses
  +     * Set the to addresses.
        *
  -     * @param list a vector of recipient addresses
  +     * @param list a vector of recipient addresses.
        */
       public void setToList(Vector list) {
           this.toList = list;
       }
   
  -
       /**
  -     * Sets the cc addresses
  +     * Set the cc addresses.
        *
  -     * @param list a vector of cc addresses
  +     * @param list a vector of cc addresses.
        */
       public void setCcList(Vector list) {
           this.ccList = list;
       }
   
  -
       /**
  -     * Sets the bcc addresses
  +     * Set the bcc addresses.
        *
  -     * @param list a vector of the bcc addresses
  +     * @param list a vector of the bcc addresses.
        */
       public void setBccList(Vector list) {
           this.bccList = list;
       }
   
  -
       /**
  -     * Sets the files to attach
  +     * Set the files to attach.
        *
        * @param files list of files to attach to the email.
        */
  @@ -162,29 +156,26 @@
           this.files = files;
       }
   
  -
       /**
  -     * Sets the subject
  +     * Set the subject.
        *
  -     * @param subject the subject line
  +     * @param subject the subject line.
        */
       public void setSubject(String subject) {
           this.subject = subject;
       }
   
  -
       /**
  -     * Sets the owning task
  +     * Set the owning task.
        *
  -     * @param task the owning task instance
  +     * @param task the owning task instance.
        */
       public void setTask(Task task) {
           this.task = task;
       }
   
  -
       /**
  -     * Indicates whether filenames should be listed in the body
  +     * Indicate whether filenames should be listed in the body.
        *
        * @param b if true list attached file names in the body content.
        */
  @@ -192,9 +183,17 @@
           this.includeFileNames = b;
       }
   
  +    /**
  +     * Set the generic headers to add to the email.
  +     * @param v a Vector presumed to contain Header objects.
  +     * @since Ant 1.7
  +     */
  +    public void setHeaders(Vector v) {
  +        this.headers = v;
  +    }
   
       /**
  -     * This method should send the email
  +     * Send the email.
        *
        * @throws BuildException if the email can't be sent.
        */
  @@ -202,7 +201,7 @@
            throws BuildException;
   
       /**
  -     * Returns the current Date in a format suitable for a SMTP date
  +     * Return the current Date in a format suitable for a SMTP date
        * header.
        *
        * @return the current date in SMTP suitable format.
  
  
  
  1.19      +82 -77    ant/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java
  
  Index: MimeMailer.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- MimeMailer.java	9 Mar 2004 16:48:14 -0000	1.18
  +++ MimeMailer.java	2 Feb 2005 20:08:57 -0000	1.19
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2002-2004 The Apache Software Foundation
  + * Copyright  2002-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -16,36 +16,38 @@
    */
   package org.apache.tools.ant.taskdefs.email;
   
  -import java.io.ByteArrayInputStream;
  -import java.io.ByteArrayOutputStream;
   import java.io.File;
  -import java.io.IOException;
   import java.io.InputStream;
  -import java.io.OutputStream;
  +import java.io.IOException;
   import java.io.PrintStream;
  +import java.io.OutputStream;
  +import java.io.ByteArrayInputStream;
  +import java.io.ByteArrayOutputStream;
   import java.io.UnsupportedEncodingException;
   
  -import java.util.Enumeration;
  +import java.util.Vector;
  +import java.util.Iterator;
   import java.util.Properties;
  +import java.util.Enumeration;
   import java.util.StringTokenizer;
  -import java.util.Vector;
  -import java.security.Security;
  +
   import java.security.Provider;
  +import java.security.Security;
   
   import javax.activation.DataHandler;
   import javax.activation.FileDataSource;
   
  -import javax.mail.Authenticator;
  -import javax.mail.PasswordAuthentication;
  -import javax.mail.Session;
   import javax.mail.Message;
  +import javax.mail.Session;
   import javax.mail.Transport;
  +import javax.mail.Authenticator;
   import javax.mail.MessagingException;
  -import javax.mail.internet.AddressException;
  -import javax.mail.internet.InternetAddress;
  -import javax.mail.internet.MimeBodyPart;
  +import javax.mail.PasswordAuthentication;
   import javax.mail.internet.MimeMessage;
  +import javax.mail.internet.MimeBodyPart;
   import javax.mail.internet.MimeMultipart;
  +import javax.mail.internet.InternetAddress;
  +import javax.mail.internet.AddressException;
   
   import org.apache.tools.ant.BuildException;
   
  @@ -62,59 +64,65 @@
       // To work properly with national charsets we have to use
       // implementation of interface javax.activation.DataSource
       /**
  +     * String data source implementation.
        * @since Ant 1.6
        */
       class StringDataSource implements javax.activation.DataSource {
  -      private String data = null;
  -      private String type = null;
  -      private String charset = null;
  -      private ByteArrayOutputStream out;
  -
  -      public InputStream getInputStream() throws IOException {
  -        if (data == null && out == null) {
  -          throw new IOException("No data");
  -        } else {
  -          if (out != null) {
  -            data = (data != null) ? data.concat(out.toString(charset)) : out.toString(charset);
  -            out = null;
  -          }
  -          return new ByteArrayInputStream(data.getBytes(charset));
  -        }
  -      }
  -
  -      public OutputStream getOutputStream() throws IOException {
  -        if (out == null) {
  -          out = new ByteArrayOutputStream();
  -        }
  -        return out;
  -      }
  -
  -      public void setContentType(String type) {
  -        this.type = type.toLowerCase();
  -      }
  -
  -      public String getContentType() {
  -        if (type != null && type.indexOf("charset") > 0 && type.startsWith("text/")) {
  -          return type;
  -        }
  -        // Must be like "text/plain; charset=windows-1251"
  -        return type != null ? type.concat("; charset=".concat(charset))
  -                            : "text/plain".concat("; charset=".concat(charset));
  -      }
  -
  -      public String getName() {
  -        return "StringDataSource";
  -      }
  -      public void setCharset(String charset) {
  -        this.charset = charset;
  -      }
  -      public String getCharset() {
  -        return charset;
  -      }
  -  }
  +        private String data = null;
  +        private String type = null;
  +        private String charset = null;
  +        private ByteArrayOutputStream out;
  +
  +        public InputStream getInputStream() throws IOException {
  +            if (data == null && out == null) {
  +                throw new IOException("No data");
  +            }
  +            if (out != null) {
  +                String encodedOut = out.toString(charset);
  +                data = (data != null) ? data.concat(encodedOut) : encodedOut;
  +                out = null;
  +            }
  +            return new ByteArrayInputStream(data.getBytes(charset));
  +        }
  +
  +        public OutputStream getOutputStream() throws IOException {
  +            out = (out == null) ? new ByteArrayOutputStream() : out;
  +            return out;
  +        }
  +
  +        public void setContentType(String type) {
  +            this.type = type.toLowerCase();
  +        }
  +
  +        public String getContentType() {
  +            if (type != null && type.indexOf("charset") > 0
  +                && type.startsWith("text/")) {
  +                return type;
  +            }
  +            // Must be like "text/plain; charset=windows-1251"
  +            return new StringBuffer(type != null ? type : "text/plain").append(
  +                "; charset=").append(charset).toString();
  +        }
  +
  +        public String getName() {
  +            return "StringDataSource";
  +        }
  +
  +        public void setCharset(String charset) {
  +            this.charset = charset;
  +        }
   
  -  /** Sends the email  */
  -  public void send() {
  +        public String getCharset() {
  +            return charset;
  +        }
  +    }
  +
  +    /**
  +     * Send the email.
  +     *
  +     * @throws BuildException if the email can't be sent.
  +     */
  +    public void send() {
           try {
               Properties props = new Properties();
   
  @@ -128,8 +136,8 @@
               Authenticator auth;
               if (SSL) {
                   try {
  -                    Provider p
  -                        = (Provider) Class.forName("com.sun.net.ssl.internal.ssl.Provider").newInstance();
  +                    Provider p = (Provider) Class.forName(
  +                        "com.sun.net.ssl.internal.ssl.Provider").newInstance();
                       Security.addProvider(p);
                   } catch (Exception e) {
                       throw new BuildException("could not instantiate ssl "
  @@ -183,7 +191,6 @@
                       message.setCharset(charset);
                   }
               }
  -
               // Using javax.activation.DataSource paradigm
               StringDataSource sds = new StringDataSource();
               sds.setContentType(message.getMimeType());
  @@ -194,6 +201,10 @@
               }
               msg.addHeader("Date", getDate());
   
  +            for (Iterator iter = headers.iterator(); iter.hasNext();) {
  +                Header h = (Header) iter.next();
  +                msg.addHeader(h.getName(), h.getValue());
  +            }
               PrintStream out = new PrintStream(sds.getOutputStream());
               message.print(out);
               out.close();
  @@ -222,7 +233,6 @@
                   body.setFileName(file.getName());
                   attachments.addBodyPart(body);
               }
  -
               msg.setContent(attachments);
               Transport.send(msg);
           } catch (MessagingException e) {
  @@ -232,24 +242,19 @@
           }
       }
   
  -
       private static InternetAddress[] internetAddresses(Vector list)
  -         throws AddressException, UnsupportedEncodingException {
  +        throws AddressException, UnsupportedEncodingException {
           InternetAddress[] addrs = new InternetAddress[list.size()];
   
           for (int i = 0; i < list.size(); ++i) {
               EmailAddress addr = (EmailAddress) list.elementAt(i);
   
  -            if (addr.getName() == null) {
  -                addrs[i] = new InternetAddress(addr.getAddress());
  -            } else {
  -                addrs[i] = new InternetAddress(addr.getAddress(),
  -                    addr.getName());
  -            }
  +            String name = addr.getName();
  +            addrs[i] = (name == null)
  +                ? new InternetAddress(addr.getAddress())
  +                : new InternetAddress(addr.getAddress(), name);
           }
  -
           return addrs;
  -
       }
   
       private String parseCharSetFromMimeType(String type) {
  
  
  
  1.16      +7 -11     ant/src/main/org/apache/tools/ant/taskdefs/email/PlainMailer.java
  
  Index: PlainMailer.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/email/PlainMailer.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- PlainMailer.java	9 Mar 2004 16:48:14 -0000	1.15
  +++ PlainMailer.java	2 Feb 2005 20:08:57 -0000	1.16
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2002-2004 The Apache Software Foundation
  + * Copyright  2002-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -48,44 +48,40 @@
               while (e.hasMoreElements()) {
                   mailMessage.replyto(e.nextElement().toString());
               }
  -
               e = toList.elements();
               while (e.hasMoreElements()) {
                   mailMessage.to(e.nextElement().toString());
               }
  -
               e = ccList.elements();
               while (e.hasMoreElements()) {
                   mailMessage.cc(e.nextElement().toString());
               }
  -
               e = bccList.elements();
               while (e.hasMoreElements()) {
                   mailMessage.bcc(e.nextElement().toString());
               }
  -
               if (subject != null) {
                   mailMessage.setSubject(subject);
               }
  -
               mailMessage.setHeader("Date", getDate());
               if (message.getCharset() != null) {
                   mailMessage.setHeader("Content-Type", message.getMimeType()
                       + "; charset=\"" + message.getCharset() + "\"");
  -
               } else {
                   mailMessage.setHeader("Content-Type", message.getMimeType());
               }
  +            e = headers.elements();
  +            while (e.hasMoreElements()) {
  +                Header h = (Header) e.nextElement();
  +                mailMessage.setHeader(h.getName(), h.getValue());
  +            }
               PrintStream out = mailMessage.getPrintStream();
               message.print(out);
   
               e = files.elements();
               while (e.hasMoreElements()) {
  -                File file = (File) e.nextElement();
  -
  -                attach(file, out);
  +                attach((File) e.nextElement(), out);
               }
  -
               mailMessage.sendAndClose();
           } catch (IOException ioe) {
               throw new BuildException("IO error sending mail", ioe);
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/email/Header.java
  
  Index: Header.java
  ===================================================================
  /*
   * Copyright 2005 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
   */
  
  package org.apache.tools.ant.taskdefs.email;
  
  /**
   * Class representing a generic e-mail header.
   * @since Ant 1.7
   */
  public class Header {
      private String name;
      private String value;
  
      /**
       * Set the name of this Header.
       * @param name the name to set.
       */
      public void setName(String name) {
          this.name = name;
      }
  
      /**
       * Get the name of this Header.
       * @return name as String.
       */
      public String getName() {
          return name;
      }
  
      /**
       * Set the value of this Header.
       * @param value the value to set.
       */
      public void setValue(String value) {
          this.value = value;
      }
  
      /**
       * Get the value of this Header.
       * @return value as String.
       */
      public String getValue() {
          return value;
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org