Browse Source

* Added new combined email task, which replaces the old <mail> and

<mimemail> tasks.

* Deprecated <mimemail> task, and old SendEmail and MimeMail classes.

Submitted by Rob Oxspring <roxspring@yahoo.com>.


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271148 13f79535-47bb-0310-9956-ffa450edef68
master
adammurdoch 23 years ago
parent
commit
e0fef5cf64
15 changed files with 1616 additions and 600 deletions
  1. +6
    -1
      build.xml
  2. +127
    -25
      docs/manual/CoreTasks/mail.html
  3. +8
    -5
      docs/manual/OptionalTasks/mimemail.html
  4. +2
    -2
      docs/manual/install.html
  5. +1
    -1
      docs/manual/optionaltasklist.html
  6. +8
    -205
      src/main/org/apache/tools/ant/taskdefs/SendEmail.java
  7. +1
    -1
      src/main/org/apache/tools/ant/taskdefs/defaults.properties
  8. +127
    -0
      src/main/org/apache/tools/ant/taskdefs/email/EmailAddress.java
  9. +529
    -0
      src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java
  10. +173
    -0
      src/main/org/apache/tools/ant/taskdefs/email/Mailer.java
  11. +168
    -0
      src/main/org/apache/tools/ant/taskdefs/email/Message.java
  12. +184
    -0
      src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java
  13. +175
    -0
      src/main/org/apache/tools/ant/taskdefs/email/PlainMailer.java
  14. +95
    -0
      src/main/org/apache/tools/ant/taskdefs/email/UUMailer.java
  15. +12
    -360
      src/main/org/apache/tools/ant/taskdefs/optional/net/MimeMail.java

+ 6
- 1
build.xml View File

@@ -189,6 +189,9 @@
<available property="bcel.present"
classname="org.apache.bcel.Constants"
classpathref="classpath" />
<available property="sunuue.present"
classname="sun.misc.UUEncoder"
classpathref="classpath" />

<condition property="javamail.complete">
<and>
@@ -269,6 +272,9 @@
<exclude name="${ant.package}/listener/Log4jListener.java"
unless="log4j.present" />

<exclude name="${ant.package}/taskdefs/email/UUMailer.java" unless="sunuue.present" />
<exclude name="${ant.package}/taskdefs/email/MimeMailer.java" unless="javamail.complete" />

<exclude name="${optional.package}/IContract.java" unless="icontract.present" />
<exclude name="${optional.package}/Script.java" unless="bsf.present" />
<exclude name="${optional.package}/StyleBook.java" unless="stylebook.present" />
@@ -286,7 +292,6 @@
<exclude name="${optional.package}/ejb/IPlanet*.java" unless="ejbjar.support" />
<exclude name="${optional.package}/Javah.java" unless="jdk1.2+" />
<exclude name="${optional.package}/junit/*" unless="junit.present" />
<exclude name="${optional.package}/net/MimeMail.java" unless="javamail.complete" />
<exclude name="${optional.package}/net/FTP.java" unless="netcomp.present" />
<exclude name="${optional.package}/net/TelnetTask.java" unless="netcomp.present" />
<exclude name="${optional.package}/scm/AntStarTeam*.java" unless="starteam.present" />


+ 127
- 25
docs/manual/CoreTasks/mail.html View File

@@ -9,9 +9,10 @@

<h2><a name="mail">Mail</a></h2>
<h3>Description</h3>
<p>A task to send SMTP email. Text and text files to include in the message
body may be specified. To send binary attachments the optional
<a href="../OptionalTasks/mimemail.html">MimeMail</a> task should be used instead</p>
<p>A task to send SMTP email. This task can send mail using either plain
text, uu encoding or Mime format mail depending on what is available.
Attachments may be sent using nested
<a href="../CoreTypes/fileset.html">fileset</a> elements.</p>

<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -23,45 +24,75 @@ body may be specified. To send binary attachments the optional
<tr>
<td valign="top">from</td>
<td valign="top">Email address of sender.</td>
<td align="center" valign="top">Yes</td>
<td align="center" valign="top">Either a <code>from</code> attribute, or a <code>&lt;from&gt;</code>
element.</td>
</tr>
<tr>
<td valign="top">tolist</td>
<td valign="top">Comma-separated list of recipients.</td>
<td align="center" valign="top">Yes</td>
<td align="center" valign="middle" rowspan="3">At least one of these, or the
equivalent elements.</td>
</tr>
<tr>
<td valign="top">cclist</td>
<td valign="top">Comma-separated list of recipients to carbon copy</td>
</tr>
<tr>
<td valign="top">bcclist</td>
<td valign="top">Comma-separated list of recipients to carbon copy</td>
</tr>
<tr>
<td valign="top">message</td>
<td valign="top">Message to send in the body of the email.</td>
<td align="center" valign="middle" rowspan="2">One of the two</td>
<td align="center" valign="middle" rowspan="2">One of these or a
<code>&lt;message&gt;</code> element.</td>
</tr>
<tr>
<td valign="top">messagefile</td>
<td valign="top">File to send as the body of the email.</td>
</tr>
<td valign="top">messagemimetype</td>
<td valign="top">The content type of the message. The default is
<code>text/plain</code>.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">files</td>
<td valign="top">Filename(s) of text to send in the body of the email.
Multiple files are comma-separated.</td>
<td valign="top">Files to send as attachments to the email. Separate multiple
file names using a comma. You can also use <code>&lt;fileset&gt;</code>
elements to specify files.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">failonerror</td>
<td valign="top">flag to indicate whether to halt the build on
any error.</td>
<td align="center" valign="top">No, default is <I>true</I></td>
</tr>
<td valign="top">flag to indicate whether to halt the build on
any error. The default value is <code>true</code>.</td>
<td align="center" valign="top">No.</td>
</tr>
<tr>
<td valign="top">includefilenames</td>
<td valign="top">Include filename(s) before file contents.
Valid only when the files attribute is specified.</td>
<td align="center" valign="top">No, default is <I>false</I></td>
Valid only when the <code>plain</code> encoding is used. The default
value is <code>false</code>.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">mailhost</td>
<td valign="top">Host name of the mail server.</td>
<td align="center" valign="top">No, default is &quot;localhost&quot;</td>
<td valign="top">Host name of the SMTP server. The default value is
<code>localhost</code>.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">mailport</td>
<td valign="top">Port of the mail server.</td>
<td align="center" valign="top">No, default to SMTP default (25)</td>
<td valign="top">TCP port of the SMTP server. The default value is 25.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">encoding</td>
<td valign="top">Specifies the encoding to use for the content of the email.
Values are <code>mime</code>, <code>uu</code>, <code>plain</code>, or
<code>auto</code>. The default value is <code>auto</code>.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">subject</td>
@@ -69,13 +100,84 @@ body may be specified. To send binary attachments the optional
<td align="center" valign="top">No</td>
</tr>
</table>

