The Best Price for IPv4/IPv6 Lease – Any RIR & Any Geo-LocationOrder Now
Hostperl

Configure Mail Aliases and Virtual Users on Ubuntu VPS: Complete Setup

By Raman Kumar

Share:

Updated on Jun 14, 2026

Configure Mail Aliases and Virtual Users on Ubuntu VPS: Complete Setup

Understanding Mail Aliases and Virtual Users for VPS Hosting

Email management on your VPS gets complicated fast. Multiple domains, departments, and complex forwarding rules create a tangled mess without proper setup.

Mail aliases redirect messages from one address to another existing user account. Virtual users exist only in the mail system—no corresponding system accounts needed. Both features give you precise control over email routing and delivery on your Hostperl VPS.

This guide shows you how to configure mail aliases and virtual users with Postfix and Dovecot on Ubuntu. You'll build a flexible email system that handles multiple domains and complex routing scenarios.

Prerequisites and Initial Setup

You need a working mail server with Postfix and Dovecot installed. Your server should already accept mail for at least one domain.

Verify your current setup:

sudo postconf mail_version
sudo dovecot --version
sudo postqueue -p

Check that your main domain accepts mail:

echo "test message" | mail -s "Test" admin@yourdomain.com
sudo tail -f /var/log/mail.log

Install required packages for virtual user management:

sudo apt update
sudo apt install postfix-mysql dovecot-mysql mysql-server

Creating the Virtual Mail Database Structure

Virtual users need a database backend to store user accounts, aliases, and domain information. MySQL provides reliable storage for mail routing data.

Log into MySQL as root:

sudo mysql -u root -p

Create the virtual mail database:

CREATE DATABASE vmail;
CREATE USER 'vmail'@'localhost' IDENTIFIED BY 'secure_password_here';
GRANT ALL PRIVILEGES ON vmail.* TO 'vmail'@'localhost';
FLUSH PRIVILEGES;
USE vmail;

Create tables for domains, users, and aliases:

CREATE TABLE domains (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL UNIQUE,
  active TINYINT(1) DEFAULT 1
);

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  email VARCHAR(255) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  domain_id INT,
  active TINYINT(1) DEFAULT 1,
  FOREIGN KEY (domain_id) REFERENCES domains(id)
);

CREATE TABLE aliases (
  id INT AUTO_INCREMENT PRIMARY KEY,
  source VARCHAR(255) NOT NULL,
  destination VARCHAR(255) NOT NULL,
  domain_id INT,
  active TINYINT(1) DEFAULT 1,
  FOREIGN KEY (domain_id) REFERENCES domains(id)
);

Configuring Postfix for Virtual Domains

Postfix needs configuration changes to query the database for virtual users and aliases. These settings tell Postfix where to find routing information.

Edit the main Postfix configuration:

sudo nano /etc/postfix/main.cf

Add these lines at the end:

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_mailbox_base = /var/mail/vhosts
virtual_minimum_uid = 1000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

Create database query files for Postfix. Start with domains:

sudo nano /etc/postfix/mysql-virtual-mailbox-domains.cf

Add this configuration:

user = vmail
password = secure_password_here
hosts = 127.0.0.1
dbname = vmail
query = SELECT 1 FROM domains WHERE name='%s' AND active=1

Create the virtual mailbox maps file:

sudo nano /etc/postfix/mysql-virtual-mailbox-maps.cf
user = vmail
password = secure_password_here
hosts = 127.0.0.1
dbname = vmail
query = SELECT 1 FROM users WHERE email='%s' AND active=1

Create the alias maps configuration:

sudo nano /etc/postfix/mysql-virtual-alias-maps.cf
user = vmail
password = secure_password_here
hosts = 127.0.0.1
dbname = vmail
query = SELECT destination FROM aliases WHERE source='%s' AND active=1

Setting Up Virtual Mailbox Storage

Virtual users need dedicated storage space separate from system user home directories. This approach provides better security and organization.

Create the virtual mail directory:

sudo mkdir -p /var/mail/vhosts
sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail/vhosts -m
sudo chown -R vmail:vmail /var/mail/vhosts

Set proper permissions:

sudo chmod 750 /var/mail/vhosts

Protect the Postfix configuration files:

sudo chown root:postfix /etc/postfix/mysql-*.cf
sudo chmod 640 /etc/postfix/mysql-*.cf

Test the database connection:

sudo postmap -q "yourdomain.com" mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Configuring Dovecot for Virtual Users

Dovecot handles IMAP and POP3 access for virtual users. Configure it to authenticate against the MySQL database and locate mailboxes correctly.

Edit the Dovecot SQL configuration:

sudo nano /etc/dovecot/dovecot-sql.conf.ext

Replace the content with:

driver = mysql
connect = host=127.0.0.1 dbname=vmail user=vmail password=secure_password_here

default_pass_scheme = SHA512-CRYPT

password_query = SELECT email as user, password FROM users WHERE email='%u' AND active=1

user_query = SELECT '/var/mail/vhosts/%d/%n' as home, 'maildir:~/Maildir' as mail, 5000 AS uid, 5000 AS gid FROM users WHERE email='%u' AND active=1

iterate_query = SELECT email AS user FROM users WHERE active=1

Enable SQL authentication in Dovecot:

sudo nano /etc/dovecot/conf.d/10-auth.conf

Comment out the system auth and enable SQL:

#!include auth-system.conf.ext
!include auth-sql.conf.ext

Configure mailbox locations:

sudo nano /etc/dovecot/conf.d/10-mail.conf

Set the mail location for virtual users:

mail_location = maildir:~/Maildir
mail_privileged_group = vmail
first_valid_uid = 5000
last_valid_uid = 5000

Adding Domains and Virtual Users

