<?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 Aug 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 - Quick Start</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="20120817" />
    <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"/>
                      
          <!-- 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-08-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">
            <strong>1. Quick Start</strong>
          </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">
                          <a href="dev.html" title="Architecture">Architecture</a>
            </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>Quick Start<a name="Quick_Start"></a></h2>

  <p>The goal of the document is to allow anyone to start with James binary 
     distribution as an operational mail server.</p>

<div class="source"><pre>
Step 0: Requirements
####################

  * JRE 1.5+
  * root (linux/unix) or Administrator (Windows)
  * libc6 (linux)
  * 512MB RAM (launches with -Xmx512M - can use less, can need more, depending on load)

Step 1: Download
#################

  * Download apache-james-3.0-beta4-app.zip from http://james.apache.org/download.cgi#Apache_James_Server

Step 2: Deploy
##############

  * Unzip apache-james-3.0-beta4-app.zip.
  * You should have a folder with sub-folders bin, conf, lib, log, var and four text files.

$ unzip japache-james-3.0-beta4-app.zip
$ cd apache-james-3.0-beta4-app
$ ls (linux) / dir (windows)
bin
BUILD.txt
conf
lib
LICENSE.txt
log
NOTICE.txt
README.txt
var

Step 3: Understand James Features
#################################

Persistence
- Mailbox is for users' Inbox, Sent Items, Trash... folders - Mailbox persistence is configured in spring-beans.xml (by default jpa, you set the database connection properties in database.properties - can also be maildir=file, jcr). We think to move this config out-of spring-beans.xml.
- Mailrepositorystore is for spam, error,... mails, so nothing to do with users visible mails. Available mailstore persistence are defined in mailstore.xml. Each has an URL prefix (file, db, dbfile,...) that can be used in mailetcontainer.xml to define where to store spam,... mails (exemple: file://var/mail/error/).
- Domain persistence is configured in domainlist.xml
- Users persistence is configured in usersrepository.xml
- All database connection use the database.properties in case of database access.

Mailet Container - http://james.apache.org/server/3/feature-mailetcontainer.html

SMTP Hooks - http://james.apache.org/server/3/feature-smtp-hooks.html

Step 4: Configure
#################

  * All configuration files are embedded in jars.
  * We ship in the conf folder template configuration files.
  * You can override the default configuration : 
      Copy the conf folder any ...-template... you need and update according to your needs.

database.properties
META-INF/persistence.xml
dnsservice.xml
domainlist.xml
fetchmail.xml
imapserver.xml
james-listmanager.xml
jcr-repository.xml
jmx.properties
lmtpserver.xml
log4j.properties
mailetcontainer.xml
mailbox.xml
mailserver.xml
mailrepositorystore.xml
pop3server.xml
recipientrewritetable.xml
smtpserver.xml
sqlResources.xml
usersrepository.xml
wrapper.xml
lib folder (for your additional jar, e.g. JDBC drviers,...)

James is packaged with virtual hosting enabled, JPA (Derby database) storage for the mails, users, and domains.
On SMTP (see smtpserver.xml config)
  * authRequired is true by default, so you can safely deploy James on the Internet (it won't be an open relay).
  * verifyIdentity is true by default (you can only send mails with a FROM being the authenticated user).

To use another database:
  * Edit the database.properties and change the values according to your database.
  * Add the needed JDBC driver jar in the ./conf/lib folder according to your database.
  
Step 5: Start
#############

$ cd bin
$ ./james start 
  * !! you need libc6 installed on Linux !! - sudo apt-get install libc6-i386 libc6-dev-i386 on ubuntu
  * You can see log result in the log/james-server.log file.

Step 6: Create Domains and Users
################################

Time to add domains and users.
We will show how to via the james-cli (client interface).
You also can achieve this via JMX (launch jconsole). JMX has more operations tha james-cli.

  * cd bin
  * james-cli -h localhost -p 9999 adddomain mydomain.tld
  * james-cli -h localhost -p 9999 adduser myuser@mydomain.tld mypassword

  * The username to use in your mail client will be myuser@mydomain.tld

Step 7: Test
############

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 172.16.1.131 SMTP Server (JAMES SMTP Server 3.0-beta4) ready Sat, 6 Nov 2010 17:31:33 +0100 (CET)
ehlo test
250-172.16.1.131 Hello test (aoscommunity.com [127.0.0.1])
250-PIPELINING
250-ENHANCEDSTATUSCODES
250 8BITMIME
mail from:&lt;YOUR_NAME@YOUR_DOMAIN&gt;
250 2.1.0 Sender &lt;YOUR_NAME@YOUR_DOMAIN&gt; OK
rcpt to:&lt;YOUR_NAME@YOUR_DOMAIN&gt;
250 2.1.5 Recipient &lt;YOUR_NAME@YOUR_DOMAIN&gt; OK
data
354 Ok Send data ending with &lt;CRLF&gt;.&lt;CRLF&gt;
subject: test

this is a test
.
250 2.6.0 Message received
quit
Connection closed by foreign host.

Step 8: Manage
##############

8.1. Manage via james-cli

  usage: java org.apache.james.cli.ServerCmd --host &lt;arg&gt; &lt;command&gt;
    -h,--host &lt;/arg&gt;   node hostname or ip address
    -p,--port &lt;/arg&gt;   remote jmx agent port number
  Available commands:
    adduser &lt;/username&gt; &lt;/password&gt;
    removeuser &lt;/username&gt;
    listusers
    adddomain &lt;/domainname&gt;
    removedomain &lt;/domainname&gt;
    listdomains

8.2. Manage via JMX

  * Launch jconsole (or any other JMX client) and connect on URL=service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi
  * Select the MBeans tab and open the org.apache.james node to view attributes and execute operations.

Step 9: Monitor
###############

  * Monitor the ./log/james-server.log log file.

  * Monitor via JMX (launch any JMX client and connect to URL=service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi)

  * Check ./var folder usage
  
    mail
    +-error
    +-address-error
    +-relay-denied
    +-spam

    store
    +-maildir
    +-derby
    +-jackrabbit
    +-activemq
      +-brokers
        +-james
      +-blob-transfer
        +-outgoing
        +-spool

  * Check /tmp folder usage

</pre></div>

<p>Time to fine-tune your James Server!</p>

<p>Read more on the <a href="install.html">install</a>, <a href="config.html">configure</a>, 
   <a href="manage.html">manage</a>, <a href="monitor.html">monitor</a> 
   and <a href="dev.html">develop</a> pages.</p>

</div>




      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    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>
