<?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 12, 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>James Server - 
    Design Objectives</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="20120412" />
    <meta http-equiv="Content-Language" content="en" />
        
          <!-- 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="James Server" />
                </a>
                              <a href="http://www.apache.org/" 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-12</span>
                  &nbsp;| <span id="projectVersion">Version: 1.6</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>James Server</h5>
                  <ul>
                  <li class="none">
                          <a href="index.html" title="Overview">Overview</a>
            </li>
                  <li class="none">
            <strong>Objectives</strong>
          </li>
                  <li class="none">
                          <a href="FAQ.html" title="Server FAQ">Server FAQ</a>
            </li>
                  <li class="none">
                          <a href="rfclist.html" title="Useful RFCs">Useful RFCs</a>
            </li>
                  <li class="none">
                          <a href="http://issues.apache.org/jira/browse/JAMES" title="Issue Tracker">Issue Tracker</a>
            </li>
                  <li class="none">
                          <a href="http://svn.apache.org/viewvc/james/server/" title="Source">Source</a>
            </li>
          </ul>
                       <h5>Documentation</h5>
                  <ul>
                  <li class="none">
                          <a href="3/index.html" title="Server v3">Server v3</a>
            </li>
                  <li class="none">
                          <a href="2/index.html" title="Server v2">Server v2</a>
            </li>
                  <li class="none">
                          <a href="archive/document_archive.html" title="Archive">Archive</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="../weare.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="http://people.apache.org/builds/james/nightly/" 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>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.3 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="3/index.html">server 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 the technology developed
       for the Apache JServ servlet engine, 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.
<br />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.
<br />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.
<br />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;                    2006-2012
                        <a href="http://www.apache.org">The Apache Software Foundation</a>.
            All Rights Reserved.      
        
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
