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

02 FAMP Install <- Intro -> 04 Dovecot IMAP