<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-ffa450edef68master
@@ -189,6 +189,9 @@ | |||||
<available property="bcel.present" | <available property="bcel.present" | ||||
classname="org.apache.bcel.Constants" | classname="org.apache.bcel.Constants" | ||||
classpathref="classpath" /> | classpathref="classpath" /> | ||||
<available property="sunuue.present" | |||||
classname="sun.misc.UUEncoder" | |||||
classpathref="classpath" /> | |||||
<condition property="javamail.complete"> | <condition property="javamail.complete"> | ||||
<and> | <and> | ||||
@@ -269,6 +272,9 @@ | |||||
<exclude name="${ant.package}/listener/Log4jListener.java" | <exclude name="${ant.package}/listener/Log4jListener.java" | ||||
unless="log4j.present" /> | 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}/IContract.java" unless="icontract.present" /> | ||||
<exclude name="${optional.package}/Script.java" unless="bsf.present" /> | <exclude name="${optional.package}/Script.java" unless="bsf.present" /> | ||||
<exclude name="${optional.package}/StyleBook.java" unless="stylebook.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}/ejb/IPlanet*.java" unless="ejbjar.support" /> | ||||
<exclude name="${optional.package}/Javah.java" unless="jdk1.2+" /> | <exclude name="${optional.package}/Javah.java" unless="jdk1.2+" /> | ||||
<exclude name="${optional.package}/junit/*" unless="junit.present" /> | <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/FTP.java" unless="netcomp.present" /> | ||||
<exclude name="${optional.package}/net/TelnetTask.java" unless="netcomp.present" /> | <exclude name="${optional.package}/net/TelnetTask.java" unless="netcomp.present" /> | ||||
<exclude name="${optional.package}/scm/AntStarTeam*.java" unless="starteam.present" /> | <exclude name="${optional.package}/scm/AntStarTeam*.java" unless="starteam.present" /> | ||||
@@ -9,9 +9,10 @@ | |||||
<h2><a name="mail">Mail</a></h2> | <h2><a name="mail">Mail</a></h2> | ||||
<h3>Description</h3> | <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> | <h3>Parameters</h3> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
@@ -23,45 +24,75 @@ body may be specified. To send binary attachments the optional | |||||
<tr> | <tr> | ||||
<td valign="top">from</td> | <td valign="top">from</td> | ||||
<td valign="top">Email address of sender.</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><from></code> | |||||
element.</td> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">tolist</td> | <td valign="top">tolist</td> | ||||
<td valign="top">Comma-separated list of recipients.</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> | ||||
<tr> | <tr> | ||||
<td valign="top">message</td> | <td valign="top">message</td> | ||||
<td valign="top">Message to send in the body of the email.</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><message></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> | ||||
<tr> | <tr> | ||||
<td valign="top">files</td> | <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><fileset></code> | |||||
elements to specify files.</td> | |||||
<td align="center" valign="top">No</td> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td valign="top">failonerror</td> | <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> | <tr> | ||||
<td valign="top">includefilenames</td> | <td valign="top">includefilenames</td> | ||||
<td valign="top">Include filename(s) before file contents. | <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> | ||||
<tr> | <tr> | ||||
<td valign="top">mailhost</td> | <td valign="top">mailhost</td> | ||||
<td valign="top">Host name of the mail server.</td> | |||||
<td align="center" valign="top">No, default is "localhost"</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> | ||||
<tr> | <tr> | ||||
<td valign="top">mailport</td> | <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> | ||||
<tr> | <tr> | ||||
<td valign="top">subject</td> | <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> | <td align="center" valign="top">No</td> | ||||
</tr> | </tr> | ||||
</table> | </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><message></code> element.</p> | |||||
<h3>Examples</h3> | <h3>Examples</h3> | ||||
<pre> | |||||
<mail from="me" tolist="you" subject="Results of nightly build" | |||||
files="build.log"/></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> | |||||
<mail from="me" | |||||
tolist="you" | |||||
subject="Results of nightly build" | |||||
files="build.log" /> | |||||
</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> | |||||
<mail mailhost="smtp.myisp.com" mailport="1025" subject="Test build"> | |||||
<from name="me@myisp.com"> | |||||
<to name="all@xyz.com"> | |||||
<message>A new nightly build has completed</message> | |||||
<fileset dir="dist"> | |||||
<includes name="**/*.zip"/> | |||||
</fileset> | |||||
</mail> | |||||
</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. 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> | <hr> | ||||
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | <p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | ||||
Reserved.</p> | Reserved.</p> | ||||
@@ -8,10 +8,13 @@ | |||||
<body> | <body> | ||||
<h2><a name="mimemail">MimeMail</a></h2> | <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> | <h3>Description</h3> | ||||
<p>Sends SMTP mail with MIME attachments. If no attachments | |||||
are needed, use the built-in <a href="../CoreTasks/mail.html">Mail</a> | |||||
task. <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 | and <a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">Java | ||||
Activation Framework</a> are required for this task.</p> | Activation Framework</a> are required for this task.</p> | ||||
<p>Multiple files can be attached using <a href="../CoreTypes/fileset.html">FileSets.</a></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> | </table> | ||||
<h3>Examples</h3> | <h3>Examples</h3> | ||||
<p><b>Send a single HTML file as the body of a message</b></p> | <p><b>Send a single HTML file as the body of a message</b></p> | ||||
<pre> <mimemail messageMimeType="text/html" messageFile="overview-summary.html" | |||||
<pre> <mimemail messageMimeType="text/html" messageFile="overview-summary.html" | |||||
tolist="you" subject="JUnit Test Results: ${TODAY}" from="me"/></pre> | tolist="you" subject="JUnit Test Results: ${TODAY}" from="me"/></pre> | ||||
<p><b>Sends all files in a directory as attachments</b></p> | <p><b>Sends all files in a directory as attachments</b></p> | ||||
<pre> <mimemail message="See attached files" tolist="you" subject="Attachments" from="me"> | <pre> <mimemail message="See attached files" tolist="you" subject="Attachments" from="me"> | ||||
@@ -88,7 +91,7 @@ Activation Framework</a> are required for this task.</p> | |||||
</fileset> | </fileset> | ||||
</mimemail> | </mimemail> | ||||
</pre> | </pre> | ||||
<hr><p align="center">Copyright © 2001 Apache Software Foundation. All rights | |||||
<hr><p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | |||||
Reserved.</p> | Reserved.</p> | ||||
</body> | </body> | ||||
@@ -342,13 +342,13 @@ Installing Ant / Optional Tasks</a> section above.</p> | |||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td>mail.jar</td> | <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/" | <td><a href="http://java.sun.com/products/javamail/" | ||||
target="_top">http://java.sun.com/products/javamail/</a></td> | target="_top">http://java.sun.com/products/javamail/</a></td> | ||||
</tr> | </tr> | ||||
<tr> | <tr> | ||||
<td>activation.jar</td> | <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" | <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> | target="_top">http://java.sun.com/products/javabeans/glasgow/jaf.html</a></td> | ||||
</tr> | </tr> | ||||
@@ -31,7 +31,7 @@ | |||||
<a href="OptionalTasks/junitreport.html">JUnitReport</a><br> | <a href="OptionalTasks/junitreport.html">JUnitReport</a><br> | ||||
<a href="OptionalTasks/mmetrics.html">Metamata Metrics</a><br> | <a href="OptionalTasks/mmetrics.html">Metamata Metrics</a><br> | ||||
<a href="OptionalTasks/maudit.html">Metamata Audit</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/mparse.html">MParse</a><br> | ||||
<a href="OptionalTasks/native2ascii.html">Native2Ascii</a><br> | <a href="OptionalTasks/native2ascii.html">Native2Ascii</a><br> | ||||
<a href="OptionalTasks/netrexxc.html">NetRexxC</a><br> | <a href="OptionalTasks/netrexxc.html">NetRexxC</a><br> | ||||
@@ -51,23 +51,10 @@ | |||||
* information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
* <http://www.apache.org/>. | * <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. | * A task to send SMTP email. | ||||
@@ -119,200 +106,16 @@ import org.apache.tools.ant.BuildException; | |||||
* @author glenn_twiggs@bmc.com | * @author glenn_twiggs@bmc.com | ||||
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | * @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. | * Sets the mailport parameter of this build task. | ||||
* @param value mail port name. | * @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); | |||||
} | |||||
} | |||||
} | |||||
} | } |
@@ -38,7 +38,7 @@ antstructure=org.apache.tools.ant.taskdefs.AntStructure | |||||
execon=org.apache.tools.ant.taskdefs.ExecuteOn | execon=org.apache.tools.ant.taskdefs.ExecuteOn | ||||
antcall=org.apache.tools.ant.taskdefs.CallTarget | antcall=org.apache.tools.ant.taskdefs.CallTarget | ||||
sql=org.apache.tools.ant.taskdefs.SQLExec | 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 | fail=org.apache.tools.ant.taskdefs.Exit | ||||
war=org.apache.tools.ant.taskdefs.War | war=org.apache.tools.ant.taskdefs.War | ||||
uptodate=org.apache.tools.ant.taskdefs.UpToDate | uptodate=org.apache.tools.ant.taskdefs.UpToDate | ||||
@@ -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 <address>" 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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -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; | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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; | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -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(); | |||||
} | |||||
} | |||||
} |
@@ -1,7 +1,7 @@ | |||||
/* | /* | ||||
* The Apache Software License, Version 1.1 | * 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. | * reserved. | ||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
@@ -51,46 +51,10 @@ | |||||
* information on the Apache Software Foundation, please see | * information on the Apache Software Foundation, please see | ||||
* <http://www.apache.org/>. | * <http://www.apache.org/>. | ||||
*/ | */ | ||||
package org.apache.tools.ant.taskdefs.optional.net; | 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.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 | * 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 | * activation.jar to compile and execute, which puts it clearly into the | ||||
* very optional category. | * very optional category. | ||||
* | * | ||||
* @deprecated Use {@link EmailTask} instead. | |||||
* | |||||
* @author glenn_twiggs@bmc.com | * @author glenn_twiggs@bmc.com | ||||
* @author steve_l@iseran.com steve loughran | * @author steve_l@iseran.com steve loughran | ||||
* @author ehatcher@apache.org Erik Hatcher | * @author ehatcher@apache.org Erik Hatcher | ||||
* @author paulo.gaspar@krankikom.de Paulo Gaspar | * @author paulo.gaspar@krankikom.de Paulo Gaspar | ||||
* @created 01 May 2001 | * @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() | 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(); | |||||
} | } | ||||
} | } | ||||