blob: f0024eda9cd5c26e682243f524ddfd99eec2b1ae [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at 2016-10-20 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Apache James Server 3.0 -
Apache James Server 3 - Develop on James</title>
<style type="text/css" media="all">
@import url("./css/james.css");
@import url("./css/maven-base.css");
@import url("./css/maven-theme.css");
@import url("./css/site.css");
@import url("./js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
@import url("./js/jquery/css/print.css");
@import url("./js/fancybox/jquery.fancybox-1.3.4.css");
</style>
<script type="text/javascript" src="./js/jquery/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
<script type="text/javascript" src="./js/fancybox/jquery.fancybox-1.3.4.js"></script>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
<meta name="author" content="James Project Web Team" />
<meta name="Date-Revision-yyyymmdd" content="20161020" />
<meta http-equiv="Content-Language" content="en" />
<link title="DOAP" rel="meta" type="application/rdf+xml" href="http://james.apache.org//doap_james-project.rdf"/>
<script type="text/javascript" src="./js/dev.js"></script>
<!-- Google Analytics -->
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-1384591-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
})();
</script>
</head>
<body class="composite">
<div id="banner">
<a href="../index.html" id="bannerLeft" title="james-logo.png">
<img src="images/logos/james-logo.png" alt="Apache James Server 3.0" />
</a>
<a href="http://www.apache.org/index.html" id="bannerRight">
<img src="images/logos/asf_logo_small.png" alt="The Apache Software Foundation" />
</a>
<div class="clear">
<hr/>
</div>
</div>
<div id="breadcrumbs">
<div class="xleft">
<span id="publishDate">Last Published: 2016-10-20</span>
</div>
<div class="xright"> <a href="../../index.html" title="Home">Home</a>
|
<a href="../index.html" title="Server">Server</a>
|
<a href="../../hupa/index.html" title="Hupa">Hupa</a>
|
<a href="../../protocols/index.html" title="Protocols">Protocols</a>
|
<a href="../../mailet/index.html" title="Mailets">Mailets</a>
|
<a href="../../mailbox/index.html" title="Mailbox">Mailbox</a>
|
<a href="../../mime4j/index.html" title="Mime4J">Mime4J</a>
|
<a href="../../jsieve/index.html" title="jSieve">jSieve</a>
|
<a href="../../jspf/index.html" title="jSPF">jSPF</a>
|
<a href="../../jdkim/index.html" title="jDKIM">jDKIM</a>
|
<a href="../../mpt/index.html" title="MPT">MPT</a>
|
<a href="../../postage/index.html" title="Postage">Postage</a>
</div>
<div class="clear">
<hr/>
</div>
</div>
<div id="leftColumn">
<div id="navcolumn">
<h5>Overview</h5>
<ul>
<li class="none">
<a href="index.html" title="Introduction">Introduction</a>
</li>
<li class="none">
<a href="release-notes.html" title="Release Notes">Release Notes</a>
</li>
</ul>
<h5>Features</h5>
<ul>
<li class="none">
<a href="feature-mailetcontainer.html" title="Mailet Container">Mailet Container</a>
</li>
<li class="none">
<a href="feature-queue-priority.html" title="Queue Priority">Queue Priority</a>
</li>
<li class="none">
<a href="feature-persistence.html" title="Persistence">Persistence</a>
</li>
<li class="none">
<a href="feature-protocols.html" title="Protocols">Protocols</a>
</li>
<li class="none">
<a href="feature-smtp-hooks.html" title="SMTP Hooks">SMTP Hooks</a>
</li>
<li class="none">
<a href="feature-performance.html" title="Performance">Performance</a>
</li>
<li class="none">
<a href="feature-security.html" title="Security">Security</a>
</li>
</ul>
<h5>User Manual</h5>
<ul>
<li class="none">
<a href="quick-start.html" title="1. Quick Start">1. Quick Start</a>
</li>
<li class="none">
<a href="install.html" title="2. Install James">2. Install James</a>
</li>
<li class="collapsed">
<a href="config.html" title="3. Configure James">3. Configure James</a>
</li>
<li class="collapsed">
<a href="manage.html" title="4. Manage">4. Manage</a>
</li>
<li class="collapsed">
<a href="monitor.html" title="5. Monitor">5. Monitor</a>
</li>
<li class="collapsed">
<a href="upgrade.html" title="6. Upgrade">6. Upgrade</a>
</li>
</ul>
<h5>Developers Corner</h5>
<ul>
<li class="none">
<strong>Architecture</strong>
</li>
<li class="none">
<a href="dev-build.html" title="Build from source">Build from source</a>
</li>
<li class="none">
<a href="dev-database-schema.html" title="Database Schema">Database Schema</a>
</li>
<li class="collapsed">
<a href="dev-extend.html" title="Develop Extensions">Develop Extensions</a>
</li>
<li class="collapsed">
<a href="dev-provided.html" title="Provided Extensions">Provided Extensions</a>
</li>
</ul>
<h5>References</h5>
<ul>
<li class="none">
<a href="apidocs/index.html" title="Javadoc">Javadoc</a>
</li>
<li class="none">
<a href="https://issues.apache.org/jira/browse/JAMES" title="Issue Tracker">Issue Tracker</a>
</li>
</ul>
<h5>About James</h5>
<ul>
<li class="none">
<a href="../../index.html" title="Overview">Overview</a>
</li>
<li class="none">
<a href="../../newsarchive.html" title="News">News</a>
</li>
<li class="none">
<a href="../../mail.html" title="Mailing Lists">Mailing Lists</a>
</li>
<li class="none">
<a href="../../contribute.html" title="Contributing">Contributing</a>
</li>
<li class="none">
<a href="../../guidelines.html" title="Guidelines">Guidelines</a>
</li>
<li class="none">
<a href="http://wiki.apache.org/james" title="Wiki">Wiki</a>
</li>
<li class="none">
<a href="../../team-list.html" title="Who We Are">Who We Are</a>
</li>
<li class="none">
<a href="../../license.html" title="License">License</a>
</li>
<li class="none">
<a href="../../thanks.html" title="Thanks">Thanks</a>
</li>
<li class="none">
<a href="../../support.html" title="Professional support">Professional support</a>
</li>
</ul>
<h5>Download</h5>
<ul>
<li class="none">
<a href="../../download.cgi" title="Releases">Releases</a>
</li>
</ul>
<h5>Apache Software Foundation</h5>
<ul>
<li>
<strong>
<a title="ASF" href="http://www.apache.org/">ASF</a>
</strong>
</li>
<li>
<a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
</li>
<li>
<a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
</li>
<li>
<a title="License" href="http://www.apache.org/licenses/" >License</a>
</li>
<li>
<a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
</li>
<li>
<a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
<li>
<a title="Security" href="http://www.apache.org/security/">Security</a>
</li>
</ul>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
</a>
</div>
</div>
<div id="bodyColumn">
<div id="contentBox">
<!-- Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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. -->
<div class="section">
<h2>High Level Architecture<a name="High_Level_Architecture"></a></h2>
<a href="images/uml/org.apache.james-package_large.png" id="high-level-arch-img-id"><img src="images/uml/org.apache.james-package_small.png" alt="" /></a>
<p><a href="images/uml/org.apache.james-package_large.png" id="high-level-arch-txt-id">Click to enlarge image</a></p>
<p>James is a multi-protocol message processing and storage engine. James
currently consists of:
</p>
<ul>
<li>Four mail protocol services: SMTP, POP3, IMAP4 and LMTP.</li>
<li>Support for SMTP Auth.</li>
<li>A remote administration server.</li>
<!-- <li>an NNTP server,</li> -->
<li>Support for TLS/SSL.</li>
<li>A mail processing engine that supports the Mailet API.</li>
<li>File-system message storage and a message storage interface to RDBMS's.</li>
<li>File-system user record storage and an experimental interface to LDAP directories.</li>
</ul>
<p>The mail protocol services use the mailbox librairies to fetch/store mails.</p>
<p>When a mail arrives via SMTP, it gets processed by the SMTP services and is placed
in a Apache ActiveMQ queue (ActiveMQ is the Java Messaging Service JMS implementation at Apache)</p>
<p>This allow to decouple mail spooling from the rest of the incoming traffic.</p>
<p>After being the put in the queue, the mailetcontainer is responsible to get the
next mail to process from the ActiveMQ queue.</p>
<p>The mailets defined in mailetcontainer.xml are applied to define if the mail is to be
treated as a Local or Remote delivery.</p>
<p>The Local and Remote deliveries are treated by their corresponding mailet.</p>
<p>The LocalDelivery mailet uses the SieveMailet which uses the mailbox/message manager to store the mail.</p>
<p>The result of the mail can be either:</p>
<ul>
<li>Gets stored in the mailbox.</li>
<li>Gets relayed to another server.</li>
<li>Gets relayed to another server.</li>
<li>Gets bounced back if it can not be handle by the james instance (this may happen during a previous step)</li>
<li>Gets stored in the &quot;mailstore&quot; which is a special format for spam, virus,... (in future release, we may also store those mails in the mailbox).</li>
</ul>
</div>
<div class="section">
<h2>Technical Architecture<a name="Technical_Architecture"></a></h2>
<a href="images/uml/org.apache.james-package-detail_large.png" id="arch-img-id"><img src="images/uml/org.apache.james-package-detail_small.png" alt="" /></a>
<p><a href="images/uml/org.apache.james-package-detail_large.png" id="arch-txt-id">Click to enlarge image</a></p>
<p>James uses many other components: Spring, ActiveMQ, OpenJPA, Netty, Jackrabbit, Derby...</p>
<p>The modules can be classified into 3 categories:</p>
<ul>
<li>API: They do not include implementation details, they do not have dependencies (or at most they have very common dependencies like mailet-api, javamail, commons-logging).</li>
<li>Library: They only depend on API modules or external jars. They don't depend on other internal libraries. These libraries should be shared by functions (no need to have a Library when it is used only by a function).</li>
<li>Functions: Everything else. It is harder to see a case of &quot;direct&quot; reuse of a function jar. Most times we'll only have code reuse. It is preferable to limit Function to Functions dependencies.</li>
</ul>
</div>
<div class="section">
<h2>Server Coding Guidelines<a name="Server_Coding_Guidelines"></a></h2>
<p>LogEnabled interface as the preferred way, except for non-server code and classes that have no bean definition.
LogEnabled should be used wherever logging is needed and no &quot;session-scoped&quot; Log is provided.</p>
</div>
<div class="section">
<h2>Design Objectives<a name="Design_Objectives"></a></h2>
<div class="section">
<h3>Features<a name="Features"></a></h3>
<p>These are some of the currently implemented features:</p>
<p><i><b>Complete portability</b></i> Apache James is be a 100% pure Java application
based on the Java 2 platform and the JavaMail 1.4 API.</p>
<p><i><b>Protocol abstraction</b></i> Unlike other mail engines, protocols are seen only
like &quot;communication languages&quot; ruling comunications between clients and
the server. Apache James is not be tied to any particular protocol but
follow an abstracted server design (like JavaMail did on the
client side)</p>
<p><i><b>Complete solution</b></i> The mail system is able to handle both mail
transport and storage in a single server application. Apache James
works alone without the need for any other server or solution.</p>
<p><i><b>Mailet support</b></i> Apache James supports the Apache Mailet API. A Mailet
is a discrete piece of mail-processing logic which is incorporated into
a Mailet-compliant mail-server's processing. This easy-to-write,
easy-to-use pattern allows developers to build powerful customized mail
systems. Examples of the services a Mailet might provide include: a
mail-to-fax or mail-to-phone transformer, a filter, a language translator, a mailing
list manager, etc. Several Mailets are included in the James
distribution (see <a href="dev-provided-mailets.html">documentation</a>).</p>
<p><i><b>Resource abstraction</b></i> Like protocols, resources are abstracted and,
accessed through defined interfaces (JavaMail for transport, JDBC for
spool storage or user accounts in RDBMS's, Apache Mailet API). The server is
highly modular and reuse solutions from other projects.</p>
<p><i><b>Secure and multi-threaded design</b></i> Based on well known
frameworks such as Spring, ActiveMQ, OpenJPA, Netty,..., Apache James has a careful,
security-oriented, full multi-threaded design, to allow performance,
scalability and mission-critical use.</p>
<p>Anything else you may want if you help us write it :-)</p>
</div>
<div class="section">
<h3>Standards Compliance<a name="Standards_Compliance"></a></h3>
<p>It is the existence of published &quot;open&quot; standards which
allows independant teams to develop interoperable software.</p>
<p>James attempts to support a number of these standards most of which are
IETF RFC's and in the areas covered by these standards the published standard
is our requirements document.</p>
<p>This sometimes leads to confusion where behaviour is not
the subject of a relevant standard, or conflict where common
(de-facto) behaviour is actually at odds with a supported standard.</p>
<p>We believe that it is our responsibility to adhere to the published standard.
If we allow our implementation to deviate it means that we are tacitly encouraging
the situation whereby interoperability is no longer guarenteed by standards
compliance alone, but also requires access to undocumented and possibly
even commercially licenced technology. There is no easy route for a
newcomer to aquire these secrets, and interoperabilty
becomes something only available to the elite.</p>
<p>The James policy for issues of non-compliance tries to tread the fine line
between a pragmatic acceptance of other people's misinterpretation of the
RFC's and an evangelical defence of open standards as the key to freedom of interoperation.</p>
<p>In practice this policy is that certain well argued of cases of
non-compliance which can be *safely* worked around, will be tolerated by
James.</p>
<p>In cases (like jira issue JAMES-344) where variance from a published standard is
required it is desirable that this functionality is disabled in James by default,
it must be prominently and clearly documented that this causes James
to violate the relevant standard, and should be enabled by explicit
configuration, making its use a conscious decision of the user rather
than an decision taken by the James team.</p>
<p>In cases where the required behaviour is not within the scope of any standard which
James claims to support (such as behaviour which is a de-facto standard or
an <i>internet draft</i> RFC but not yet subject of a <i>standards track</i> RFC) it is
acceptable to implement the behaviour so long as it is adequately
documented (for instance by refrence to an <i>internet draft</i> or
other public document) and users can be clear about what to expect from James.</p>
</div>
</div>
</div>
</div>
<div class="clear">
<hr/>
</div>
<div id="footer">
<div class="xright">Copyright &#169; 2002-2016
<a href="http://www.apache.org/">The Apache Software Foundation</a>.
All Rights Reserved.
</div>
<div class="clear">
<hr/>
</div>
</div>
</body>
</html>