<?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 Apr 17, 2012 --> | |
<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 - 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="20120417" /> | |
<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-server-logo.gif"> | |
<img src="images/logos/james-server-logo.gif" alt="Apache James Server 3.0" /> | |
</a> | |
<a href="http://www.apache.org/index.html" id="bannerRight"> | |
<img src="images/logos/asf-logo-reduced.gif" alt="The Apache Software Foundation" /> | |
</a> | |
<div class="clear"> | |
<hr/> | |
</div> | |
</div> | |
<div id="breadcrumbs"> | |
<div class="xleft"> | |
<span id="publishDate">Last Published: 2012-04-17</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="../../imap/index.html" title="IMAP">IMAP</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> | |
<li class="none"> | |
<a href="https://repository.apache.org/content/repositories/snapshots/org/apache/james/apache-james/" title="Nightly builds">Nightly builds</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> | |
</ul> | |
<h5>Download</h5> | |
<ul> | |
<li class="none"> | |
<a href="../../download.cgi" title="Releases">Releases</a> | |
</li> | |
<li class="none"> | |
<a href="https://repository.apache.org/content/repositories/snapshots/org/apache/james/" title=""></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 "mailstore" 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 "direct" 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 "session-scoped" 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 "communication languages" 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 "open" 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 © 2002-2012 | |
<a href="http://www.apache.org/">The Apache Software Foundation</a>. | |
All Rights Reserved. | |
</div> | |
<div class="clear"> | |
<hr/> | |
</div> | |
</div> | |
</body> | |
</html> |