<h3>Parameters specified as nested elements</h3>

<h4>to / cc / bcc / from</h4>
<p>Adds an email address element. It takes the following attributes:</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 display name for the address.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">address</td>
<td valign="top">The email address.</td>
<td align="center" valign="top">Yes</td>
</tr>
</table>

<h4>message</h4>

<p>Specifies the message to include in the email body. It takes the following
attributes:</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">src</td>
<td valign="top">The file to use as the message.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">mimetype</td>
<td valign="top">The content type to use for the message.</td>
<td align="center" valign="top">No</td>
</tr>
</table>

<p>If the <code>src</code> attribute is not specified, then text can be added
inside the <code>&lt;message&gt;</code> element.</p>

<h3>Examples</h3>
<pre>
&lt;mail from=&quot;me&quot; tolist=&quot;you&quot; subject=&quot;Results of nightly build&quot;
files=&quot;build.log&quot;/&gt;</pre>
<p>Sends an eMail from <i>me</i> to <i>you</i> with a subject of
<i>Results of nightly build</i> and includes the contents of <i>build.log</i>
in the body of the message.</p>

<blockquote><pre>
&lt;mail from=&quot;me&quot;
tolist=&quot;you&quot;
subject=&quot;Results of nightly build&quot;
files=&quot;build.log&quot; /&gt;
</pre></blockquote>

<p>Sends an email from <i>me</i> to <i>you</i> with a subject of
<i>Results of nightly build</i> and includes the contents of the file
<i>build.log</i> in the body of the message.</p>

