blob: 04b910c836dc07bbde1a5748239010d5a6f564ff [file] [log] [blame] [view]
Apache James Server
===================
This document is an effort to document the architecture and components that make Apache James. As a new committer to
the project I found out fast that the lack of documentation made development slow. On my quest to solving issues I
decided to document what I understand about Apache James.
Feel free to add/change things if you think it's required.
Server structure: components and services
=========================================
The directory structure is presented bellow. All directories are maven projects and correspond roughly to a component/service.
I'll explain what I mean by 'component' and 'service' bellow.
~~~
|-- app
|-- container
`-- cli
`-- core
`-- lifecycle-api
`-- filesystem-api
`-- mailbox-adapter
`-- spring
`-- util
|-- data
`-- data-api
`-- data-file
`-- data-jdbc
`-- data-jpa
`-- data-ldap
`-- data-library
|-- dns-service
`-- dnsservice-api
`-- dnsservice-dnsjava
`-- dnsservice-library
|-- karaf
`-- distribution
`-- features
`-- integration
|--mailet
`-- mailetcontainer-api
`-- mailetcontainer-camel
`-- mailets
|-- protocols
`-- protocols-imap4
`-- protocols-library
`-- protocols-lmtp
`-- protocols-pop3
`-- protocols-smtp
`-- fetchmail
|-- queue
`-- queue-activemq
`-- queue-api
`-- queue-file
`-- queue-jms
~~~
Apache James is made up of *components* and *services*. Most of the components implement an API and there are several
implementations that you can choose from. The only difference between components and services is the fact that a
service is a component designed to be consumed. It provides a useful feature.
Take **dns-service** for example:**dnsservice-api** and **dnsservice-library** are components while **dnsservice-dnsjava**
is a service that implements an API that James uses for resolving email domain names to IP addresses.
What you need to remember is that you can instantiate a service and it will provide useful value for you.
The only way to know which one is a service and which one is a component is by reading the documentation or code.
James has a nice architecture based on reusable components/services. Services are important. Components are just means to
get to create services without duplicating a lot of code.
Services in Apache James Server
===============================
Being an email server, James is composed of services related to this task:
* dns-service - Service for resolving (email) domain names
* fetch-mail scheduler - Service for scheduling email fetching
* queue - Service used for spooling email
* data (user and domain) repository - Service for storing users, passwords and email domains managed by James
* mail-store - Service for persisting email messages in mailboxes
* mailet-container - Service for processing emails using Mailets
* protocol services: SMTP, POP3, IMAP4, LMTP - Services that implement specific protocols
* JMX monitoring - Service that provides application monitoring via JMX
* configuration - more of a concern than a service
Services are created via Spring. You can find the main configuration **spring-server.xml** file in the **spring** component.
Each service defines his own Spring context which is imported in the main application context.
Application bootstrap
=====================
There are multiple ways to start/deploy James Server:
* as a standalone application/service, using scripts provided by the **app**
* as a web application (WAR) inside an application server (Apache Tomcat, Jetty, GlassFish)
* inside an OSGi container - Apache Karaf (in progress)
DNS Service
===========
Provides DNS resolution for (email) domain names. James defines an API and has one implementation that relies on
dnsjava (http://www.dnsjava.org/) for this task. You can find the code under **dns-service** directory.
This service does not depend on other services.
FetchMail Service
=================
Queue Service
=============
User and domain (data) repository Service
=========================================
Mail store Service
==================
Mailet container Service
========================
Protocol services
=================
JMX monitoring Service
======================