Configuration

This document explains the JAMES.conf.xml file for James 2.0
JAMES 2.0 uses a date-stamped version of Avalon from late September 2001. The lib directory includes jars with date-stamped names for the Avalon libraries.

James Server Configuration

James Configuration

These tag elements control the JAMES spooling and identification settings.

<name> default value meaning
postmaster Postmaster@localhost Is the source of error replies and the email users will mail to for any problem. You should change this to an address that can receive incoming messages.
helloName attribute autodetect=TRUE and value of 'myMailServer' The name by which James will identify itself in SMTP and POP3 greetings. If autodetect is TRUE James will attempt to detect automatically the name, failing which it will use 'localhost'. If autodetect is not TRUE, James will use the specified name or 'localhost' if none is specified. Look in jamesinfo.log for lines like "[...] Local host is: [servername] and [...] Hello Name is: [machine name]"
servernames/servername attribute autodetect=TRUE and last value of 'localhost' A list of host names James will consider as local. Any user [user]@[servername] will be considered to be local. If autodetect is TRUE James will attempt to detect automatically the name and use any names specified. Look in jamesinfo.log for a line like "[...] Handling mail for:: [domain/host]"
spoolRepository file://var/mail/spool/ This is the path where incoming messages are stored before beeing processed.
inboxRepository file://var/mail/localinbox/ This is the root for local users inbox. Each user will have a personal folder [inboxRepository]/[user]
spoolmanagerthreads 5 This is the number of thread that work polling mails from the spool and take care of processing them.

SMTP Server Configuration

These tag elements affect the SMTP listener (for incoming messages).

<name> default value meaning
port 25 The port we are listening to.
bind N.A. Specific IP addresses that you wish to bind this service to.
smtphandler N.A. Parent for all SMTPHandler configuations.
connectiontimeout 120000 If nothing is received from an open connection for more than {timeout] mills the connection is closed.

POP3 Server Configuration

These tag elements affect the POP3 server (for message retrieval)

<name> default value meaning
port 110 The port we are listening to.
bind N.A. Specific IP addresses that you wish to bind this service to.
useTLS false Whether you wish to require/use TLS (SSL) on this port.
pop3handler N.A. Parent for all POP3Handler configuations.
connectiontimeout 120000 If nothing is received from an open connection for more than {timeout] mills the connection is closed.

Users Manager Configuration

These tag elements affect the configuration of the list of local users.

<name> default value meaning
repository file://var/users/ The path where local mail account information are stored.

Remote Manager Configuration

These tag elements affect the remote manager, a telnet based utility to manage the User Manager.

<name> default value meaning
port 4555 The port we are listening to.
bind N.A. Specific IP addresses that you wish to bind this service to.
useTLS false Whether you wish to require/use TLS (SSL) on this port.
administrator_accounts N.A. The parent of <account>
account login="root" password="root" A list of root account to administer JAMES.
connectiontimeout 120000 If nothing is received from an open connection for more than {timeout] mills

Transport Configuration

These tag elements affect SMTP remote delivery, specifically, DNS lookup functionality.

<name> default value meaning
dnsServer/servers/server N.A. This is a list of DNS to resolve external address.
authoritative false Whether to require authoritative (non-cached) DNS records. Should always be false unless you understand the implications.
repository file://var/mail/delayed/ This is a temp repository path shared with the name of "TMP_REPOSITORY". It is used by the RemoteDelivery Mailet to store mail for futher delivery. (Note: this is not very elegant and will probally change soon)
mailets rootpath="org.apache.james.transport.mailets." This is the parent node for all mailet configurations. The rootpath specify where mailet repository is. (Note: need to plug more than one repository)

The Mailet processor pipeline

This is James sitemap. It defines how each incoming mail will be processed. Incoming mails begins their process at the first mailet in the pipe. Each step is described by a <servet> tag with some attributes: <mailet match="[matchClass]=[matchParameters]" class="[mailetClass]">. The Matcher class split the mail into two Collections: one with all recipients matching conditions and the other with all recipient not matching. All information in the mail except recipients cloned so the message that both matching and not matching are identical (again except recipients). The matching recipients and mail will be passed to the specified mailet for processing. After processing both mails, the untouched not-matching mail and the processed matching mail, each go to next step in the processor. Some mailets will indicate the mail should be consumed and no continue processing. The Null mailet for example will simply consume any incoming mail as will the RemoteDelivery since after delivery the mail needs no more processing.

