<!--
   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$<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>