<blockquote><pre>
&lt;mail mailhost=&quot;smtp.myisp.com&quot; mailport=&quot;1025&quot; subject=&quot;Test build&quot;&gt;
&lt;from name=&quot;me@myisp.com&quot;&gt;
&lt;to name=&quot;all@xyz.com&quot;&gt;
&lt;message&gt;A new nightly build has completed&lt;/message&gt;
&lt;fileset dir=&quot;dist&quot;&gt;
&lt;includes name=&quot;**/*.zip&quot;/&gt;
&lt;/fileset&gt;
&lt;/mail&gt;
</pre></blockquote>

<p>Sends an eMail from <i>me@myisp.com</i> to <i>all@xyz.com</i> with a subject of
<i>Test Build</i> and attaches any zip files from the dist directory.&nbsp; The
task will attempt to use JavaMail and fall back to UU encoding or no encoding in
that order depending on what support classes are available.</p>
<hr>
<p align="center">Copyright &copy; 2001-2002 Apache Software Foundation. All rights
Reserved.</p>


+ 8
- 5
docs/manual/OptionalTasks/mimemail.html View File

@@ -8,10 +8,13 @@
<body>

<h2><a name="mimemail">MimeMail</a></h2>

<h3><i>Deprecated</i></h3>
<p><i>This task has been deprecated. Use the <a href="../CoreTasks/mail.html">mail</a> task instead.</i></p>

<h3>Description</h3>
<p>Sends SMTP mail with MIME attachments.&nbsp;&nbsp; If&nbsp; no attachments
are needed, use the built-in <a href="../CoreTasks/mail.html">Mail</a>
task.&nbsp; <a href="http://java.sun.com/products/javamail/index.html">JavaMail</a>
<p>Sends SMTP mail with MIME attachments.
<a href="http://java.sun.com/products/javamail/index.html">JavaMail</a>
and <a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">Java
Activation Framework</a> are required for this task.</p>
<p>Multiple files can be attached using <a href="../CoreTypes/fileset.html">FileSets.</a></p>
@@ -79,7 +82,7 @@ Activation Framework</a> are required for this task.</p>
</table>
<h3>Examples</h3>
<p><b>Send a single HTML file as the body of a message</b></p>
<pre> &lt;mimemail messageMimeType=&quot;text/html&quot; messageFile=&quot;overview-summary.html&quot;
<pre> &lt;mimemail messageMimeType=&quot;text/html&quot; messageFile=&quot;overview-summary.html&quot;
tolist=&quot;you&quot; subject=&quot;JUnit Test Results: ${TODAY}&quot; from=&quot;me&quot;/&gt;</pre>
<p><b>Sends all files in a directory as attachments</b></p>
<pre> &lt;mimemail message=&quot;See attached files&quot; tolist=&quot;you&quot; subject=&quot;Attachments&quot; from=&quot;me&quot;&gt;
@@ -88,7 +91,7 @@ Activation Framework</a> are required for this task.</p>
&lt;/fileset&gt;
&lt;/mimemail&gt;
</pre>
<hr><p align="center">Copyright &copy; 2001 Apache Software Foundation. All rights
<hr><p align="center">Copyright &copy; 2001-2002 Apache Software Foundation. All rights
Reserved.</p>

</body>


+ 2
- 2
docs/manual/install.html View File

@@ -342,13 +342,13 @@ Installing Ant / Optional Tasks</a> section above.</p>
</tr>
<tr>
<td>mail.jar</td>
<td>MimeMail task</td>
<td>Mail task with Mime encoding, and the MimeMail task</td>
<td><a href="http://java.sun.com/products/javamail/"
target="_top">http://java.sun.com/products/javamail/</a></td>
</tr>
<tr>
<td>activation.jar</td>
<td>MimeMail task</td>
<td>Mail task with Mime encoding, and the MimeMail task</td>
<td><a href="http://java.sun.com/products/javabeans/glasgow/jaf.html"
target="_top">http://java.sun.com/products/javabeans/glasgow/jaf.html</a></td>
</tr>


+ 1
- 1
docs/manual/optionaltasklist.html View File

@@ -31,7 +31,7 @@
<a href="OptionalTasks/junitreport.html">JUnitReport</a><br>
<a href="OptionalTasks/mmetrics.html">Metamata Metrics</a><br>
<a href="OptionalTasks/maudit.html">Metamata Audit</a><br>
<a href="OptionalTasks/mimemail.html">MimeMail</a><br>
<a href="OptionalTasks/mimemail.html"><i>MimeMail</i></a><br>
<a href="OptionalTasks/mparse.html">MParse</a><br>
<a href="OptionalTasks/native2ascii.html">Native2Ascii</a><br>
<a href="OptionalTasks/netrexxc.html">NetRexxC</a><br>


+ 8
- 205
src/main/org/apache/tools/ant/taskdefs/SendEmail.java View File

@@ -51,23 +51,10 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs;

import java.io.PrintStream;
import java.io.File;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Vector;
import java.util.StringTokenizer;
import java.util.Enumeration;
import org.apache.tools.mail.ErrorInQuitException;
import org.apache.tools.mail.MailMessage;
package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.email.EmailTask;

/**
* A task to send SMTP email.
@@ -119,200 +106,16 @@ import org.apache.tools.ant.BuildException;
* @author glenn_twiggs@bmc.com
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
*/
public class SendEmail extends Task {
private String from;
private String mailhost = "localhost";
private int mailport = MailMessage.DEFAULT_PORT;
private String message;
private String toList;
private String subject;
private Vector files = new Vector();
private boolean includefilenames;
/**
* failure flag
*/
private boolean failOnError = true;
/** Creates new SendEmail */
public SendEmail() {
}

/**
* Sets the toList parameter of this build task.
*
* @param toList Comma-separated list of email recipient addreses.
*/
public void setToList(String toList) {
this.toList = toList;
}
/**
* Sets the from parameter of this build task.
*
* @param from Email address of sender.
*/
public void setFrom(String from) {
this.from = from;
}
/**
* Sets the mailhost parameter of this build task.
*
* @param mailhost Mail host name.
*/
public void setMailhost(String mailhost) {
this.mailhost = mailhost;
}

public class SendEmail extends EmailTask
{
/**
* Sets the mailport parameter of this build task.
* @param value mail port name.
*/
public void setMailport(Integer value){
this.mailport = value.intValue();
}

/**
* Sets the message parameter of this build task.
*
* @param message Message body of this email.
*/
public void setMessage(String message) {
this.message = message;
}
/**
* Sets the subject parameter of this build task.
*
* @param subject Subject of this email.
*/
public void setSubject(String subject) {
this.subject = subject;
}

/**
* Sets the file parameter of this build task.
*
* @param filenames Filenames to include as the message body of this email.
*/
public void setFiles(String filenames) {
StringTokenizer t = new StringTokenizer(filenames, ", ");
while (t.hasMoreTokens()) {
files.addElement(project.resolveFile(t.nextToken()));
}
}

/**
* Sets Includefilenames attribute
*
* @param includefilenames Set to true if file names are to be included.
* @since 1.5
*/
public void setIncludefilenames(boolean includefilenames) {
this.includefilenames = includefilenames;
}

/**
* Sets the FailOnError attribute of the MimeMail object
*
* @param failOnError The new FailOnError value
* @since 1.5
* @deprecated Use {@link #setMailport(int)} instead.
*/
public void setFailOnError(boolean failOnError) {
this.failOnError = failOnError;
public void setMailport( Integer value )
{
setMailport( value.intValue() );
}
/**
* Executes this build task.
*
* @throws BuildException if there is an error during task execution.
*/
public void execute() throws BuildException {
try {
MailMessage mailMessage = new MailMessage(mailhost);
mailMessage.setPort(mailport);

if (from != null) {
mailMessage.from(from);
} else {
throw new BuildException("Attribute \"from\" is required.");
}

if (toList != null) {
StringTokenizer t = new StringTokenizer(toList, ", ", false);

while (t.hasMoreTokens()) {
mailMessage.to(t.nextToken());
}
} else {
throw new BuildException("Attribute \"toList\" is required.");
}

if (subject != null) {
mailMessage.setSubject(subject);
}

if (!files.isEmpty()) {
PrintStream out = mailMessage.getPrintStream();

for (Enumeration e = files.elements(); e.hasMoreElements(); ) {
File file = (File)e.nextElement();

if (file.exists() && file.canRead()) {
int bufsize = 1024;
int length;
byte[] buf = new byte[bufsize];
if (includefilenames) {
String filename = file.getName();
int filenamelength = filename.length();
out.println(filename);
for (int star=0; star < filenamelength; star++) {
out.print('=');
}
out.println();
}
BufferedInputStream in = null;
try {
in = new BufferedInputStream(
new FileInputStream(file), bufsize);
while ((length = in.read(buf, 0, bufsize)) != -1) {
out.write(buf, 0, length);
}
if (includefilenames) {
out.println();
}
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ioe) {}
}
}

} else {
throw new BuildException("File \"" + file.getName()
+ "\" does not exist or is not readable.");
}
}
} else if (message != null) {
PrintStream out = mailMessage.getPrintStream();
out.print(message);
} else {
throw new BuildException("Attribute \"file\" or \"message\" is required.");
}

log("Sending email");
mailMessage.sendAndClose();
} catch (IOException ioe) {
String err="IO error sending mail: "+ioe.toString();
if (!failOnError || ioe instanceof ErrorInQuitException) {
log(err, Project.MSG_ERR);
} else {
throw new BuildException(err,ioe,location);
}
}
}

}