With the infrastructure ready, you can add domains, users, and aliases through the database. This approach scales much better than managing text files.

Connect to the database:

mysql -u vmail -p vmail

Add your first virtual domain:

INSERT INTO domains (name) VALUES ('example.com');
INSERT INTO domains (name) VALUES ('anotherdomain.com');

Create virtual users. Generate password hashes first:

doveadm pw -s SHA512-CRYPT

Insert users with the generated hash:

INSERT INTO users (email, password, domain_id) VALUES 
  ('admin@example.com', '$6$rounds=656000$...hash...', 1),
  ('support@example.com', '$6$rounds=656000$...hash...', 1),
  ('sales@anotherdomain.com', '$6$rounds=656000$...hash...', 2);

Create mailbox directories for new users:

sudo mkdir -p /var/mail/vhosts/example.com/admin
sudo mkdir -p /var/mail/vhosts/example.com/support
sudo mkdir -p /var/mail/vhosts/anotherdomain.com/sales
sudo chown -R vmail:vmail /var/mail/vhosts

Creating and Managing Email Aliases

Email aliases provide flexible routing options. You can create simple redirects, distribution lists, or complex forwarding rules.

Add basic aliases:

INSERT INTO aliases (source, destination, domain_id) VALUES 
  ('info@example.com', 'admin@example.com', 1),
  ('contact@example.com', 'admin@example.com', 1),
  ('webmaster@example.com', 'admin@example.com', 1);

Create distribution lists by adding multiple records with the same source:

INSERT INTO aliases (source, destination, domain_id) VALUES 
  ('team@example.com', 'admin@example.com', 1),
  ('team@example.com', 'support@example.com', 1),
  ('team@example.com', 'sales@anotherdomain.com', 2);

Forward to external addresses:

INSERT INTO aliases (source, destination, domain_id) VALUES 
  ('backup@example.com', 'external@gmail.com', 1);

View all configured aliases:

SELECT a.source, a.destination, d.name as domain 
FROM aliases a 
JOIN domains d ON a.domain_id = d.id 
WHERE a.active = 1;

Many hosting providers manage complex email routing scenarios. Our shared hosting platform includes built-in alias management through cPanel. VPS users gain more control with custom database configurations.

Testing Virtual User Configuration

Verify that Postfix recognizes your virtual domains and users before proceeding to client setup.

Test domain recognition:

sudo postmap -q "example.com" mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
sudo postmap -q "anotherdomain.com" mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

Test user lookup:

sudo postmap -q "admin@example.com" mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
sudo postmap -q "support@example.com" mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

Test alias resolution:

sudo postmap -q "info@example.com" mysql:/etc/postfix/mysql-virtual-alias-maps.cf
sudo postmap -q "team@example.com" mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Reload services to apply changes:

sudo systemctl reload postfix
sudo systemctl restart dovecot

Check service status:

sudo systemctl status postfix dovecot

Advanced Alias Patterns and Use Cases

Virtual users and aliases support complex routing scenarios beyond simple forwarding. Here are practical patterns for business hosting.

Create catch-all aliases for domains:

INSERT INTO aliases (source, destination, domain_id) VALUES 
  ('@example.com', 'admin@example.com', 1);

Department-based routing:

INSERT INTO aliases (source, destination, domain_id) VALUES 
  ('billing@example.com', 'admin@example.com', 1),
  ('technical@example.com', 'support@example.com', 1),
  ('sales@example.com', 'sales@anotherdomain.com', 2);

Time-based or temporary aliases work well with database flags:

ALTER TABLE aliases ADD COLUMN expires DATETIME DEFAULT NULL;

INSERT INTO aliases (source, destination, domain_id, expires) VALUES 
  ('promo@example.com', 'marketing@example.com', 1, '2026-12-31 23:59:59');

Create a cleanup script for expired aliases:

#!/bin/bash
mysql -u vmail -p'secure_password_here' vmail -e "UPDATE aliases SET active=0 WHERE expires < NOW() AND expires IS NOT NULL;"

Managing complex email routing across multiple domains requires reliable infrastructure and expert support. Hostperl's managed VPS hosting includes migration assistance and 24/7 technical support to help you implement these configurations successfully.

Monitoring and Troubleshooting Virtual Mail

Virtual mail systems need ongoing monitoring to catch delivery issues and performance problems early.

Monitor mail queue regularly:

sudo postqueue -p
sudo qshape active
sudo qshape deferred

Check database connections:

sudo tail -f /var/log/mail.log | grep mysql
sudo tail -f /var/log/dovecot.log

Test authentication for virtual users:

doveadm auth test admin@example.com password123
doveadm user admin@example.com

Common troubleshooting steps include checking file permissions, verifying database connectivity, and ensuring proper SSL certificates. The Logwatch email monitoring tutorial helps automate these checks.

Frequently Asked Questions

Can I mix virtual users with system users?

Yes, Postfix can deliver to both virtual users and system accounts. Use virtual_alias_domains for system users and virtual_mailbox_domains for virtual users. Avoid overlapping domain assignments.

How do I backup virtual mail configuration?

Backup the MySQL database with mysqldump, save Postfix configuration files, and archive the /var/mail/vhosts directory. Test restoration procedures regularly to ensure backups work correctly.

What's the difference between aliases and forwards?

Aliases exist within the mail system and don't require separate user accounts. Forwards redirect mail from existing users to other addresses. Aliases are more efficient for simple redirections.

How many virtual users can a VPS handle?

Performance depends on VPS resources, mail volume, and storage type. A properly configured 2GB VPS typically handles 100-500 virtual users with moderate email traffic. Monitor disk I/O and memory usage.

Can virtual users access webmail interfaces?

Yes, webmail applications like Roundcube work with virtual users. Configure the webmail application to authenticate against the same MySQL database used by Dovecot for consistent access.