<?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 - Team list</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="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">
                          <a href="design_objectives.html" title="Objectives">Objectives</a>
            </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">
        <div class="section"><h2>The Team<a name="The_Team"></a></h2><a name="The_Team"></a><p>A successful project requires many people to play many roles. Some members write code or documentation, while others are valuable as testers, submitting patches and suggestions.</p><p>The team is comprised of Members and Contributors. Members have direct access to the source of a project and actively evolve the code-base. Contributors improve the project through submission of patches and suggestions to the Members. The number of Contributors to the project is unbounded. Get involved today. All contributions to the project are greatly appreciated.</p><div class="section"><h3>Members<a name="Members"></a></h3><a name="Members"></a><p>The following is a list of developers with commit privileges that have directly contributed to the project in one way or another.</p><table border="0" class="bodyTable"><tr class="a"><th>Id</th><th>Name</th><th>Email</th><th>Organization</th><th>Roles</th><th>Time Zone</th><th>Actual Time (GMT)</th><th>Properties</th></tr><tr class="b"><td><a name="bago"></a>bago</td><td>Stefano Bagnara</td><td>bago at apache.org</td><td>-</td><td>Developer</td><td>2</td><td><span id="developer-0">2</span></td><td>-</td></tr><tr class="a"><td><a name="norman"></a>norman</td><td>Norman Maurer</td><td>norman at apache.org</td><td>-</td><td>PMC Chair</td><td>2</td><td><span id="developer-1">2</span></td><td>-</td></tr><tr class="b"><td><a name="serge"></a>serge</td><td>Serge Knystautas</td><td>sergek at lokitech.com</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-2">-</span></td><td>-</td></tr><tr class="a"><td><a name="benrdf"></a>benrdf</td><td>Bernd Fondermann</td><td>bf_jak at brainlounge.de</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-3">-</span></td><td>-</td></tr><tr class="b"><td><a name="sbrewin"></a>sbrewin</td><td>Steve Brewin</td><td>sbrewin at synsys.com</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-4">-</span></td><td>-</td></tr><tr class="a"><td><a name="hilmer"></a>hilmer</td><td>Soren Hilmer</td><td>sh at widetrail.dk</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-5">-</span></td><td>-</td></tr><tr class="b"><td><a name="noel"></a>noel</td><td>Noel J. Bergman</td><td>noel at devtech.com</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-6">-</span></td><td>-</td></tr><tr class="a"><td><a name="danny"></a>danny</td><td>Danny Angus</td><td>danny at apache.org</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-7">-</span></td><td>-</td></tr><tr class="b"><td><a name="adc"></a>adc</td><td>Alan D. Cabrera</td><td>list at toolazydogs.com</td><td>-</td><td>Developer</td><td>-8</td><td><span id="developer-8">-8</span></td><td>-</td></tr><tr class="a"><td><a name="vincenzo"></a>vincenzo</td><td>Vincenzo Gianferrari Pini</td><td>vincenzo.gianferraripini at praxis.it</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-9">-</span></td><td>-</td></tr><tr class="b"><td><a name="rdonkin"></a>rdonkin</td><td>Robert Burrell Donkin</td><td>rdonkin at apache.org</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-10">-</span></td><td>-</td></tr><tr class="a"><td><a name="niklas"></a>niklas</td><td>Niklas Therning</td><td>niklas(at)apache(dot)org</td><td>Trillian AB</td><td>-</td><td>-</td><td><span id="developer-11">-</span></td><td>-</td></tr><tr class="b"><td><a name="jcheng"></a>jcheng</td><td>Joe Cheng</td><td>joe(at)joecheng(dot)com</td><td>-</td><td>-</td><td>-</td><td><span id="developer-12">-</span></td><td>description=Former author to the mime4j product</td></tr><tr class="a"><td><a name="mwiederkehr"></a>mwiederkehr</td><td>Markus Wiederkehr</td><td>mwiederkehr at apache.org</td><td>-</td><td>PMC Member</td><td>-</td><td><span id="developer-13">-</span></td><td>-</td></tr><tr class="b"><td><a name="olegk"></a>olegk</td><td>Oleg Kalnichevski</td><td>olegk at apache.org</td><td>-</td><td>PMC Member</td><td>-</td><td><span id="developer-14">-</span></td><td>-</td></tr><tr class="a"><td><a name="manolo"></a>manolo</td><td>Manuel Carrasco Monino</td><td>manolo at apache.org</td><td>-</td><td>Developer</td><td>-</td><td><span id="developer-15">-</span></td><td>-</td></tr><tr class="b"><td><a name="eric"></a>eric</td><td>Eric Charles</td><td>eric at apache.org</td><td>-</td><td>PMC Member</td><td>-</td><td><span id="developer-16">-</span></td><td>-</td></tr><tr class="a"><td><a name="felixk"></a>felixk</td><td>Felix Knecht</td><td>felixk at apache.org</td><td>-</td><td>Developer</td><td>1</td><td><span id="developer-17">1</span></td><td>-</td></tr></table></div><div class="section"><h3>Contributors<a name="Contributors"></a></h3><a name="Contributors"></a><p>The following additional people have contributed to this project through the way of suggestions, patches or documentation.</p><table border="0" class="bodyTable"><tr class="a"><th>Name</th><th>Properties</th></tr><tr class="b"><td>Rob Oxspring</td><td>description=Contributed to the mime4j product</td></tr><tr class="a"><td>Roger Fullerton</td><td>description=Wrote spfjava, the first spf implementation in java</td></tr></table><script type="text/javascript">
function offsetDate(id, offset) {
    var now = new Date();
    var nowTime = now.getTime();
    var localOffset = now.getTimezoneOffset();
    var developerTime = nowTime + ( offset * 60 * 60 * 1000 )+ ( localOffset * 60 * 1000 );
    var developerDate = new Date(developerTime);

    document.getElementById(id).innerHTML = developerDate;
}

function init(){
    offsetDate('developer-0', '2');
    offsetDate('developer-1', '2');
    offsetDate('developer-8', '-8');
    offsetDate('developer-17', '1');
}

window.onLoad = init();
</script></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>