+ 1
- 1
src/main/org/apache/tools/ant/taskdefs/defaults.properties View File

@@ -38,7 +38,7 @@ antstructure=org.apache.tools.ant.taskdefs.AntStructure
execon=org.apache.tools.ant.taskdefs.ExecuteOn
antcall=org.apache.tools.ant.taskdefs.CallTarget
sql=org.apache.tools.ant.taskdefs.SQLExec
mail=org.apache.tools.ant.taskdefs.SendEmail
mail=org.apache.tools.ant.taskdefs.email.EmailTask
fail=org.apache.tools.ant.taskdefs.Exit
war=org.apache.tools.ant.taskdefs.War
uptodate=org.apache.tools.ant.taskdefs.UpToDate


+ 127
- 0
src/main/org/apache/tools/ant/taskdefs/email/EmailAddress.java View File

@@ -0,0 +1,127 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

/**
* Holds an email address.
*
* @author roxspring@yahoo.com Rob Oxspring
* @since 1.5
*/
public class EmailAddress
{
private String name;
private String address;

/** Creates an empty email address
*/
public EmailAddress()
{
}

/** Creates a new email address based on the given string
* @param address the email address
*/
public EmailAddress( String address )
{
this.address = address;
}

/** sets the personal / display name of the address
* @param name the display name
*/
public void setName( String name )
{
this.name = name;
}

/** sets the email address
* @param address the actual email address
*/
public void setAddress( String address )
{
this.address = address;
}

/** Constructs a string "name &lt;address&gt;" or "address"
* @return a string representation of the address
*/
public String toString()
{
if( name == null )
{
return address;
}
else
{
return name + " <" + address + ">";
}
}

/** returns the address
* @return the address part
*/
public String getAddress()
{
return address;
}

/** returns the display name
* @return the display name part
*/
public String getName()
{
return name;
}
}

+ 529
- 0
src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java View File

@@ -0,0 +1,529 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

// Ant imports

import java.io.File;
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;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileSet;

