Distributed James Server — Command Line Interface

The Distributed James Server is packed with a command line client.

To run this command line client simply execute:

java -jar /root/james-cli.jar -h 127.0.0.1 -p 9999 COMMAND

The following document will explain you which are the available options for COMMAND.

Note: the above command line before COMMAND will be documented as {cli}.

Manage Domains

Domains represent the domain names handled by your server.

You can add a domain:

{cli} AddDomain domain.tld

You can remove a domain:

{cli} RemoveDomain domain.tld

(Note: associated users are not removed automatically)

Check if a domain is handled:

{cli} ContainsDomain domain.tld

And list your domains:

{cli} ListDomains

Managing users

Note: the following commands are explained with virtual hosting turned on.

Users are accounts on the mail server. James can maintain mailboxes for them.

You can add a user:

{cli} AddUser user@domain.tld password

Note: the domain used should have been previously created.

You can delete a user:

{cli} RemoveUser user@domain.tld

(Note: associated mailboxes are not removed automatically)

And change a user password:

{cli} SetPassword user@domain.tld password

Note: All these write operations can not be performed on LDAP backend, as the implementation is read-only.

Finally, you can list users:

{cli} ListUsers

Virtual hosting

James supports virtualhosting.

  • If set to true in the configuration, then the username is the full mail address.

The domains then become a part of the user.

usera@domaina.com and usera@domainb.com on a mail server with domaina.com and domainb.com configured are mail addresses that belongs to different users.

  • If set to false in the configurations, then the username is the mail address local part.

It means that a user is automatically created for all the domains configured on your server.

usera@domaina.com and usera@domainb.com on a mail server with domaina.com and domainb.com configured are mail addresses that belongs to the same users.

Here are some sample commands for managing users when virtual hosting is turned off:

{cli} AddUser user password
{cli} RemoveUser user
{cli} SetPassword user password

Managing mailboxes

An administrator can perform some basic operation on user mailboxes.

