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><message></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 © 2000-2004 The Apache Software Foundation. All rights
+<p align="center">Copyright © 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