/**
* A task to send SMTP email. This is a refactoring of the SendMail and MimeMail
* tasks such that both are within a single task. The functionality of SendMail can
* be found in {@link org.apache.tools.ant.taskdefs.email.PlainMailer PlainMailer},
* MimeMail in {@link org.apache.tools.ant.taskdefs.email.MimeMailer MimeMailer},
* and a new intermediate UU format.
* {@link org.apache.tools.ant.taskdefs.email.UUMailer UUMailer}.
*
* @author Magesh Umasankar
* @author glenn_twiggs@bmc.com
* @author steve_l@iseran.com steve loughran
* @author erik@hatcher.net Erik Hatcher
* @author paulo.gaspar@krankikom.de Paulo Gaspar
* @author roxspring@yahoo.com Rob Oxspring
* @created 10 Dec 2001
* @since 1.5
*/
public class EmailTask
extends Task
{
/** Constant to show that the best available mailer should be used.
*/
public final static String AUTO = "auto";
/** Constant to allow the Mime mailer to be requested
*/
public final static String MIME = "mime";
/** Constant to allow the UU mailer to be requested
*/
public final static String UU = "uu";
/** Constant to allow the plaintext mailer to be requested
*/
public final static String PLAIN = "plain";

/** Enumerates the encoding constants
*/
public static class Encoding extends EnumeratedAttribute
{
/** finds the valid encoding values
* @return a list of valid entries
*/
public String[] getValues()
{
return new String[]
{AUTO, MIME, UU, PLAIN};
}
}

private String encoding = AUTO;
/**
* host running SMTP
*/
private String host = "localhost";
private int port = 25;
/**
* subject field
*/
private String subject = null;
/**
* any text
*/
private Message message = null;
/** failure flag */
private boolean failOnError = true;
private boolean includeFileNames = false;
private boolean simpleMessage = false;
private String messageMimeType = null;

/**
* sender
*/
private EmailAddress from = null;
/**
* TO recipients
*/
private Vector toList = new Vector();
/**
* CC (Carbon Copy) recipients
*/
private Vector ccList = new Vector();
/**
* BCC (Blind Carbon Copy) recipients
*/
private Vector bccList = new Vector();

/**
* file list
*/
private Vector files = new Vector();
private Vector filesets = new Vector();

/** Allows the build writer to choose the preferred encoding method
* @param encoding The encoding (one of AUTO,MIME,UU,PLAIN)
*/
public void setEncoding( Encoding encoding )
{
this.encoding = encoding.getValue();
}

/** Sets the mail server port
* @see setPort(int)
* @param port The port to use
*/
public void setMailport( int port )
{
this.port = port;
}

/** Sets the host
* @see setHost()
* @param host The host to connect to
*/
public void setMailhost( String host )
{
this.host = host;
}

/** Sets the subject line of the email
*
* @param subject Subject of this email.
*/
public void setSubject( String subject )
{
this.subject = subject;
}

/** Shorthand method to set the message
* @param message Message body of this email.
*/
public void setMessage( String message )
{
if( this.message != null )
{
throw new BuildException( "Only one message can be sent in an email" );
}

this.message = new Message( message );
}

/** Shorthand method to set the message from a file
* @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 );
}

/** 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
*/
public void setMessageMimeType( String type )
{
this.messageMimeType = type;
}

/** Add a message elemnt
* @param message The message object
* @throws BuildException if a message has already been added
*/
public void addMessage( Message message )
throws BuildException
{
if( this.message != null )
{
throw new BuildException( "Only one message can be sent in an email" );
}

this.message = message;
}

/** Adds a from address element
* @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
*
* @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 to address element
* @param address An email address
*/
public void addTo( EmailAddress address )
{
toList.addElement( address );
}

/** Adds "to" address elements
*
*
* @param list Comma separated list of addresses
*/
public void setToList( String list )
{
StringTokenizer tokens = new StringTokenizer( list, "," );

while( tokens.hasMoreTokens() )
{
toList.addElement( new EmailAddress( tokens.nextToken() ) );
}
}

/** Adds "cc" address element
* @param address The email address
*/
public void addCc( EmailAddress address )
{
ccList.addElement( address );
}

/** Adds "cc" address elements
*
*
* @param list Comma separated list of addresses
*/
public void setCcList( String list )
{
StringTokenizer tokens = new StringTokenizer( list, "," );

while( tokens.hasMoreTokens() )
{
ccList.addElement( new EmailAddress( tokens.nextToken() ) );
}
}

/** Adds "bcc" address elements
* @param address The email address
*/
public void addBcc( EmailAddress address )
{
bccList.addElement( address );
}

/** Adds "bcc" address elements
*
*
* @param list comma separated list of addresses
*/
public void setBccList( String list )
{
StringTokenizer tokens = new StringTokenizer( list, "," );

while( tokens.hasMoreTokens() )
{
bccList.addElement( new EmailAddress( tokens.nextToken() ) );
}
}

/** Indicates whether BuildExceptions should be passed back to the core
*
* @param failOnError The new FailOnError value
*/
public void setFailOnError( boolean failOnError )
{
this.failOnError = failOnError;
}

/** Adds a list of files to be attached
*
* @param filenames Comma separated list of files
*/
public void setFiles( String filenames )
{
StringTokenizer t = new StringTokenizer( filenames, ", " );

while( t.hasMoreTokens() )
{
files.addElement( project.resolveFile( t.nextToken() ) );
}
}

/** Adds a set of files (nested fileset attribute).
* @param fs The fileset
*/
public void addFileset( FileSet fs )
{
filesets.addElement( fs );
}

/** Sets Includefilenames attribute
*
* @param includeFileNames Whether to include filenames in the text of the message
*/
public void setIncludefilenames( boolean includeFileNames )
{
this.includeFileNames = includeFileNames;
}

/** Identifies whether file names should be included
* @return Identifies whether file names should be included
*/
public boolean getIncludeFileNames()
{
return includeFileNames;
}

/** Sends an email
*/
public void execute()
{
try
{
Mailer mailer = null;

// prepare for the auto select mechanism
boolean autoFound = false;

// try MIME format
if( encoding.equals( MIME ) || ( encoding.equals( AUTO ) && !autoFound ) )
{
try
{
mailer = (Mailer)getClass().forName( "org.apache.tools.ant.taskdefs.email.MimeMailer" ).newInstance();
autoFound = true;
log( "Using MIME mail", Project.MSG_VERBOSE );
}
catch( Throwable e )
{
log( "Failed to initialise MIME mail", Project.MSG_WARN );
}
}

// try UU format
if( encoding.equals( UU ) || ( encoding.equals( AUTO ) && !autoFound ) )
{
try
{
mailer = (Mailer)getClass().forName( "org.apache.tools.ant.taskdefs.email.UUMailer" ).newInstance();
autoFound = true;
log( "Using UU mail", Project.MSG_VERBOSE );
}
catch( Throwable e )
{
log( "Failed to initialise UU mail", Project.MSG_WARN );
}
}

// try plain format
if( encoding.equals( PLAIN ) || ( encoding.equals( AUTO ) && !autoFound ) )
{
mailer = new PlainMailer();
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 )
{
throw new BuildException( "A message is required" );
}

// 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 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 );
}
}

// identify which files should be attached
Enumeration e = filesets.elements();
while( e.hasMoreElements() )
{
FileSet fs = (FileSet)e.nextElement();

DirectoryScanner ds = fs.getDirectoryScanner( project );
String[] includedFiles = ds.getIncludedFiles();
File baseDir = ds.getBasedir();

for( int j = 0; j < includedFiles.length; ++j )
{
File file = new File( baseDir, includedFiles[ j ] );
files.addElement( file );
}
}

// let the user know what's going to happen
log( "Sending email: " + subject, Project.MSG_INFO );
log( "From " + from, Project.MSG_VERBOSE );
log( "To " + toList, Project.MSG_VERBOSE );
log( "Cc " + ccList, Project.MSG_VERBOSE );
log( "Bcc " + bccList, Project.MSG_VERBOSE );

// pass the params to the mailer
mailer.setHost( host );
mailer.setPort( port );
mailer.setMessage( message );
mailer.setFrom( from );
mailer.setToList( toList );
mailer.setCcList( ccList );
mailer.setBccList( bccList );
mailer.setFiles( files );
mailer.setSubject( subject );
mailer.setTask( this );
mailer.setIncludeFileNames( includeFileNames );

// send the email
mailer.send();

// let the user know what happened
int count = files.size();
log( "Sent email with " + count + " attachment" + ( count == 1?"":"s" ), Project.MSG_INFO );
}
catch( BuildException e )
{
log( "Failed to send email", Project.MSG_WARN );
if( failOnError )
{
throw e;
}
}
}
}


+ 173
- 0
src/main/org/apache/tools/ant/taskdefs/email/Mailer.java View File

@@ -0,0 +1,173 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

import java.util.Vector;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;

