<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">










<html>
  <head>
    <title>James Project - 
    Download</title>
    <style type="text/css" media="all">
      @import url("./css/maven-base.css");
      @import url("./css/maven-theme.css");
      @import url("./css/site.css");
    </style>
    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
          <meta name="author" content="
    Apache James Mail Server Project" />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
      </head>
  <body class="composite">
    <div id="banner">
                  <a href="index.html" id="bannerLeft">
    
                                            <img src="images/james-project-logo.gif" alt="" />
    
            </a>
                        <a href="http://www.apache.org/index.html" id="bannerRight">
    
                                            <img src="images/asf-logo-reduced.gif" alt="" />
    
            </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
          
  

  
    
  
  
            <div class="xleft">
        Last Published: 04/01/2009
                      </div>
            <div class="xright">      <a href="index.html">JAMES Project</a>
          |
          <a href="server/index.html">Server</a>
          |
          <a href="mailet/index.html">Mailets</a>
          |
          <a href="jspf/index.html">jSPF</a>
          |
          <a href="mime4j/index.html">Mime4J</a>
          |
          <a href="jsieve/index.html">JSieve</a>
          |
          <a href="postage/index.html">Postage</a>
          
  

  
    
  
  
  </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
           
  

  
    
  
  
                   <h5>About</h5>
        <ul>
              
    <li class="none">
              <a href="newsarchive.html">News</a>
        </li>
              
    <li class="none">
              <a href="index.html">Overview</a>
        </li>
              
    <li class="none">
              <a href="mail.html">Mailing Lists</a>
        </li>
              
    <li class="none">
              <a href="guidelines.html">Project Guidelines</a>
        </li>
              
    <li class="none">
              <a href="http://wiki.apache.org/james">Wiki</a>
        </li>
              
    <li class="none">
              <a href="weare.html">Who We Are</a>
        </li>
              
    <li class="none">
              <a href="contribute.html">Contributing</a>
        </li>
              
    <li class="none">
              <a href="code-standards.html">Standards</a>
        </li>
              
    <li class="none">
              <a href="license.html">License</a>
        </li>
          </ul>
          <h5>Downloads</h5>
        <ul>
              
    <li class="none">
              <a href="download.cgi">Stable releases</a>
        </li>
              
    <li class="none">
              <a href="downloadunstable.cgi">Unstable releases</a>
        </li>
              
    <li class="none">
              <a href="http://people.apache.org/builds/james/nightly/">Nightly builds</a>
        </li>
          </ul>
          <h5>Translated</h5>
        <ul>
              
    <li class="none">
              <a href="http://james.terra-intl.com/">Japanese (web)</a>
        </li>
          </ul>
          <h5>Related Projects</h5>
        <ul>
              
    <li class="none">
              <a href="http://jakarta.apache.org/commons/index.html">Jakarta Commons</a>
        </li>
              
    <li class="none">
              <a href="http://ant.apache.org/index.html">Ant</a>
        </li>
              
    <li class="none">
              <a href="http://maven.apache.org/index.html">Maven2</a>
        </li>
              
    <li class="none">
              <a href="http://db.apache.org/derby/index.html">Derby</a>
        </li>
              
    <li class="none">
              <a href="http://avalon.apache.org/index.html">Avalon</a>
        </li>
              
    <li class="none">
              <a href="http://www.dnsjava.org/index.html">DNSJava</a>
        </li>
          </ul>
          <h5>Useful Information</h5>
        <ul>
              
    <li class="none">
              <a href="http://jakarta.apache.org/site/getinvolved.html">Get Involved</a>
        </li>
              
    <li class="none">
              <a href="http://jakarta.apache.org/site/library.html">Reference Library</a>
        </li>
          </ul>
          <h5>Foundation</h5>
        <ul>
              
    <li class="none">
              <a href="http://apache.org/foundation/faq.html">FAQ</a>
        </li>
              
    <li class="none">
              <a href="http://apache.org/foundation/sponsorship.html">Sponsorship</a>
        </li>
              
    <li class="none">
              <a href="http://apache.org/foundation/contributing.html">Donations</a>
        </li>
              
    <li class="none">
              <a href="http://apache.org/foundation/thanks.html">Thanks</a>
        </li>
          </ul>
                                       <a href="http://maven.apache.org/" title="Built by Maven" id="poweredBy">
            <img alt="Built by Maven" src="./images/logos/maven-feather.png"></img>
          </a>
                       
  

  
    
  
  
        </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        
  


<a name="Downloading the Apache JAMES Unstable releases"></a><div class="section"><h2>Downloading the Apache JAMES Unstable releases</h2>

<p>Use the links below to download the Apache JAMES products from one of
our mirrors.  You <strong>must</strong> <a href="#Verify the integrity of the files">verify the
integrity</a> of the downloaded files using signatures downloaded from
our main distribution directory.</p>

<p>Only current recommended releases are available on the main
distribution site and its mirrors.  Older releases are available from
the <a href="http://archive.apache.org/dist/james/">archive download
site.</a></p>

</div>

<a name="Mirror"></a><div class="section"><h3>Mirror</h3>

<p>[if-any logo]
<a href="[link]"><img align="right" src="[logo]" border="0"></img></a>[end]
The currently selected mirror is <b>[preferred]</b>.  If you encounter a
problem with this mirror, please select another mirror.  If all
mirrors are failing, there are <i>backup</i> mirrors (at the end of
the mirrors list) that should be available.</p>

