The Funtoo Linux project has transitioned to "Hobby Mode" and this wiki is now read-only.
Mail Server
Running one's own email server doesn't have to be mystical and impenetrable; using a simple MTA like Postfix along with an LDA like Dovecot makes the task relatively easy. Regrettably, good information on how to do this is hard to come by. What this guide will help you do is install a mail server which uses a database backend to manage domains and users, and features mail delivery via POP3 and/or IMAP.
Prerequisites
If you intend to run your own email server, you will need to have DNS with at least one MX record on a DNS server that can be seen by the Internet at large. Setting such a thing up is beyond the scope of this document.
Preparation
The following packages need to be installed first, before we can do anything: mail-mta/postfix
, net-mail/dovecot
, and dev-db/mariadb
. Before we emerge these, however, we must ensure some USE flags are properly set first:
/etc/portage/package.use/mail-server
- USE flagsmail-mta/postfix dovecot-sasl pam ssl
net-mail/dovecot bzip2 maildir pam ssl zlib
With USE flags properly set, we can emerge our packages:
root # emerge -avq postfix mariadb
Setting the dovecot-sasl
USE flag should pull in net-mail/dovecot
. If it does not, emerge this way:
root # emerge -avq postfix dovecot mariadb
Configuration
Now we come to the meat of the project. First we will have to set up the mail user/domain database, then we will have to configure Postfix, then finally, configure Dovecot. At the end of this procedure, we should have a fully functioning mail server.
Setting up the Database
First step is to set up the database for the virtual domain/user tracking. We need to set up the database's root user and get the database up and running:
root # mysqladmin -u root password '<strong-password>' root # rc-update add mysql default root # rc
Next, we need to login to MySQL (you will have to enter the <strong-password> you set above):
root # mysql -p
Now, we create the database and its tables:
mysql> CREATE DATABASE mailserver; mysql> USE mailserver; mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY '<mailuserpass>'; mysql> FLUSH PRIVILEGES; mysql> CREATE TABLE virtual_domains (id INT(11) NOT NULL AUTO_INCREMENT, root ##i## name VARCHAR(50) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> CREATE TABLE virtual_users (id INT(11) NOT NULL AUTO_INCREMENT, root ##i## domain_id INT(11) NOT NULL, password VARCHAR(106) NOT NULL, email VARCHAR(100) NOT NULL, root ##i## PRIMARY KEY (id), UNIQUE KEY email (email), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) root ##i## ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> CREATE TABLE virtual_aliases (id INT(11) NOT NULL AUTO_INCREMENT, root ##i## domain_id INT(11) NOT NULL, source VARCHAR(100) NOT NULL, destination VARCHAR(100) NOT NULL, root ##i## PRIMARY KEY (id), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) root ##i## ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> INSERT INTO virtual_domains VALUES (1, 'mymail.server.com');