/**
* Base class for the various emailing implementations.
*
* @author roxspring@yahoo.com Rob Oxspring
* @since 1.5
*/
public abstract class Mailer
{
protected String host = null;
protected int port = -1;
protected Message message;
protected EmailAddress from;
protected Vector toList = null;
protected Vector ccList = null;
protected Vector bccList = null;
protected Vector files = null;
protected String subject = null;
protected Task task;
protected boolean includeFileNames = false;

/** sets the mail server
* @param host
*/
public void setHost( String host )
{
this.host = host;
}

/** sets the smtp port
* @param port
*/
public void setPort( int port )
{
this.port = port;
}

/** sets the message
* @param m
*/
public void setMessage( Message m )
{
this.message = m;
}

/** sets the address to send from
* @param from
*/
public void setFrom( EmailAddress from )
{
this.from = from;
}

/** set the to addresses
* @param list
*/
public void setToList( Vector list )
{
this.toList = list;
}

/** sets the cc addresses
* @param list
*/
public void setCcList( Vector list )
{
this.ccList = list;
}

/** sets the bcc addresses
* @param list
*/
public void setBccList( Vector list )
{
this.bccList = list;
}

/** sets the files to attach
* @param files
*/
public void setFiles( Vector files )
{
this.files = files;
}

/** sets the subject
* @param subject
*/
public void setSubject( String subject )
{
this.subject = subject;
}

/** sets the owning task
* @param task
*/
public void setTask( Task task )
{
this.task = task;
}

/** indicates whether filenames should be listed in the body
* @param b
*/
public void setIncludeFileNames( boolean b )
{
this.includeFileNames = b;
}

/** This method should send the email
* @throws BuildException
*/
public abstract void send()
throws BuildException;
}

+ 168
- 0
src/main/org/apache/tools/ant/taskdefs/email/Message.java View File

@@ -0,0 +1,168 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

/**
* Class representing an email message.
*
* @author roxspring@yahoo.com Rob Oxspring
* @since 1.5
*/
public class Message
{
private File messageSource = null;
private StringBuffer buffer = new StringBuffer();
private String mimeType = "text/plain";
private boolean specified = false;

/** creates a new empty message
*/
public Message()
{
}

/** Creates a new message based on the given string
* @param text the message
*/
public Message( String text )
{
addText( text );
}

/** Creates a new message using the contents of the given file.
* @param file the source of the message
*/
public Message( File file )
{
messageSource = file;
}

/** Adds a textual part of the message
* @param text some text to add
*/
public void addText( String text )
{
buffer.append( text );
}

/** Sets the source file of the message
* @param src the source of the message
*/
public void setSrc( File src )
{
this.messageSource = src;
}

/** Sets the content type for the message
* @param mimeType a mime type e.g. "text/plain"
*/
public void setMimeType( String mimeType )
{
this.mimeType = mimeType;
specified = true;
}

/** Returns the content type
* @return the mime type
*/
public String getMimeType()
{
return mimeType;
}

/** prints the message onto an output stream
* @param out The print stream to write to
* @throws IOException if an error occurs
*/
public void print( PrintStream out )
throws IOException
{
if( messageSource != null )
{
// Read message from a file
FileReader freader = new FileReader( messageSource );
try
{
BufferedReader in = new BufferedReader( freader );
String line = null;

while( ( line = in.readLine() ) != null )
{
out.println( line );
}
}
finally {
freader.close();
}
}
else
{
out.println( buffer );
}
}

/** returns true iff the mimeType has been set.
* @return false if the default value is in use
*/
public boolean isMimeTypeSpecified()
{
return specified;
}
}

+ 184
- 0
src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java View File

@@ -0,0 +1,184 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.tools.ant.BuildException;

/**
* Uses the JavaMail classes to send Mime format email.
*
* @author roxspring@yahoo.com Rob Oxspring
* @since 1.5
*/
public class MimeMailer
extends Mailer
{
/** Sends the email
*/
public void send()
{
try
{
Properties props = new Properties();
props.put( "mail.smtp.host", host );
props.put( "mail.smtp.port", String.valueOf( port ) );

//Aside, the JDK is clearly unaware of the scottish 'session', which
//involves excessive quantities of alcohol :-)
Session sesh = Session.getDefaultInstance( props, null );

//create the message
MimeMessage msg = new MimeMessage( sesh );
MimeMultipart attachments = new MimeMultipart();

//set the sender
if( from.getName() == null )
{
msg.setFrom( new InternetAddress( from.getAddress() ) );
}
else
{
msg.setFrom( new InternetAddress( from.getAddress(), from.getName() ) );
}

msg.setRecipients( Message.RecipientType.TO, internetAddresses( toList ) );
msg.setRecipients( Message.RecipientType.CC, internetAddresses( ccList ) );
msg.setRecipients( Message.RecipientType.BCC, internetAddresses( bccList ) );

if( subject != null )
{
msg.setSubject( subject );
}

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = new PrintStream( baos );
message.print( out );
out.close();

MimeBodyPart textbody = new MimeBodyPart();
textbody.setContent( baos.toString(), message.getMimeType() );
attachments.addBodyPart( textbody );

Enumeration e = files.elements();
while( e.hasMoreElements() )
{
File file = (File)e.nextElement();

MimeBodyPart body;
body = new MimeBodyPart();
if( !file.exists() || !file.canRead() )
{
throw new BuildException( "File \"" + file.getAbsolutePath()
+ "\" does not exist or is not readable." );
}
FileDataSource fileData = new FileDataSource( file );
DataHandler fileDataHandler = new DataHandler( fileData );
body.setDataHandler( fileDataHandler );
body.setFileName( file.getName() );
attachments.addBodyPart( body );
}

msg.setContent( attachments );
Transport.send( msg );
}
catch( MessagingException e )
{
throw new BuildException( "Problem while sending mime mail:", e );
}
catch( IOException e )
{
throw new BuildException( "Problem while sending mime mail:", e );
}
}

private static InternetAddress[] internetAddresses( Vector list )
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() );
}
}

