How to Configure Subaddressing/PlusAddressing in DirectAdmin?
What is Subaddressing?
Subaddressing is also known as ‘plus addressing’ or ‘detailed addressing’, and describes the ability to send email to an address that not only contains an email username, an @ character, and a domain, but also a delimiter character and a ‘detail’ string. For example, sending an email to the address admin+mailinglist@domain.com, which uses the + as the delimiter and mailinglist as the detail, constitutes subaddressing.
The different parts of the email address are defined like so according to RFC 5233,
:user "+" :detail "@" :domain
\-----------------/
:local-part
So, the local-part is composed of both the user and the detail components with regards to subaddressing.
The RFC, which outlines Sieve Email Filtering, describes subaddressing like so,
Subaddressing is the practice of augmenting the local-part of an
[RFC2822] address with some 'detail' information in order to give
some extra meaning to that address. One common way of encoding
'detail' information into the local-part is to add a 'separator
character sequence', such as "+", to form a boundary between the
'user' (original local-part) and 'detail' sub-parts of the address,
much like the "@" character forms the boundary between the local-part
and domain.
Typical uses of subaddressing might be:
o A message addressed to "ken+sieve@example.org" is delivered into a
mailbox called "sieve" belonging to the user "ken".
o A message addressed to "5551212#123@example.com" is delivered to
the voice mailbox number "123" at phone number "5551212".
Why would one want to use this? Some use cases include:
- Better organization of one’s inbox by organizing mailing list subscriptions into their own folders
- Identifying subscriptions that may have sold your contact information/email address
- To detect and discard or redirect spam messages
To configure subaddressing on a DirectAdmin box, one must edit the configurations of Exim and Dovecot, and then add the appropriate Sieve filter rules. Sieve filtering is accomplished via Pigeonhole for Dovecot, which adds support for the Sieve language (RFC 5228) and the ManageSieve protocol (RFC 5804) to Dovecot.
Configure Exim To Support Subaddressing
Exim already includes a condition for plus addressing,
.include_if_exists /etc/exim/local_part_suffix.conf
So all we need to do is create the parent directory and the file with the necessary contents.
Create the directory like so,
mkdir /etc/exim
Then create the file,
touch /etc/exim/local_part_suffix.conf
Add the following contents to the file,
local_part_suffix = +*
local_part_suffix_optional
Or, if you want to allow a plus, a hyphen, and an underscore to all function as delimiters that separate the local_part into user and detail parts,
local_part_suffix = +* : -* : _*
local_part_suffix_optional
Now restart Exim and plus addressing should now work in Exim,
service restart exim
Configure Dovecot for Subaddressing
First, enable Pigeonhole,
cd /usr/local/directadmin/custombuild
./build set pigeonhole yes
./build pigeonhole
./build roundcube
Upon enabling Pigeonhole, you will see a “Filters” section in RoundCube settings.
Next, create the following file,
/etc/dovecot/conf.d/subaddressing.conf
Add the following contents into the subaddressing.conf file,
recipient_delimiter = +
lmtp_save_to_detail_mailbox = yes
lda_mailbox_autocreate = yes
lda_mailbox_autosubscribe = yes
Note that if you wanted to support multiple characters for the delimiter, such as the plus sign, the hyphen, and the underscore, you could use this instead of the single recipient delimiter above,
recipient_delimiter = +-_
Restart Dovecot,
service dovecot restart
Listed below are the meanings of the configuration values used above as described by Dovecot Core Settings,
recipient_delimiter |
---|
Default: + |
The separator between the :user and :detail address parts. |
lmtp_save_to_detail_mailbox |
---|
Default: no |
Values: Boolean |
If the recipient address includes a detail element / role (as in user+detail format), save the message to the detail mailbox. |
lda_mailbox_autocreate |
---|
Default: no |
Values: Boolean |
Should LDA create a non-existent mailbox automatically when attempting to save a mail message? |
lda_mailbox_autosubscribe |
---|
Default: no |
Values: Boolean |
Should automatically created mailboxes be subscribed to? |
Add the ManageSieve Filters
The Subaddressing ManageSieve Filter
Add the ManageSieve filter for the email address that you want to support subaddressing. The filter is as follows,
# subaddressing rules
require ["fileinto","subaddress","variables"];
# rule:[subaddressing]
if address :detail :matches "to" "*"
{
set :lower "detail" "${1}";
fileinto "INBOX.${detail}";
}
The instructions outlined in the sections that follow detail how to add the filter manually via SSH, however, you could alternatively add the filter via Roundcube.
Simply log into Roundcube for the email address you wish to enable subaddressing for, click Settings, then click Filters, and then click on managesieve to highlight, click Actions, then Edit Filter Set. Enter the rules as shown in the image below.
Applying the Filter Globally to All Email Addresses
To create a global sieve filter so that all email accounts support subaddressing, add the sieve filter above to the file /var/lib/dovecot/sieve/default.sieve and use the sievec command line utility to compile it,
sievec /var/lib/dovecot/sieve/default.sieve
This will create the appropriate /var/lib/dovecot/sieve/default.svbin file.
Applying the Filter to a Single Email Address
To create the rule for a single email user, edit the following file instead and compile (note that you must replace USERNAME with the actual Linux username of the DirectAdmin account, DOMAIN.TLD with the actual domain, and EMAILUSERNAME with the actual email account username),
/home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/sieve/managesieve.sieve
Use this sequence of steps to correctly create and compile the rules for the single user (again, make sure to make the necessary replacements for USERNAME, DOMAIN.TLD, and EMAILUSERNAME),
mkdir /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/sieve
chmod 600 /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/sieve
nano /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/sieve/managesieve.sieve # add the sieve filter rules here
sievec /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/sieve/managesieve.sieve
chown -R USERNAME.mail /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/sieve
cd /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME
ln -s sieve/managesieve.sieve .dovecot.sieve
chown USERNAME.mail /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/.dovecot.sieve
Go ahead and send a test email to test functionality. Tail the Exim log to know when it is received,
tail -f /var/log/exim/mainlog
Upon successful receipt, you can check your email for your new email folder,
ls -lah /home/USERNAME/imap/DOMAIN.TLD/EMAILUSERNAME/Maildir/
Applying the Filter for System Email Accounts
Alternatively, for system email accounts (those email accounts that are created automatically when you create a new DirectAdmin user account and are formatted like username@domain.tld rather than emailusername@domain.tld), you can use this command (make sure to replace USERNAME with your actual DirectAdmin username in the commands that follow!),
ls -lah /home/USERNAME/Maildir
To add Sieve rules for system accounts, create and edit the following file for the ManageSieve rules,
/home/USERNAME/sieve/managesieve.sieve
You will need to do the following with this,
mkdir /home/USERNAME/sieve
chmod 600 /home/USERNAME/sieve
nano /home/USERNAME/sieve/managesieve.sieve # add the sieve filter rules here
sievec /home/USERNAME/sieve/managesieve.sieve
chown -R USERNAME.mail /home/USERNAME/sieve/
cd /home/USERNAME
ln -s sieve/managesieve.sieve .dovecot.sieve
chown USERNAME.mail /home/USERNAME/.dovecot.*
Result
Let’s say you send an email to testuser+testing@domain.tld. You would see the ‘testing’ mailbox listed in Roundcube under the ‘INBOX’ (due to the automatic subscription configuration setting in Dovecot) and you would see a directory structure like the following, where ‘.INBOX.testing‘ was automatically created and the email placed within it,
[root@host1 scripts]# ls -lah /home/USER/imap/DOMAIN.TLD/testuser/Maildir/
total 28K
drwxrwx--- 6 testuser mail 269 Sep 26 19:24 .
drwxrwx--- 3 testuser mail 21 Sep 26 19:21 ..
drwxrwx--- 2 testuser mail 6 Sep 26 19:21 cur
-rw-rw---- 1 testuser mail 40 Sep 26 19:24 dovecot.index.log
-rw-rw---- 1 testuser mail 912 Sep 26 19:24 dovecot.list.index.log
-rw-rw---- 1 testuser mail 24 Sep 26 19:24 dovecot.mailbox.log
-rw-rw---- 1 testuser mail 51 Sep 26 19:24 dovecot-uidlist
-rw-rw---- 1 testuser mail 8 Sep 26 19:24 dovecot-uidvalidity
-r--r--r-- 1 testuser mail 0 Sep 26 19:24 dovecot-uidvalidity.5f6fdba3
drwxrwx--- 5 testuser mail 135 Sep 26 19:24 .INBOX.testing
-rw-rw---- 1 testuser mail 10 Sep 26 19:24 maildirsize
drwxrwx--- 2testuser mail 6 Sep 26 19:21 new
-rw-rw---- 1 testuser mail 19 Sep 26 19:24 subscriptions
drwxrwx--- 2 testuser mail 6 Sep 26 19:24 tmp
NOTE:
As of Directadmin v.1.61.5, the following feature has been added which affects the creation of email accounts that contain a plus sign in their :user portion of the :local-part of the email address:
option to block/allow plus char in new email names
This feature does not appear to affect the setup outlined in this article for enabling subaddressing when set to the default of allow_email_plus=0.