<?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 - 
  Installation</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="Serge Knystautas" />
    <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">
        <!-- 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>Step 0: Building. (only necessary for daily snapshots)<a name="Step_0:_Building._only_necessary_for_daily_snapshots"></a></h2> 
<p> If you have downloaded a binary distribution, you do not need to build James. 
  Proceed directory to Step 1. </p>
<p> To compile James from the source code you need <a class="externalLink" href="http://ant.apache.org/">Ant</a>. 
  This is a Java-tailored, XML-configured, extensible build or make system. We 
  are currently using Ant 1.4, which is included in the source distribution.</p>
<p> If you have downloaded a daily snapshot, you need to build a distribution. 
  James includes Ant to compile and package its distribution. Extract the snapshot 
  to your favorite directory, cd to that directory and run the build by calling &quot;build&quot; 
  or &quot;./build.sh&quot; which will create an unpacked binary distribution 
  in the dist directory, but no archives.</p>
<p>This &quot;./dist&quot; directory is the distribution directory used in Step 1 and beyond. 
  You may either cd to ./dist, or you may copy and rename the dist directory to your 
  installation directory.</p>
<p>If you prefer you can run build with the &quot;dist&quot; task &quot;build dist&quot; 
  (or &quot;./build.sh dist&quot;). This will create the distribution in the &quot;./dist&quot; 
  directory as well as create .tgz and .zip copies of this directory, however it may 
  require other resources to build the documentation. </p>
<p> <b>Warning!</b> Any changes you've made in the 'dist' directory 
  will be lost after a recompilation. If you are making changes to the conf.xml 
  or other files, we recommend you backup and then change the copies in src to 
  avoid losing work. </p>
</div> <div class="section"><h2>Step 1: Installation.<a name="Step_1:_Installation."></a></h2> 
<p> Download distibution. Extract or copy all the files in the archive or dist 
  directory intto your installation directory. </p>
</div>

<div class="section"><h2>Step 2: Configuration.<a name="Step_2:_Configuration."></a></h2>
  <p>
    Read the short and snappy documentation at docs/index.html for a proper
    overview of configuring the system.
  </p>
  <p>
    <b>Summary</b> (for impatient people)
  </p>
  
<p> M$ users should just run /bin/run.bat. Unix users will find run.sh under the 
  same directory. A JVM must be present and its location specified in the JAVA_HOME 
  environment variable. Set this on windows at the command prompt with something 
  similar to &quot;set JAVA_HOME=\jdk1.3\bin&quot; on *nix with JAVA_HOME=/jdk1.3/</p>
<p> Running [run* --help] will provide a simple command line help. </p>
  <p>
    Most UNIX systems require superuser privileges to open sockets below 1024,
    which includes the IANA-standard SMTP (on port 25) and POP3 (on port 110).
    These default ports can be changed in the conf.xml file. (Obviously, you
    would then need to reconfigure your clients. This may not be an option if
    you want to receive mail from external mailservers.)
  </p>
  
<p> The Avalon framework will unpack the necessary configuration files you will 
  need to start the server.  Wait until it is running, stop it again (ctrl-c), and 
  edit the configuration (thereafter *nix users can run the server in the background 
  using ./run.sh &amp;). For basic use, you only need to set two items in the 
  JAMES.conf.xml file: a root password for the remote administration facility 
  and the IP address of a DNS server. Once you have edited the configuration files, 
  press 'Enter' on the terminal where Avalon is waiting. </p>
</div>

<div class="section"><h2>Step 4: Kickstart.<a name="Step_4:_Kickstart."></a></h2>
  <p>
    Once started you'll see a message saying Avalon is running. This means that
    Avalon has loaded JAMES and every other needed Block (see /logs/avalon.log)
    and is now waiting for a socket request.
    Since at the beginning James is empty, it will not have any local users
    registered.
    To register a local user open a telnet session with localhost on port 4555,
    log in as root (&quot;root[enter]  &lt;password-you-set-in-conf.xml&gt;[enter]&quot;) and
    type &quot;help&quot; for a list of available commands in the &quot;JAMES remote
    administrator tool&quot;. It is really a basic set but should allow you to test
    installation.
  </p>
  <p>
    Once you have some local users registered, try sending mail to one of them
    @localhost with SMTP (port 25) (assuming you have not changed the default
    server names in the conf.xml file). You'll see the mail appear under
    ../var/mail/localinbox/[user].
    Try now to retrieve that mail using POP3 (port 110).
    Trace out JAMES actions in /logs/*info.log.
    Actions that will be taken by JAMES on incoming mail are configured in
    the mailet pipe line (/conf/JAMES.conf.xml). Look at it if you want to
    understand what's happening.
  </p>
  <p>
  Good luck :)
  </p>
</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>