return addrs;
}
}

+ 175
- 0
src/main/org/apache/tools/ant/taskdefs/email/PlainMailer.java View File

@@ -0,0 +1,175 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Enumeration;
import org.apache.tools.ant.BuildException;
import org.apache.tools.mail.MailMessage;

/**
* Class responsible for sending email through raw protocol methods.
*
* @author roxspring@yahoo.com Rob Oxspring
* @since 1.5
*/
public class PlainMailer
extends Mailer
{
/** Sends the email using the apache {@link org.apache.tools.mail.MailMessage MailMessage} class.
*/
public void send()
{
try
{
MailMessage mailMessage = new MailMessage( host );
mailMessage.setPort( port );

mailMessage.from( from.toString() );

Enumeration e;

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( "Content-Type", message.getMimeType() );

PrintStream out = mailMessage.getPrintStream();

message.print( out );

e = files.elements();
while( e.hasMoreElements() )
{
File file = (File)e.nextElement();
attach( file, out );
}

mailMessage.sendAndClose();
}
catch( IOException ioe )
{
throw new BuildException( "IO error sending mail", ioe );
}

}

/** Attaches a file to this email
* @param file The file to attache
* @param out The message stream to add to
* @throws IOException if errors occur
*/
protected void attach( File file, PrintStream out )
throws IOException
{
if( !file.exists() || !file.canRead() )
{
throw new BuildException( "File \"" + file.getName()
+ "\" does not exist or is not readable." );
}

if( includeFileNames )
{
out.println();
String filename = file.getName();
int filenamelength = filename.length();
out.println( filename );
for( int star = 0; star < filenamelength; star++ )
{
out.print( '=' );
}
out.println();
}

int length;
byte[] buf = new byte[ 1024 ];
FileInputStream finstr = new FileInputStream( file );
try
{
BufferedInputStream in = new BufferedInputStream( finstr, buf.length );
while( ( length = in.read( buf ) ) != -1 )
{
out.write( buf, 0, length );
}
}
finally
{
finstr.close();
}
}
}

+ 95
- 0
src/main/org/apache/tools/ant/taskdefs/email/UUMailer.java View File

@@ -0,0 +1,95 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.tools.ant.BuildException;
import sun.misc.UUEncoder;

/**
* An emailer that uuencodes attachments.
*
* @author roxspring@yahoo.com Rob Oxspring
* @since 1.5
*/
class UUMailer
extends PlainMailer
{
protected void attach( File file, PrintStream out )
throws IOException
{
if( !file.exists() || !file.canRead() )
{
throw new BuildException( "File \"" + file.getName()
+ "\" does not exist or is not readable." );
}

FileInputStream finstr = new FileInputStream( file );
try
{
BufferedInputStream in = new BufferedInputStream( finstr );
UUEncoder encoder = new UUEncoder( file.getName() );
encoder.encode( in, out );

}
finally
{
finstr.close();
}
}
}

+ 12
- 360
src/main/org/apache/tools/ant/taskdefs/optional/net/MimeMail.java View File

@@ -1,7 +1,7 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -51,46 +51,10 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs.optional.net;


// Standard SDK imports
import java.util.Properties;
import java.util.Vector;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

//imported for the mail api

import javax.mail.Session;
import javax.mail.Message;



import javax.mail.MessagingException;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.AddressException;

//imported for data source and handler
import javax.activation.DataHandler;
import javax.activation.FileDataSource;

// Ant imports
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;

import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;

import org.apache.tools.ant.types.FileSet;


import org.apache.tools.ant.taskdefs.email.EmailTask;