Matchers

The Matcher interface defines how match class should work. Their work is to split a Vector of recipients into two: the ones matching a specified condition and all others. Currently implemented matchers:

class name parameter action example
All none match all recipients. match="All"
HasAttachment none match all recipients if the message has an attachment (if content type is multipart/mixed). match="All"
HostIs comma separated list of hosts names match all recipients belonging to one of the specified hosts match="HostIs=myHost.mydom.org,yourHost"
HostIsLocal none check recipients's hosts against the list of host names set in configuration for localhost (see <servername>). match="HostIsLocal"
InSpammerBlacklist DNS zone with blacklist match all recipients if mail received from an IP address on the blacklist. match="InSpammerBlacklist=blackholes.mail-abuse.org"
IsSingleRecipient none match mail if only has 1 recipient. match="IsSingleRecipient"
NESSpamCheck none match all recipients if mail matches various spam detection rules. match="NESSpamCheck"
RecipientIs comma separated list of recipients match all recipients defined in condition. match="RecipientIs=root@localhost,admin@localhost"
RecipientIsLocal none match recipient which host is local (see HostIsLocal) and that are recognized by the Users Manager to be local accounts. match="RecipientIsLocal"
RelayLimit Maximum number of hops. match all recipients if the message has more than the specified number of SMTP hops. Important to prevent race conditions in SMTP delivery. match="RelayLimit=30"
RemoteAddrInNetwork comma separated list of network addresses match all recipients if the message was received from an IP address that matches the comma separated list. Wildcards are supposed, e.g., 192.168.0.* is a valid option. match="RemoteAddrInNetwork=127.0.0.1,192.168.*"
RemoteAddrNotInNetwork comma separated list of network addresses match all recipients if the message was not received from an IP address that matches the comma separated list. Wildcards are supposed, e.g., 192.168.0.* is a valid option. match="RemoteAddrNotInNetwork=127.0.0.1,192.168.*"
SenderInFakeDomain none match recipients who's domain name portion of their email address is invalid. Queries for A, CNAME, and MX record entries. match="SenderInFakeDomain"
SenderIs comma separated list of address. match all recipients if sender is in the condition string, else match none. match="SenderIs=badBay@badhost"
SizeGreaterThan number of bytes. supports 'k' and 'm' suffixes. match all recipients if message is larger than the given number of bytes, kilobytes, or megabytes. match="SizeGreaterThan=1m"
SubjectIs comma separated list of address. match all recipients if the subject is equal to the condition string, else match none. match="SubjectIs=REMOVE"
SubjectStartsWith comma separated list of address. match all recipients if the subject starts with the condition string, else match none. match="SubjectStartsWith: [ADV]"
UserIs comma separated list of accounts match all recipients defined in condition regardless of host. match="UserIs=root,admin"

Some examples:
- <mailet match="RecipientIsLocal" class="LocalDelivery">

- <mailet match="UserIs=root" class="Forward">

- <mailet match="SenderIs=badBoy@myhost,badGirl@yourhost" class="Null">

Mailet

Mailet are classes that process a message. They are passed a Mail object on which they can perform any kind of task. Clever use of mailets allow you to write an email-based application. Simple mailets provide basic mail functionality like mail forwarding, mailing list, "I'm on vacation" message, mail logging etc. As simply as these mailet, you can write and deploy your own mailet to perform any kind of task.
Here you are some of the mailets bundled with James along with their configuration:

Null
Consume any incoming mail. No configuration needed.
<mailet match="SenderIs=badBoy@badhost" class="Null"> </mailet>
debug.Identity
Leave any incoming mail untouched. A debug mailet (not really useful). No configuration needed.
<mailet match="All" class="Identity"> </mailet>
Forward

Replace the recipient list with recipient specified in configurations.

<mailet match="RecipientIs=root@localhost" class="Forward">

<forwardto> green@blue.org </forwardto> <forwardto> red@yellow.com </forwardto>
</mailet>
ToProcessor
Sends the incoming mail object to a new processor pipeline. root and error are special processors that should always be defined.
<mailet match="RecipientIsLocal" class="ToProcessor">
<processor> localdelivery </processor>
</mailet>
ServerTime
Replies to the sender with a short message with the current time. No configuration needed.
<mailet match="RecipientIs=time@localhost" class="ServerTime">
</mailet>
ToRepository
Stores mails in the specified MailRepository. Useful for mail logging etc. If the passThrough parameter is false the mail will be consumed, if true it will be returned untouched to the pipe.
<mailet match="RecipientIs=root@localhost" class="ToRepository">

