Return-Path: Delivered-To: apmail-ant-dev-archive@www.apache.org Received: (qmail 45656 invoked from network); 2 Feb 2005 20:09:03 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 2 Feb 2005 20:09:03 -0000 Received: (qmail 9677 invoked by uid 500); 2 Feb 2005 20:09:01 -0000 Delivered-To: apmail-ant-dev-archive@ant.apache.org Received: (qmail 9612 invoked by uid 500); 2 Feb 2005 20:09:00 -0000 Mailing-List: contact dev-help@ant.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Ant Developers List" Reply-To: "Ant Developers List" Delivered-To: mailing list dev@ant.apache.org Received: (qmail 9592 invoked by uid 500); 2 Feb 2005 20:09:00 -0000 Received: (qmail 9584 invoked by uid 99); 2 Feb 2005 20:09:00 -0000 X-ASF-Spam-Status: No, hits=-9.8 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Wed, 02 Feb 2005 12:08:59 -0800 Received: (qmail 45443 invoked by uid 1818); 2 Feb 2005 20:08:58 -0000 Date: 2 Feb 2005 20:08:58 -0000 Message-ID: <20050202200858.45442.qmail@minotaur.apache.org> From: mbenson@apache.org To: ant-cvs@apache.org Subject: cvs commit: ant/src/main/org/apache/tools/ant/taskdefs/email Header.java EmailTask.java Mailer.java MimeMailer.java PlainMailer.java X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N 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 <message> element.

+

header

+

Since Ant 1.7, arbitrary mail headers can be added by + specifying these attributes on one or more nested header elements:

+ + + + + + + + + + + + + + + + + +
AttributeDescriptionRequired
nameThe name associated with this mail header.Yes
valueThe value to assign to this mail header.Yes
+ +

It is permissible to duplicate the name attribute amongst multiple headers. +

+

Examples

  @@ -259,7 +284,7 @@
   Test Build, the message body being coded in UTF-8
   
   
-

Copyright © 2000-2004 The Apache Software Foundation. All rights +

Copyright © 2000-2005 The Apache Software Foundation. All rights Reserved.

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 mime + * encoding is not a mime. * @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