/**
* A task to send SMTP email. This version has near identical syntax to
@@ -98,337 +62,25 @@ import org.apache.tools.ant.types.FileSet;
* activation.jar to compile and execute, which puts it clearly into the
* very optional category.
*
* @deprecated Use {@link EmailTask} instead.
*
* @author glenn_twiggs@bmc.com
* @author steve_l@iseran.com steve loughran
* @author ehatcher@apache.org Erik Hatcher
* @author paulo.gaspar@krankikom.de Paulo Gaspar
* @created 01 May 2001
*/
public class MimeMail extends Task {
/**
* failure flag
*/
private boolean failOnError = true;

/**
* sender
*/
private String from = null;

/**
* host running SMTP
*/
private String mailhost = "localhost";

/**
* any text
*/
private String message = null;


/**
* message file (mutually exclusive from message)
*/
private File messageFile = null;

/**
* TO recipients
*/
private String toList = null;

/**
* CC (Carbon Copy) recipients
*/
protected String ccList = null;

/**
* BCC (Blind Carbon Copy) recipients
*/
protected String bccList = null;

/**
* subject field
*/
private String subject = null;

/**
* file list
*/
private Vector filesets = new Vector();

/**
* type of the text message, plaintext by default but text/html or
* text/xml is quite feasible
*/
private String messageMimeType = "text/plain";

/**
* Creates new instance
*/
public MimeMail() {
}


/**
* Sets the FailOnError attribute of the MimeMail object
*
* @param failOnError The new FailOnError value
*/
public void setFailOnError(boolean failOnError) {
this.failOnError = failOnError;
}

/**
* Adds a set of files (nested fileset attribute).
*/
public void addFileset(FileSet set) {
filesets.addElement(set);
}

/**
* Sets the toList parameter of this build task.
*
* @param toList Comma-separated list of email recipient addreses.
*/
public void setToList(String toList) {
this.toList = toList;
}

/**
* Sets the toList parameter of this build task.
*
* @param toList Comma-separated list of email recipient addreses.
*/
public void setCcList(String ccList) {
this.ccList = ccList;
}

/**
* Sets the toList parameter of this build task.
*
* @param toList Comma-separated list of email recipient addreses.
*/
public void setBccList(String bccList) {
this.bccList = bccList;
}


/**
* Sets the "from" parameter of this build task.
*
* @param from Email address of sender.
*/
public void setFrom(String from) {
this.from = from;
}


/**
* Sets the mailhost parameter of this build task.
*
* @param mailhost Mail host name.
*/
public void setMailhost(String mailhost) {
this.mailhost = mailhost;
}


/**
* Sets the message parameter of this build task.
*
* @param message Message body of this email.
*/
public void setMessage(String message) {
this.message = message;
}

public void setMessageFile(File messageFile) {
this.messageFile = messageFile;
}


public class MimeMail extends EmailTask
{
/**
* set type of the text message, plaintext by default but text/html
* or text/xml is quite feasible
* Executes this build task.
*
* @param type The new MessageMimeType value
*/
public void setMessageMimeType(String type) {
this.messageMimeType = type;
}

/**
* Sets the subject parameter of this build task.
*
* @param subject Subject of this email.
*/
public void setSubject(String subject) {
this.subject = subject;
}


/**
* verify parameters
*
* @throws BuildException if something is invalid
*/
public void validate() {
if (from == null) {
throw new BuildException("Attribute \"from\" is required.");
}

if ((toList == null) && (ccList == null) && (bccList == null)) {
throw new BuildException("Attribute \"toList\", \"ccList\" or \"bccList\" is required.");
}

if (message == null && filesets.isEmpty() && messageFile == null) {
throw new BuildException("FileSet, \"message\", or \"messageFile\" is required.");
}

if (message != null && messageFile != null) {
throw new BuildException("Only one of \"message\" or \"messageFile\" may be specified.");
}
}


/**
* Executes this build task. throws org.apache.tools.ant.BuildException
* if there is an error during task execution.
*
* @exception BuildException Description of Exception
* @exception BuildException On error.
*/
public void execute()
throws BuildException {
try {
validate();
doMail();
}
catch (Exception e) {
if (failOnError) {
throw new BuildException(e);
}
else {
String text = e.toString();
log(text, Project.MSG_ERR);
}
}
}


// helper method to add recipients
private static void addRecipients( MimeMessage msg,
Message.RecipientType recipType,
String addrUserName,
String addrList
) throws MessagingException, BuildException {
if ((null == addrList) || (addrList.trim().length() <= 0)) {
return;
}

try {
InternetAddress[] addrArray = InternetAddress.parse(addrList);

if ((null == addrArray) || (0 == addrArray.length)) {
throw new BuildException("Empty " + addrUserName + " recipients list was specified");
}

msg.setRecipients(recipType, addrArray);
}
catch(AddressException ae) {
throw new BuildException("Invalid " + addrUserName + " recipient list");
}
}

/**
* here is where the mail is sent
*
* @exception MessagingException Description of Exception
* @exception AddressException Description of Exception
* @exception BuildException Description of Exception
*/
public void doMail()
throws MessagingException, AddressException, BuildException {
Properties props = new Properties();
props.put("mail.smtp.host", mailhost);

//Aside, the JDK is clearly unaware of the scottish 'session', which
//involves excessive quantities of alcohol :-)
Session sesh = Session.getDefaultInstance(props, null);

//create the message
MimeMessage msg = new MimeMessage(sesh);

//set the sender
log("message sender: " + from, Project.MSG_VERBOSE);
msg.setFrom(new InternetAddress(from));

// add recipient lists
addRecipients(msg, Message.RecipientType.TO, "To", toList);
addRecipients(msg, Message.RecipientType.CC, "Cc", ccList);
addRecipients(msg, Message.RecipientType.BCC, "Bcc", bccList);

if (subject != null) {
log("subject: " + subject, Project.MSG_VERBOSE);
msg.setSubject(subject);
}

//now the complex bit; adding multiple mime objects. And guessing
//the file type
MimeMultipart attachments = new MimeMultipart();

//first a message
if (messageFile != null) {
int size = (int)messageFile.length();
byte data[] = new byte[size];

try {
FileInputStream inStream = new FileInputStream(messageFile);
inStream.read(data);
inStream.close();
message = new String(data);
} catch (IOException e) {
throw new BuildException(e);
}
}

if (message != null) {
MimeBodyPart textbody = new MimeBodyPart();
textbody.setContent(message, messageMimeType);
attachments.addBodyPart(textbody);
}

for (int i = 0; i < filesets.size(); i++)
{
FileSet fs = (FileSet) filesets.elementAt(i);
if (fs != null)
{
DirectoryScanner ds = fs.getDirectoryScanner(project);
String[] dsfiles = ds.getIncludedFiles();
File baseDir = ds.getBasedir();

for (int j = 0; j < dsfiles.length; j++)
{
File file = new File(baseDir, dsfiles[j]);
MimeBodyPart body;
body = new MimeBodyPart();
if (!file.exists() || !file.canRead()) {
throw new BuildException("File \"" + file.getAbsolutePath()
+ "\" does not exist or is not readable.");
}
log("Attaching " + file.toString()+" - " +file.length()+" bytes",
Project.MSG_VERBOSE);
FileDataSource fileData = new FileDataSource(file);
DataHandler fileDataHandler = new DataHandler(fileData);
body.setDataHandler(fileDataHandler);
body.setFileName(file.getName());
attachments.addBodyPart(body);
} // for j
} // if (fs != null)
} // for i

msg.setContent(attachments);
log("sending email ");
Transport.send(msg);
throws BuildException
{
log( "DEPRECATED - The " + getTaskName() + " task is deprecated. Use the mail task instead." );
super.execute();
}
}


Loading…
Cancel
Save