<form action="[location]" method="get" id="SelectMirror">
Other mirrors: <select name="Preferred">
[if-any http]
  [for http]<option value="[http]">[http]</option>[end]
[end]  
[if-any ftp]
  [for ftp]<option value="[ftp]">[ftp]</option>[end]
[end]
[if-any backup]
  [for backup]<option value="[backup]">[backup] (backup)</option>[end]
[end]
</select>
<input type="submit" value="Change"></input>     
</form>

<p>You may also consult the <a href="http://www.apache.org/mirrors/">complete
list of mirrors</a>.</p>

</div>

<a name="No updated unstable releases for Apache JAMES Server"></a><div class="section"><h2>No updated unstable releases for Apache JAMES Server</h2>
<p>Apache JAMES server 2.3.1 has been released and no new unstable releases have been released.
Please go to the <a href="/download.cgi">stable releases download page</a> to download it.
</p>
</div>


<a name="No updated unstable releases for Apache JAMES jSPF"></a><div class="section"><h2>No updated unstable releases for Apache JAMES jSPF</h2>
<p>Apache JAMES jSPF 0.9.6 has been released and no new unstable releases have been released.
Please go to the <a href="/download.cgi">stable releases download page</a> to download it.
</p>
</div>


<a name="No updated unstable releases for Apache Mime4J"></a><div class="section"><h2>No updated unstable releases for Apache Mime4J</h2>
<p>Apache Mime4J 0.4 has been released an no new unstable releases have been released.
Please go to the <a href="/download.cgi">stable releases download page</a> to download it.
</p>
</div>

<a name="Verify the integrity of the files"></a><div class="section"><h3>Verify the integrity of the files</h3>

<p>It is essential that you verify the integrity of the downloaded
files using the PGP or MD5 signatures.</p>

<p>The PGP signatures can be verified using PGP or GPG.  First
download the <a href="http://www.apache.org/dist/james/KEYS">KEYS</a>
as well as the <code>asc</code> signature file for the particular
distribution.  Make sure you get these files from the <a href="http://www.apache.org/dist/james/">main distribution
directory</a>, rather than from a mirror. Then verify the signatures
using</p>

<p><code>
% pgpk -a KEYS<br></br>
% pgpv james-<i>version</i>.tar.gz.asc<br></br>
</code>
<em>or</em><br></br>
<code>
% pgp -ka KEYS<br></br>
% pgp james-<i>version</i>.tar.gz.asc<br></br>
</code>
<em>or</em><br></br>
<code>
% gpg --import KEYS<br></br>
% gpg --verify james-<i>version</i>.tar.gz.asc
</code></p>

</div>

<a name="Stable releases or Nightlies"></a><div class="section"><h2>Stable releases or Nightlies</h2>

<p>The software listed above represents the latest unstable builds
available from the Apache JAMES Project.
You can download Stable Releases <a href="/download.cgi">here</a>.
Unstable releases are announced on the General mailing list (general@james.apache.org).

<br></br><br></br>
</p>

<p>The JAMES project also provides 
<a href="http://people.apache.org/builds/james/nightly/">Nighly Builds</a>:
<u>periodic snapshots during development</u>.  Generally, these are considered
stable snapshots, but they have not undergone as much testing as a
Release Build, nor have they been voted upon for release by the
developer community.  These are simply convenient test builds.
Sometimes the purpose for a Nightly Build could be soliciting feedback on
a specific change.  
</p>


</div>



      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">&#169;  
          2006-2009
    
          The Apache Software Foundation
          
  

  
    
  
  
  </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
    </script>
    <script type="text/javascript">
      _uacct = "UA-1384591-1";
      urchinTracker();
    </script>
    <script type="text/javascript">
    if (document.getElementsByTagName) { 
      var hrefs = document.getElementsByTagName('a'); 
      var extensions = ["gz","bz2","zip","jar","asc","sar"];
      for (var l = 0; l < hrefs.length; l++) {
        // 0+ is a workaround for download.cgi script by ASF that 
        // is not happy with simple words in square brackets
        if (hrefs[0+l] != "") {
          var path = hrefs[0+l].pathname;
          var external = hrefs[0+l].hostname != location.host;
          if (external) {
            var splitted = path.split('.');
            var ext = splitted[0+splitted.length-1];
            for (var e = 0; e < extensions.length; e++) {
              if (extensions[0+e] == ext) {
                startListening(hrefs[0+l],"click",trackDownloads);
              }
        }
          }
        }
      } 
    } 
    
    function startListening (obj,evnt,func) { 
      if (obj.addEventListener) {
        obj.addEventListener(evnt,func,false); 
      } else if (obj.attachEvent) {
        obj.attachEvent("on" + evnt,func); 
      } 
    } 
    
    function trackDownloads (evnt) { 
      var lnk; 
      if (evnt.srcElement) { 
        var elmnt = evnt.srcElement; 
        while (elmnt.tagName != "A") { 
          var newelmnt = elmnt.parentNode; 
          elmnt = newelmnt; 
        } 
        lnk = elmnt.hostname + "/" + elmnt.pathname + elmnt.search; 
      } else { 
        lnk = this.hostname + this.pathname + this.search; 
      } 
    
      var pos = lnk.indexOf("/james/");
      if (pos != -1) {
        lnk = lnk.substr(pos+7);
      }
      lnk = "/downloads/"+lnk;
    
      if (typeof(urchinTracker) == "function") {
        urchinTracker(lnk);
      }
    } 
    </script>
  </body>
</html>
