Setup Email Server From Scratch Debian #2 - 09 Virtual Domains
We believe in data independence, and support others who want data independence.
Debian Email From Scratch version 2 finished 2025-07-30.
We are still adding to it but it all works!
################################
# Howto Create Virtual Domains #
################################
# One mail server can handle multiple domains "virtual domain" and newer Postfix
# and Dovecot can use SNI, server name indication, mapping with multiple
# certificates. Each virtual host can have it's own ssl certificate, just like
# virtual hosts in apache.
# The three solutions are 1) put multiple hostnames in a single certificate for
# postfix or 2) use the same mx servers for all domains, or 3) use SNI. If you
# want the virtual host users to go to the "virtual domain" website specify
# different directores for the website autoconfig autodiscover each with their
# own certificates or a combined certificate. Use a common roundcube directory
# and modify /var/www/roundcube/config/config.inc.php to display a pretty name
# based on matching the php servername value. This page covers using SNI or
# using 2 mx hosts for all the virtual domains, eg. pointing the MX records for
# those domains to those 2 mx hosts. The SNI method is a a few lines more to
# configure so the best choice.
# This page of the "Debian Email From Scratch" tutorial assumes successful setup
# of the following ...
1. Debian Server
2. LAMP - Debian Apache MySQL/MariaDB PHP
3. Postfix - smtp server
4. Dovecot - imap server
5. PostfixAdmin - Postfix Web Administration
6. SPF DMARC and DKIM - email authetication and spam filters
7. Roundcube - Webmail (installed using git sources)
8. Roundcube - Webmail (installed using apt packages)
# Create DKIM keys for new virtual hosts
mkdir -p /etc/dkimkeys/okbsd.com
mkdir -p /etc/dkimkeys/okbiz.net
mkdir -p /etc/dkimkeys/coragarden.com
opendkim-genkey -b 2048 -d okbsd.com -D /etc/dkimkeys/okbsd.com -s 20250723 -v
opendkim-genkey -b 2048 -d okbiz.net -D /etc/dkimkeys/okbiz.net -s 20250723 -v
opendkim-genkey -b 2048 -d coragarden.com -D /etc/dkimkeys/coragarden.com -s 20250724 -v
find /etc/dkimkeys/* -type d -exec chown -R opendkim:postfix {} \;
find /etc/dkimkeys/* -type d -exec chmod 700 {} \;
chmod 600 /etc/dkimkeys/*/*.private
# Get the DKIM selector and key from the file and copy it to the DNS...
cat /etc/dkimkeys/okbsd.com/20250723.txt
cat /etc/dkimkeys/okbiz.net/20250723.txt
cat /etc/dkimkeys/coragarden.com/20250724.txt
# Setup DNS for New Domain(s), point the mx records, autoconfig, and
# autodiscover to the main mx server hostname. and paste the DKIM TXT record for
# this domain.
A @ 15.204.113.148
AAAA @ 2604:2dc0:202:300::3645
A mail 15.204.113.148
AAAA mail 2604:2dc0:202:300::3645
A mx 15.204.113.148
AAAA mx 2604:2dc0:202:300::3645
CNAME autoconfig mx.coragarden.com
CNAME autodiscover mx.coragarden.com
CNAME www okbsd.com
TXT @ v=spf1 ip4:15.204.113.148 ip6:2604:2dc0:202:300::3645/64 mx ~all
TXT _dmarc v=DMARC1; p=quarantine; rua=mailto:postmaster@coragarden.com; ruf=mailto:postmaster@coragarden.com; sp=quarantine
TXT 20250723._domainkey v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQE....IDAQAB
SRV _autodiscover _tcp 5 0 443 mx.coragarden.com
# In Custom MX Records
MX @ mx.okdeb.com 0
MX @ mail.okdeb.com 10
# Copy the keys to your name server record and remember to remove the extra
# quotes and spaces in 2 sections of the DKIM line.
# We use mx.okdeb.com and mail.okdeb.com as the MX host so we don't need to
# create A and AAAA records and certs for additional mx servers like
# mx.okbsd.com and mail.okbsd.com, but this example includes the A and AAAA
# records that can be used for webmail. There is some benefit to adding A and
# AAAA records if users will access IMAP or webmail at mail.okbsd.com for
# example. If users will use these hostnames for IMAP and SMTP use a combined
# certificate with all the hostnames (postfix can only use one cert).
# If DMARC reports are sent to an okdeb.com email address also add an entry in
# the okdeb.com DNS to "allow" the dmarc to be sent from another domain.
# DNS TXT Entry for okbsd.com
TXT _dmarc v=DMARC1; p=quarantine; rua=mailto:postmaster@okdeb.com; ruf=mailto:postmaster@okdeb.com; sp=quarantine
# DNS TXT Entry for okdeb.com
TXT okbsd.com._report._dmarc v=DMARC1;
# Append it to the keytable file to avoid mistyping the dkim selectors.
cat /etc/dkimkeys/okbsd.com/20250723.txt >> /etc/opendkim/keytable
cat /etc/dkimkeys/okbiz.net/20250723.txt >> /etc/opendkim/keytable
cat /etc/dkimkeys/coragarden.com/20250724.txt >> /etc/opendkim/keytable
# Edit the appended entries.
nano /etc/opendkim/keytable
# ---
20250718._domainkey.okdeb.com okdeb.com:20250718:/etc/dkimkeys/okdeb.com/20250718.private
20250723._domainkey.okbsd.com okbsd.com:20250723:/etc/dkimkeys/okbsd.com/20250723.private
20250723._domainkey.okbiz.net okbiz.net:20250723:/etc/dkimkeys/okbiz.net/20250723.private
20250724._domainkey.coragarden.com coragarden.com:20250724:/etc/dkimkeys/coragarden.com/20250724.private
# ---
nano /etc/opendkim/signingtable
# ---
*@okdeb.com 20250718._domainkey.okdeb.com
*@okbsd.com 20250723._domainkey.okbsd.com
*@okbiz.net 20250723._domainkey.okbiz.net
*@coragarden.com 20250724._domainkey.coragarden.com
# ---
nano /etc/opendkim/trustedhosts
# ---
127.0.0.1
::1
localhost
15.204.113.148
2604:2dc0:202:300::3645
mx.okdeb.com
mail.okdeb.com
okdeb.com
coragarden.com
mx.coragarden.com
mail.coragarden.com
# ---
systemctl restart opendkim
# By the time this is created the DNS has hopefully propagated and can be
# tested, test the keys.
# This one works and it has been using Namecheap Basic DNS
opendkim-testkey -d okbiz.net -s 20250723 -vvv
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key '20250723._domainkey.okbiz.net'
opendkim-testkey: key secure
opendkim-testkey: key OK
opendkim-testkey -d coragarden.com -s 20250724 -vvv -x /etc/opendkim.conf
opendkim-testkey: checking key '20250724._domainkey.coragarden.com'
opendkim-testkey: key secure
opendkim-testkey: key OK
opendkim-testkey -d okbsd.com -s 20250723 -vvv -x /etc/opendkim.conf
opendkim-testkey: '20250723._domainkey.okbsd.com' query timed out
# okbsd.com was previously running on another machine with itself as the
# nameserver running bind wiht dnssec. By the next day google still wouldn't
# provide an address for okbsd.com. This problem did not resolve until I setup a
# new FreeBSD server (probably not relevant) and set the new A Record in
# Namecheap, disabled then reenabled dnssec (probably relevant). I also setup
# bind again with a master zone but didn't enable my own dnssec or point the DNS
# to the machine. Save that for later another howto.
# Setup Domain in PostfixAdmin
Domain List -> New Domain
Domain: coragarden.com
Description: Cora Garden
Pass expires : 3650
Add Domain
Virtual List - Add Mailbox
vuser jack@coragarden.com
Add User
# Virtual List - redirect the default email addresses to a valid account. RFC
# standard is that every mail domain should have a postmaster@domain.tld
# account. So either keep all the aliases, or keep postermaster, or delete them
# all and add a catchall alias like *.coragarden.com -> postmaster@okdeb.com. In the last
# case make sure and create an postmaster@okdeb.com account or alias to another
# email account used for mail administration.
# While you could add another domain to your webserver it is easier to just
# login with roundcube at the mx.okdeb.com address. If you want to use roundcube
# with new domain name setup apache and letsencrypt certs for the new domain.
# You could also put multiple domains in one cert and use ServerAlias in the
# same virtual host configuration.
# It is better to keep the mx mail web hosts separate from the general website
# directory (manage mail separately from managing website content) and use a
# separate cert for the postfix and www hosts.
# Create new website and mail website directories
mkdir -p /var/www/coragarden/mx/
mkdir -p /var/www/coragarden/mail
mkdir -p /var/www/coragarden/html
# Configure new website in apache
nano /etc/apache2/sites-available/coragarden.conf
# ---
<VirtualHost *:80>
ServerName coragarden.com
ServerAlias www.coragarden.com
ServerAdmin postmaster@coragarden.com
CustomLog ${APACHE_LOG_DIR}/access.log vhost_combined
ErrorLog ${APACHE_LOG_DIR}/error.log
DirectoryIndex index.php index.html
DocumentRoot /var/www/coragarden/html
<Directory /var/www/coragarden/html/>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# If you want to run cgi's uncomment these and the handler
ScriptAlias /cgi-bin/ "/var/www/coragarden/cgi-bin/"
<Directory "/var/www/coragarden/cgi-bin">
AllowOverride None
Options +ExecCGI -Indexes -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
</VirtualHost>
# ---
# Configure mx and mail host in apache, certbot -a apache needs these virtual
# hosts to create the certs for postfix.
nano /etc/apache2/sites-available/mx.coragarden.conf
# ---
<VirtualHost *:80>
ServerName mx.coragarden.com
ServerAlias mail.coragarden.com
ServerAlias autoconfig.coragarden.com
ServerAlias autodiscover.coragarden.com
ServerAdmin postmaster@coragarden.com
CustomLog ${APACHE_LOG_DIR}/access.log vhost_combined
ErrorLog ${APACHE_LOG_DIR}/error.log
DirectoryIndex index.php index.html
DocumentRoot /var/www/coragarden/mx/
<Directory /var/www/coragarden/mx/>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# autoconfig
Alias /mail "/var/www/coragarden/mail/"
<Directory /var/www/coragarden/mail/>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
#RewriteEngine on
#RewriteCond %{SERVER_NAME} =mail.coragarden.com [OR]
#RewriteCond %{SERVER_NAME} =mx.coragarden.com
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
# ---
chown -R root:www-data /var/www/coragarden
chmod o-rwx /var/www/coragarden
cd /etc/apache2/site-enabled
ln -s ../sites-available/coragarden.conf
ln -s ../sites-available/mx.coragarden.conf
apachectl restart
# Create certificate for website
certbot certonly -a apache --agree-tos --redirect --hsts --staple-ocsp --email postmaster@okdeb.com --cert-name coragarden.com -d coragarden.com,www.coragarden.com
# Create certificate for the mail services
certbot certonly -a apache --agree-tos --redirect --hsts --staple-ocsp --email postmaster@okdeb.com --cert-name coragarden.com -d mx.coragarden.com,mail.coragarden.com,autodiscover.coragarden.com
setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/
# If you need to delete certificates
certbot revoke --cert-name mx.domain3.net
certbot delete --cert-name mx.domain3.net
# You can also create certificate with multiple domains in one cert - not recommended
certbot certonly --webroot --agree-tos --redirect --hsts --staple-ocsp --email postmaster@okdeb.com --cert-name mxcerts \
-w /var/www/okdeb/mx -d mx.okdeb.com,mail.okdeb.com \
-w /var/www/coragarden/mx -d mx.coragarden.com,mail.coragarden.com
(U)pdate certificate/(C)ancel: U
Renewing an existing certificate for mx.okdeb.com and 3 more domains
# Restart apache
apachectl restart
# Postfix with Server Name Indication SNI (virtual mail domain certs)
# Postfix can now use Server Name Indication SNI and so can have separate certs
# for each virtual email domain. In this case we can use the web cert created
# above with the same hostnames. We can still keep the regular website certs
# separate or combine them all into one for easier management. We'll keep them
# separate in this example.
# The default values needs to be set in addition to the sni_maps line.
nano /etc/postfix/main.cf
# ---
# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/mx.okdeb.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mx.okdeb.com/privkey.pem
smtpd_tls_security_level=may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
tls_server_sni_maps = hash:/etc/postfix/sni_maps
# ---
# Every domain will neeed 2 entries, one for each hostname mx.domain.tld and
# mail.domain.tld. We could also make a separate cert for each host but with
# more certs per domain and many domains it complicates management.
nano /etc/postfix/sni_maps
# ---
mx.okdeb.com /etc/letsencrypt/live/mx.okdeb.com/privkey.pem /etc/letsencrypt/live/mx.okdeb.com/fullchain.pem
mail.okdeb.com /etc/letsencrypt/live/mx.okdeb.com/privkey.pem /etc/letsencrypt/live/mx.okdeb.com/fullchain.pem
mx.coragarden.com /etc/letsencrypt/live/mx.coragarden.com/privkey.pem /etc/letsencrypt/live/mx.coragarden.com/fullchain.pem
mail.coragarden.com /etc/letsencrypt/live/mx.coragarden.com/privkey.pem /etc/letsencrypt/live/mx.coragarden.com/fullchain.pem
# ---
postmap -F /etc/postfix/sni_maps
systemctl restart postfix
# Dovecot SNI maps - Dovecot also needs the default specified.
nano /etc/dovecot/conf.d/10-ssl.conf
# ---
# Default
ssl_cert = </etc/letsencrypt/live/mx.okdeb.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mx.okdeb.com/privkey.pem
local_name mx.okdeb.com {
ssl_cert = </etc/letsencrypt/live/mx.okdeb.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mx.okdeb.com/privkey.pem
}
local_name mail.okdeb.com {
ssl_cert = </etc/letsencrypt/live/mx.okdeb.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mx.okdeb.com/privkey.pem
}
local_name mx.coragarden.com {
ssl_cert = </etc/letsencrypt/live/mx.coragarden.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mx.coragarden.com/privkey.pem
}
local_name mail.coragarden.com {
ssl_cert = </etc/letsencrypt/live/mx.coragarden.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mx.coragarden.com/privkey.pem
}
# ---
systemctl restart dovecot
# Configure https for coragarden.com and mx.coragarden.com
nano /etc/apache2/sites-available/ssl-coragarden.conf
# ---
<VirtualHost *:443>
ServerName coragarden.com
ServerAlias www.coragarden.com
ServerAdmin postmaster@coragarden.com
CustomLog ${APACHE_LOG_DIR}/access.log vhost_combined
ErrorLog ${APACHE_LOG_DIR}/error.log
DirectoryIndex index.php index.html
DocumentRoot /var/www/coragarden/html
<Directory /var/www/coragarden/html/>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/coragarden.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/coragarden.com/privkey.pem
<FilesMatch "\.(?:cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/coragarden/cgi-bin">
AllowOverride None
Options +ExecCGI -Indexes -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
#<Directory /var/www/coragarden/cgi-bin>
# SSLOptions +StdEnvVars
#</Directory>
</VirtualHost>
# ---
nano /etc/apache2/sites-available/ssl-mx.coragarden.conf
# ---
<VirtualHost *:443>
ServerName mx.coragarden.com
ServerAlias mail.coragarden.com
ServerAlias autoconfig.coragarden.com
ServerAlias autodiscover.coragarden.com
ServerAdmin postmaster@coragarden.com
CustomLog ${APACHE_LOG_DIR}/access.log vhost_combined
ErrorLog ${APACHE_LOG_DIR}/error.log
DirectoryIndex index.php index.html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mx.coragarden.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mx.coragarden.com/privkey.pem
DocumentRoot /var/www/roundcube/
Alias /roundcube "/var/www/roundcube"
Alias /webmail "/var/www/roundcube"
<Directory /var/www/roundcube/>
#Options FollowSymLinks MultiViews
Options FollowSymLinks
AllowOverride All
Require all denied
Require ip trusted_ip1 trusted_network2
</Directory>
Alias /admin-login /usr/share/postfixadmin/public
<Directory /usr/share/postfixadmin/>
Options FollowSymLinks MultiViews
AllowOverride All
Require all denied
Require ip trusted_ip1 trusted_network2
</Directory>
Alias /mail "/var/www/coragarden/mail"
Alias "/Autodiscover/Autodiscover.xml" "/var/www/coragarden/mail/Autodiscover.xml/index.php"
<Directory /var/www/okdeb/mail/>
<Directory /var/www/coragarden/mail/>
DirectorySlash Off
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch "\.(?:cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
</VirtualHost>
cd /etc/apache2/site-enabled
ln -s ../sites-available/ssl-coragarden.conf
ln -s ../sites-available/ssl-mx.coragarden.conf
apachectl restart
echo '<?php print "<!DOCTYPE html lang=\"en\"><html><head><title>Title</title></head>\n<body><h1>Hello World!</h1></body></html>"; ?>' > /var/www/coragarden/html/test.php
echo '<?php print "<!DOCTYPE html lang=\"en\"><html><head><title>Title</title></head>\n<body><h1>Hello World!</h1></body></html>"; ?>' > /var/www/coragarden/mx/test.php
# Test to make sure it is working
https://coragarden.com/test.php
https://mail.coragarden.com/test.php
# Remove the test files
rm /var/www/coragarden/html/test.php
rm /var/www/coragarden/mx/test.php
# Setup Autoconfig auto discover
cd /tmp
git clone https://github.com/smartlyway/email-autoconfig-php
cd email-autoconfig-php/mail
mkdir -p /var/www/coragarden/mail
cp config-v1.1.xml /var/www/coragarden/mail
cd /tmp/email-autoconfig-php/Autodiscover
cp -r /tmp/email-autoconfig-php/Autodiscover/Autodiscover.xml /var/www/coragarden/mail
# For outgoing server use port 587 with STARTTLS
nano /var/www/coragarden/mail/config-v1.1.xml
# ---
<?xml version="1.0"?>
<clientConfig version="1.1">
<emailProvider id="coragarden.com">
<domain>example.org</domain>
<displayName>coragarden.com</displayName>
<displayShortName>coragarden.com</displayShortName>
<incomingServer type="imap">
<hostname>mx.coragarden.com</hostname>
<port>993</port>
<socketType>SSL</socketType>
<authentication>password-cleartext</authentication>
<username>%EMAILADDRESS%</username>
</incomingServer>
<outgoingServer type="smtp">
<hostname>mx.coragarden.com</hostname>
<port>587</port>
<socketType>STARTTLS</socketType>
<username>%EMAILADDRESS%</username>
<authentication>password-cleartext</authentication>
</outgoingServer>
</emailProvider>
</clientConfig>
# ---
nano /var/www/coragarden/mail/Autodiscover.xml/index.php
# ---
<?php
$raw = file_get_contents('php://input');
$matches = array();
preg_match('/<EMailAddress>(.*)<\/EMailAddress>/', $raw, $matches);
header('Content-Type: application/xml');
?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<User>
<DisplayName>Cora Garden</DisplayName>
</User>
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>IMAP</Type>
<Server>mx.coragarden.com</Server>
<Port>993</Port>
<DomainRequired>off</DomainRequired>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
<LoginName><?php echo $matches[1]; ?></LoginName>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server>mx.coragarden.com</Server>
<Port>587</Port>
<DomainRequired>off</DomainRequired>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
<LoginName><?php echo $matches[1]; ?></LoginName>
</Protocol>
</Account>
</Response>
</Autodiscover>
# ---
# Login to webmail with the new account, setup acccount on thunderbird, and test email.
Login: jack@okbsd.com
Password: ***********
# Check the source and the headers now have DKIM signature something like ...
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=okbsd.com;
s=Cy9jmkzC2USPfcJ4JIuzA07rpB0gS; t=1747783045;
bh=wiMQ3UTGd/zMN6+PeBSiAAUHXfKRtjj7J2UI7ZvJA+A=;
h=Date:From:To:Subject:From;
b=bkk87+VHY7HvSb1b9mq0b9bLc0XBMOzf6CnBMLcoLMAZ0yN1nDyrILNj9RiYUCJsq
hC6QsHu9S4t9Y8q85AoszhY78ddzfU8SLcg/IlTmWuiNWisrkKjAZ9ftPEtxVxkYKZ
VnpSveCK4O5Gw==
# And
SPF: PASS with IP 15.204.113.148
DKIM: 'PASS' with domain coragarden.com
DMARC: 'PASS'
# If you are adding this to your mail server and have setup SpamAssassin Amavis ClamAV antivirus
# you will need to add the virtual domain to amavis or it won't get virus scanned.
# Fix amavis to scan all configured virtual domains
nano /etc/amavis/conf.d/05-domain_id
# ---
@local_domains_acl = ( ".$mydomain",".coragarden.com",".domain3.org" );
# ---
# Sometimes email clients aren't RFC compliant. When Outlook 2019 sends a test
# mail it doesn't include a Date header, so it is a good idea to whitelist your own
# domains in SpamAssassin. Skip this if you haven't setup SpamAssassin yet.
nano /etc/mail/spamassassin/local.cf
# ---
whitelist_from *@coragarden.com
whitelist_from *@okdeb.com
# ---
systemctl restart postfix dovecot spamd spamass-milter
# If you have problems with Identity and user signature in roundcube go back and configure Enigma.
cd /var/www/roundcube/plugins/enigma
cp config.inc.php.dist config.inc.php
$config['enigma_pgp_homedir'] = "/var/www/roundcube/plugins/enigma/home";
mkdir /var/www/roundcube/plugins/enigma/home
chown www-data:www-data /var/www/roundcube/plugins/enigma/home
chmod 750 /var/www/www/roundcube/plugins/enigma/home
pkg install gnupg
pear install Crypt_GPG
# Customize the Roundcube landing page
nano /var/www/roundcube/config/config.inc.php
# ---
// Name your service. This is displayed on the login screen and in the window title
$sn = $_SERVER['SERVER_NAME'];
if (preg_match('/coragarden/', $sn)) {
$config['product_name'] = 'Cora Garden Webmail';
} else if (preg_match('/okdeb/', $sn)) {
$config['product_name'] = 'Ok Deb Webmail';
} else {
$config['product_name'] = 'Roundcube Webmail';
}
# ---
# I made 2 mistakes previously that I will mention. I was migrating
# coragarden.com to a new mail server and left coragarden.com on the first mail
# server and wasn't able to send test messages. The first mail server thought it
# was itself. And, another case, I was migrating okbiz.net and coragarden to a
# new server then because I had okbiz.net already set in /etc/hosts of the new
# server I wasn't able to send to okbiz.net. 'DOH!' pulled a Homer.
# Next Up - Blocking Spam