<repositoryPath> file://var/mail/logAdmin </repositoryPath>

<passThrough> true </passThrough> (default false)
</mailet>
LocalDelivery
Store mail in the local inbox, one folder for each user.
<mailet match="RecipientIsLocal" class="LocalDelivery">
</mailet>
RemoteDelivery Relays mails to remote hosts. "delayTime" is the time in mills the mailet will wait before retrying sending a mail which fail at first time. "maxRetries" is the number of retries before sending back to sender the mail.
<mailet match="!RecipientIsLocal" class="RemoteDelivery">

<delayTime> 21600000 </delayTime>

<maxRetries> 5 </maxRetries>

</mailet>

Redirect
A mailet providing configurable redirection services

This mailet can produce listserver, forward and notify behaviour, with the original message intact, attached, appended or left out altogether.

This built in functionality is controlled by the configuration as laid out below.

However it is also designed to be easily subclassed to make authoring redirection mailets simple.

By extending it and overriding one or more of its methods new behaviour can be quickly created without the author having to address any other issue than the relevant one. For more information see the javadocs

The configuration parameters are:

param desc
<recipients> A comma delimited list of email addresses for recipients of this message, it will use the "to" list if not specified. These addresses will only appear in the To: header if no "to" list is supplied.
<to> A comma delimited list of addresses to appear in the To: header, the email will only be delivered to these addresses if they are in the recipients list.

The recipients list will be used if this is not supplied
<sender> A single email address to appear in the From: header

It can include constants "sender" and "postmaster"
<message> A text message to be the body of the email. Can be omitted.
<inline>

One of the following items:

  • unaltered The original message is the new message, for forwarding/aliasing
  • heads The headers of the original message are appended to the message
  • body The body of the original is appended to the new message
  • all Both headers and body are appended
  • none Neither body nor headers are appended
<attachment>

One of the following items:

  • heads The headers of the original are attached as text
  • body The body of the original is attached as text
  • all Both headers and body are attached as a single text file
  • none Nothing is attached
  • message The original message is attached as type message/rfc822, this means that it can, in many cases, be opened, resent, fw'd, replied to etc by email client software.
<passThrough> TRUE or FALSE, if true the original message continues in the mailet processor after this mailet is finished. False causes the original to be stopped.
<attachError> TRUE or FALSE, if true any error message available to the mailet is appended to the message body (except in the case of inline == unaltered)
<replyto> A single email address to appear in the Rely-To: header, can also be "sender" or "postmaster", this header is not set if this is omited.
<prefix> An optional subject prefix prepended to the original message subject, for example..

Undeliverable mail:
<static>

TRUE or FALSE, if this is true it hints to the mailet that none of the parameters are set dynamically, and therefore they can be set once in the init method.

False tells the mailet to call all the "getters" for every mail processed.

This defaults to false.

It should be TRUE in all cases, except where one of the getter methods has been overriden to provide dynamic values, such as a listserve which might override getRecipients() to get a list from a users repository.

Example, creates a distribution list:

<mailet match="RecipientIs=test@localhost" class="Redirect">

<recipients>x@localhost, y@localhost, z@localhost</recipients>

<to>list@localhost</to>

<sender>owner@localhost</sender>

<message>sent on from James</message>

<inline>unaltered</inline>

<passThrough>FALSE</passThrough>

<replyto>postmaster</replyto>

<prefix>[test mailing]</prefix>

<static>TRUE</static>

<passThrough>FALSE</passThrough>

</mailet>

and this sends a spam notification to the postmaster

with the original message attached as a message, and a subject prefix:

<mailet match="All" class="Redirect">

<recipients>x@localhost</recipients>

<sender>postmaster</sender>

<message>Message marked as spam:

</message>

<inline>heads</inline>

<attachment>message</attachment>

<passThrough>FALSE</passThrough>

<attachError>TRUE</attachError>

<replyto>postmaster</replyto>

<prefix>[spam notification]</prefix>

<static>TRUE</static>

<passThrough>FALSE</passThrough>

</mailet>