How to create your own email server using Main-in-a-Box

Mahad AhmedMahad Ahmed
5 min read

Introduction

  • Hosting your email server is the first step to secure your privacy

  • It saves you money if you own multiple domains

What You'll Need

  • [ ] Brand new VPS or any Linux Server (My recommended VPS provider is Linode)

  • [ ] Ubuntu 22.04 LTS is the latest supported version

  • [ ] SSH access with sudo privilege

Step 1: Create non-root user

To create a new user, please type the following:

adduser johndoe

Replace johndoe with your own username. Then follow the prompts to set the password and other details

We need to let the new user run commands with sudo when we need, so, to make that happen you'll need to run:

usermod -aG sudo johndoe

Then connect to the server using the new user.

ssh johndoe@YOUR-SERVER-IP

We have logged in using the password of our new user which is not secure. To prepare our future logins to use ssh keys instead of passwords, let's quickly do the following:

mkdir -p ~/.ssh    # to create .ssh folder
chmod 700 ~/.ssh   # set correct permissions
touch ~/.ssh/authorized_keys  # create file where we put our keys
chmod 600 ~/.ssh/authorized_keys # change file permissions

Let's open another terminal, if you don't have ssh keys in your computer and create new one by running:

ssh-keygen -t rsa -b 4096 -C youremail@example.com

Step 2: Setup and Secure Your Server

Before installing Mail-in-a-Box, it's crucial to properly secure your VPS. Let's lock down SSH access and configure the firewall to only allow necessary ports.

Disable Password Authentication for SSH

\==⚠️ Important: Ensure you've already set up SSH key authentication before disabling password login, or you'll lock yourself out of your server!==

Password-based SSH authentication is vulnerable to brute force attacks. Let's configure SSH to only accept key-based authentication:

# Edit the SSH configuration file
sudo nano /etc/ssh/sshd_config

Find and modify these settings (or add them if not present):

PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

Save the file and restart the SSH service:

sudo systemctl restart ssh

Configure Firewall to Allow Only Required Ports

Mail-in-a-Box needs specific ports open to function properly. Let's use UFW (Uncomplicated Firewall) to restrict access:

# install UFW if not already installed
sudo apt update && sudo apt install ufw -y

# set default policies
sudo ufw default deny incoming
sudo ufw default allow outgoing

# allow SSH (always do this first to avoid lockout)
sudo ufw allow 22/tcp

# allow essential Mail-in-a-Box ports
sudo ufw allow 25/tcp    # SMTP (mail delivery)
sudo ufw allow 587/tcp   # SMTP submission (outgoing mail)
sudo ufw allow 465/tcp   # SMTP over SSL (legacy secure mail)
sudo ufw allow 143/tcp   # IMAP
sudo ufw allow 993/tcp   # IMAP over SSL
sudo ufw allow 110/tcp   # POP3
sudo ufw allow 995/tcp   # POP3 over SSL
sudo ufw allow 80/tcp    # HTTP (for Let's Encrypt)
sudo ufw allow 443/tcp   # HTTPS (webmail and admin panel)

# Enable the firewall
sudo ufw enable

Verify your firewall configuration:

sudo ufw status verbose

You should see all the required ports listed as "ALLOW" in the output.

Step 2: Install Mail-in-a-Box

To install Mail-in-a-Box please run the following command:

curl -s https://mailinabox.email/setup.sh | sudo bash

Then follow the instructions shown in the instructions. You'll be asked to set your email. At first it will show us me@current-hostname so replace it with me@yourdomain.com, make sure to replace yourdomain.com with a domain name you control.

If you need to change later any of the answers you provided, you can run

sudo mailinabox

Step 3: Setup DNS & Domains

Go to your domain DNS dashboard, if you don't know how, please search "Godaddy DNS settings" replace with the name of Godaddy with the provider you use.

To find out what records to put in the DNS records. Go to box.yourdomain.com/admin then you'll see the rest of instructions by going to each menu and see places that have red error messages.

The most important places to check are the System, Mail & Users dropdown in the top nav-bar of the page.

Figer: 1

Some of the important subdomains you need to add in your domain name provider's DNS are the following:

TypeHostname/SubdomainField: Value
NS Recordns1.box.example.combox.example.com
ns2.box.example.combox.example.com
MX Recordbox.example.comPreference: 10

Subdomain: leave it empty | | | | | | A/AAAA Record | box.example.com | IP Address: SERVER-IP | | | autoconfig.example.com | IP Address: SERVER-IP | | | autoconfig.box.example.com | IP Address: SERVER-IP | | | ns1.box.example.com | IP Address: SERVER-IP | | | | | | TXT Record | example.com | v=spf1 include:example.com include:box.example.com -all | | | _dmarc | v=DMARC1; p=quarantine; rua=mailto:info@example.com; pct=100; adkim=s; aspf=s | | | default._bimi | v=BIMI1;l=https://example.com/path/to/your/logo.svg;a= | | | s1._domainkey | Use Online Generator like easydmarc.com to create what to put here. | | | | |

The above TXT records are important to make your email messages legitimate, else they'll be rejected by spam filters and end up in Junk/Spam folder instead of the Inbox.

Under System dropdown click TLS (SSL) Certificates then click Provision button to generate those certificates. After this succeeds you'll see most of red warnings change to green.

Step 4: Add Email Users

To add a new domain you need to add the first email and this automatically saves the DNS records for the new domain name. Click on Mail and Users dropdown on the top nav-bar then click users. Fill the form.

Normal user can only login through the email portal which is box.example.com/mail but Administrator can login as email user and admin user in box.example.com/admin.

Testing Your Implementation

To find out if your email has an issue or is rejected by Gmail or Microsoft you'll receive rejected email notification to the email you have put in your DNS _dmarc record entry. If everything is working you'll be able to send emails to all providers.

To use your new emails in email apps use the Instructions menu under Mail & Users dropdown. That page lists all the ways you can use your emails on mobile and desktop apps.

Conclusion

  • We have created our self-hosted email service

  • We also secured our server

  • And added extra TXT DNS entries to make our emails legitimate and avoid them to end up in spam box.

Further Resources

0
Subscribe to my newsletter

Read articles from Mahad Ahmed directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Mahad Ahmed
Mahad Ahmed

Mahad loves building mobile and web applications and is here to take you on a journey, filled with bad decisions and learning from mistakes, through this blog.