Note on mailbox formatting: mailboxes are composed of three parts.

  • The namespace, indicating what kind of mailbox it is. (Shared or not?). The value for users mailboxes is #private . Note that for now no other values are supported as James do not support shared mailboxes.

  • The username as stated above, depending on the virtual hosting value.

  • And finally mailbox name. Be aware that `.' serves as mailbox hierarchy delimiter.

An administrator can delete all of the mailboxes of a user, which is not done automatically when removing a user (to avoid data loss):

{cli} DeleteUserMailboxes user@domain.tld

He can delete a specific mailbox:

{cli} DeleteMailbox #private user@domain.tld INBOX.toBeDeleted

He can list the mailboxes of a specific user:

{cli} ListUserMailboxes user@domain.tld

And finally can create a specific mailbox:

{cli} CreateMailbox #private user@domain.tld INBOX.newFolder

Adding a message in a mailbox

The administrator can use the CLI to add a message in a mailbox. this can be done using:

{cli} ImportEml #private user@domain.tld INBOX.newFolder /full/path/to/file.eml

This command will add a message having the content specified in file.eml (that needs to be at the EML format). It will get added in the INBOX.subFolder mailbox belonging to user user@domain.tld.

Managing mappings

A mapping is a recipient rewriting rule. There is several kind of rewriting rules:

  • address mapping: rewrite a given mail address into another one.

  • domain mapping: rewrite a given domain into an alternate one.

  • regex mapping.

You can manage address mapping like (redirects email from fromUser@fromDomain.tld to redirected@domain.new, then deletes the mapping):

{cli} AddAddressMapping fromUser fromDomain.tld redirected@domain.new
{cli} RemoveAddressMapping fromUser fromDomain.tld redirected@domain.new

You can manage domain mapping like (redirects a domain, which means any@domain.tld will be rewritten as any@domain.new, then deletes the mapping):

{cli} AddDomainMapping domain.tld domain.new
{cli} RemoveDomainMapping domain.tld domain.new

You can view mapping for a domain:

{cli} ListDomainMappings domain.tld

You can manage regex mapping like this:

{cli} AddRegexMapping redirected domain.new .*@domain.tld
{cli} RemoveRegexMapping redirected domain.new .*@domain.tld

You can view mapping for a mail address:

{cli} ListUserDomainMappings user domain.tld

And all mappings defined on the server:

{cli} ListMappings

Manage quotas

Quotas are limitations on a group of mailboxes. They can limit the size or the messages count in a group of mailboxes.

James groups by defaults mailboxes by user (but it can be overridden), and labels each group with a quotaroot.

To get the quotaroot a given mailbox belongs to:

{cli} GetQuotaroot #private user@domain.tld INBOX

Then you can get the specific quotaroot limitations.

For the number of messages:

{cli} GetMessageCountQuota quotaroot

And for the storage space available:

{cli} GetStorageQuota quotaroot

You see the maximum allowed for these values:

For the number of messages:

{cli} GetMaxMessageCountQuota quotaroot

And for the storage space available:

{cli} GetMaxStorageQuota quotaroot

You can also specify maximum for these values.

For the number of messages:

{cli} SetMaxMessageCountQuota quotaroot value

And for the storage space available:

{cli} SetMaxStorageQuota quotaroot value

With value being an integer. Please note the use of units for storage (K, M, G). For instance:

{cli} SetMaxStorageQuota someone@apache.org 4G

Moreover, James allows to specify global maximum values, at the server level. Note: syntax is similar to what was exposed previously.

{cli} SetGlobalMaxMessageCountQuota value
{cli} GetGlobalMaxMessageCountQuota
{cli} SetGlobalMaxStorageQuota value
{cli} GetGlobalMaxStorageQuota

Manage DropList

The DropList, also known as the mail blacklist, is a collection of domains and email addresses that are denied from sending emails within the system.

Owner scopes:

  • global: contains entries that are blocked across all domains and addresses within the system. Entries in the global owner scope apply universally and affect all users and domains.

  • domain: each domain can have its own droplist, which contains entries specific to that domain.

  • user: allow to customize personalized droplist of blocked domains and email addresses.

See example commands for domain owner scope, owner.com owner, evil@devil.com denied entity.

Add Entry to the DropList

{cli} AddDropListEntry domain owner.com evil@devil.com

Remove Entry from the DropList

{cli} RemoveDropListEntry domain owner.com evil@devil.com

Getting the DropList

{cli} GetDropList domain owner.com

Testing a denied entity existence (should returns allowed or blocked)

{cli} DropListQuery domain owner.com evil@devil.com

Re-indexing

James allow you to index your emails in a search engine, for making search faster.

For some reasons, you might want to re-index your mails (inconsistencies across datastore, migrations).

To re-index all mails of all mailboxes of all users, type:

{cli} ReindexAll

And for a specific mailbox:

{cli} Reindex #private user@domain.tld INBOX

Sieve scripts quota

James implements Sieve (RFC-5228). Your users can then write scripts and upload them to the server. Thus they can define the desired behavior upon email reception. James defines a Sieve mailet for this, and stores Sieve scripts. You can update them via the ManageSieve protocol, or via the ManageSieveMailet.

You can define quota for the total size of Sieve scripts, per user.

Syntax is similar to what was exposed for quotas. For defaults values:

{cli} GetSieveQuota
{cli} SetSieveQuota value
{cli} RemoveSieveQuota

And for specific user quotas:

{cli} GetSieveUserQuota user@domain.tld
{cli} SetSieveQuota user@domain.tld value
{cli} RemoveSieveUserQuota user@domain.tld

Switching of mailbox implementation

Migration is experimental for now. You would need to customize Spring configuration to add a new mailbox manager with a different bean name.

You can then copy data across mailbox managers using:

{cli} CopyMailbox srcBean dstBean

You will then need to reconfigure James to use the new mailbox manager.