| 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 |
| ====================== |
| |
| |
| |
| |