Setup Email Server From Scratch On FreeBSD #2 - 03 Postfix SMTPD
02 FAMP Install <- Intro -> 04 Dovecot IMAP
We believe in data independence, and support others who want data independence.
This tutorial is partially complete 2025-08-07
This is version 2 and everthing works up to and including Roundcube.
#################
# Postfix Setup #
#################
# Postfix packages on FreeBSD do not have all the options we want so we will use
# ports. It is not advised to mix ports and packages as there may be some incompatibility
# but I feel it is unlikely mysql apache or php packages will have any effect on Postfix
# and Dovecot. Some optional plugins have dependencies that can't be installed with ports,
# so we'll continue use packages for most of the install.
# If you do not have ports or want the most recent version, install them, this will take some time.
# Ignore the Device busy error.
rm -rf /usr/ports
rm: /usr/ports: Device busy
ls -la /usr/ports
drwxr-xr-x 2 root wheel 2 Aug 6 09:19 ./
drwxr-xr-x 15 root wheel 15 Jun 6 01:34 ../
pkg install portsnap
mkdir -p /var/db/portsnap
cd /usr/ports
portsnap fetch
portsnap extract
# For subsequent updates use 'portsnap fetch update'.
# Compile Postfix from ports collection.
cd /usr/ports/mail/postfix
make rmconfig
make
# Select these, compile will be much faster without PGSQL and SQLITE
X BLACKLISTD
X CDB
X DOCS
X EAI
# X INST_BASE
X LDAP
X LMDB
X MYSQL
X PCRE2
# PGSQL
X SASL
# SQLITE
X TLS
X Native Language Support
# After successful compile to make install
make install
# Check if sendmail is running
service sendmail status
sendmail is not running.
sysrc postfix_enable="YES"
sysrc sendmail_enable="NONE"
mv /usr/local/etc/mail/mailer.conf /usr/local/etc/mail/mailer.conf.old
install -d /usr/local/etc/mail
install -m 0644 /usr/local/share/postfix/mailer.conf.postfix /usr/local/etc/mail/mailer.conf
nano /etc/periodic.conf
# ---
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
# ---
# We are using sasl mail must be able to read sasldb* so check it too ...
root@okbsd.com:~# ls -l /usr/local/etc/sasl*
-rw-r----- 1 cyrus mail 16K Aug 1 14:51 /usr/local/etc/sasldb2.db
# Postfix has to be in mail group, see if it is correct ...
root@okbsd.com:#~# grep mail /etc/group
mail:*:6:postfix
# If postfix is not in mail add postfix to mail group
pw group mod -n mail -m postfix
# Looks good so <reboot>
shutdown -r now
ssh root@okbsd.com
root@okbsd.com:~# service postfix status
postfix is running as pid 3086.
root@okbsd.com:~# postconf mail_version
mail_version = 3.10.1
root@okbsd.com:/usr/ports# sockstat -lp 25 | grep master
root master 3086 13 tcp4 *:25 *:*
root master 3086 14 tcp6 *:25 *:*
root@okbsd.com:~# telnet gmail-smtp-in.l.google.com 25
Trying 2607:f8b0:4004:c08::1a...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP d75a77b69052e-48edb679b60si36993221cf.575 - gsmtp
> EHLO smtp.okbsd.com
250-mx.google.com at your service, [2604:2dc0:200:187::1]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
<control> - ]
quit
# Rebuild alias accounts
newaliases
# Install Alpine, Alpine is an easy to use mail reader that has a nano like interface
# Using alpine will make it easy test send and receive email with a subject
pkg install alpine
# If you want to add another user use...
adduser
# Add a user
pw adduser -n jack -s /usr/local/bin/bash -m
# Delete a user
pw userdel -n jack
umount zroot/home/jack
rm -rf /home/jack
# Change groupid to 995
pw groupmod -n sudo -g 995
# Switch to the user account
su - jack
# Open alpine mail reader and send an email to another mail account
alpine
e (exit the greeter)
i (inbox)
c (compose)
ctrl-x (send)
q (quit)
# Or use postfix directly as sendmail
echo "test email" | sendmail useremail@gmail.com
# Reply to the email from jack@okbsd.com
# Find the mail spool directory
root@okbsd.com:/var/spool# postconf mail_spool_directory
mail_spool_directory = /var/mail
# Check if mail was recieved
root@okbsd.com:/var/mail# cd /var/mail
root@okbsd.com:/var/mail# ls -l
-rw--w---- 1 root mail 2679 May 5 15:46 root
-rw------- 1 user user 5354 May 5 15:53 user
root@okbsd.com:/var/mail# cat user
<raw mail output>
# Read with alpine
su - jack
alpine
# If you have problems sending or receiving mail check the mail log
tail -300 -f /var/log/maillog
# Change message size limit
postconf | grep message_size_limit
message_size_limit = 10240000
# Increase limit to 50MB
postconf -e message_size_limit=52428800
# Increase limit to 100MB
postconf -e message_size_limit=104857600
# Increase limit to 200MB
postconf -e message_size_limit=209715200
# Increase limit to 500MB - 0.5 GB which is quite high
postconf -e message_size_limit=536870912
# Set unlimited mailbox size
postconf | grep mailbox_size_limit
mailbox_size_limit = 51200000
# 0 means unlimited
postconf -e mailbox_size_limit=0
postconf | grep mailbox_size_limit
mailbox_size_limit = 0
# Setup hostname, we are going to be editing this file alot.
cp /usr/local/etc/postfix/main.cf /usr/local/etc/postfix/main.cf._default_
cp /usr/local/etc/postfix/master.cf /usr/local/etc/postfix/master.cf._default_
nano /usr/local/etc/postfix/main.cf
# ---
myhostname = smtp.okbsd.com
mydomain = okbsd.com
# ---
service postfix restart
service postfix status
# Check you alias mapping, alias is no left forwards to account on the right
# This send all root mail to user@okbsd.com
nano /etc/mail/aliases
# ---
root: jack
# ---
# Remap the aliases
newaliases
# check inet protocols
postconf inet_protocols
inet_protocols = all
# If your host only supports ipv4, set ...
postconf -e "inet_protocols = ipv4"
service postfix restart
# To use both ipv4 and ipv6...
postconf -e "inet_protocols = all"
service postfix restart
# Next install dovecot IMAP server