<!--
   Copyright 2001-2004 The Apache Software Foundation

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<html>
<head>
<title>Status File for Jakarta Commons "Email" Component</title>
</head>
<body bgcolor="white">


<div align="center">
<h1>The Jakarta Commons <em>Email</em> Component</h1>
$Id: STATUS.html,v 1.1 2004/11/25 09:56:56 epugh Exp $<br />
<a href="#Introduction">[Introduction]</a>
<a href="#Dependencies">[Dependencies]</a>
<a href="#Release Info">[Release Info]</a>
<a href="#Committers">[Committers]</a>
<br /><br />
</div>


<a name="Introduction"></a>
<h3>1.  INTRODUCTION</h3>

<p>The <em>Email</em> Component contains a set of Java classes providing a
thin convenience layer over JavaMail.</p> 

<a name="Dependencies"></a>
<h3>2.  DEPENDENCIES</h3>

<p>The <em>Email</em> component is dependent upon the following external
components for development and use:</p>
<ul>
<li><a href="http://java.sun.com/j2se">Java Development Kit</a>
    (Version 1.2 or later)</li>
<li><a href="http://java.sun.com/products/javamail/">
    JavaMail</a> . (Version 1.2 or later)</li>
<li><a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">
    JavaBeans Activation Framework</a> (Version 1.0.1 or later) 
     - dependency of JavaMail.</li>
<li><a href="http://www.junit.org">JUnit Testing Framework</a>
    (Version 3.7 or later) - for unit tests only, not required
    for deployment</li>
<li><a href="http://www.quintanasoft.com/dumbster/">Dumbster Fake SMTP</a>
    (Version 1.0.3 or later) - for unit tests only, not required
    for deployment</li>    
</ul>


<a name="Release Info"></a>
<h3>3.  RELEASE INFO</h3>

<p>Current Release: Email is yet to be released.</p>

<p>Planned Next Release:  The components are relatively mature and from 
Turbine, and recently unit testing and code cleanup has been performed.</p>


<a name="Committers"></a>
<h3>4.  COMMITTERS</h3>

<p>
The following individuals are the current developers and maintainers of this
component, there are many emeritus developers.  The lack of commons committers is
indicative of the long stagnant period, plus recent "new blood" that haven't been
involved long enough to be voted in as committers.  Developers who plan to use 
<em>Email</em> in their own projects are encouraged to collaborate on the future 
development of this component to ensure that it continues to meet a variety of needs.
</p>
<ul>
<li><a href="mailto:epugh at opensourceconnections.com">Eric Pugh</a> (Commons Committer)</li>
<li><a href="mailto:joe at germuska.com">Joe Germuska</a> (Commons Sandbox Committer)</li>
<li><a href="mailto:corey.scott at gmail.com">Corey Scott</a> (Contributor)</li>
<li><a href="mailto:mark.lowe at boxstuff.com">Mark Lowe</a> (Contributor)</li>
<li><a href="mailto:jmcnally at apache.org">John McNally</a> (Emeritus Committer)</li>
<li><a href="mailto:jon at apache.org">Jon Stevens</a> (Emeritus Committer)</li>
</ul>

</body>
</html>
