Cualquier servidor de correo que se exponga o bien en Internet o localmente en una organización, necesita un MTA. Entre los más extendidos se encuentran Postfix y Sendmail. De hecho el primero se suele utilizar por defecto en Linux, mientras que Sendmail es el estándar para sistemas BSD. Por otra parte muchísimos despliegues se hacen con sistemas que integran la pila completa de correo electrónico, MailCow, iRedMail, etc. En esta guía utilizaremos OpenSMTPd, parte del proyecto OpenBSD y por lo tanto con una confiabilidad y simplicidad implícitas.

Requisitos

Parte fundamental del correo electrónico es el DNS. Se necesita tener adecuadamente configurados, como mínimo, el registro MX, de esta forma, otros MTA podrán encontrar el MTA del dominio al que quieren enviar el correo. En este caso, del nuestro. Para este paso, podemos revisar la entrada de este blog que detalla cómo poner en funcionamiento un servidor DNS con Bind9. A partir de esta entrada estaremos en condiciones de resolver los registros necesarios. Si en cambio no tenemos un servidor DNS propio, podremos crear estos registros en el panel de control de nuestro proveedor.

Instalación

Deshabilitar SendMail

Como hemos visto, necesitamos reemplazar el MTA por defecto del sistema para que no interrumpa el funcionamiento del MTA que estamos instalando.

sysrc sendmail_enable="NO"
sysrc sendmail_submit_enable="NO"
sysrc sendmail_msp_queue_enable="NO"
sysrc sendmail_outbound_enable="NO"

Instalar OpenSMTPd

pkg install -y opensmtpd

Configuración

Editamos el fichero /usr/local/etc/mail/smtpd.conf para que funcione en nuestro entorno. De momento sólo usamos usuarios locales, con lo que la configuración se parecerá a lo siguiente:

# Ficheros que contienen los dominios y correos aceptados
table aliases file:/etc/mail/aliases
table domains file:/etc/mail/domains

# Configurar los certificados
pki mail.correo.com key "/usr/local/etc/mail/ssl/private/mail.correo.com.key.pem"
pki mail.correo.com cert "/usr/local/etc/mail/ssl/certs/mail.correo.com.cert.pem"

# Direcciones que escucharán el servicio
listen on vtnet0 tls pki mail.correo.com auth-optional
listen on vtnet0 smtps pki mail.correo.com auth
listen on vtnet0 port submission tls-require pki mail.correo.com auth

# Entrega al maildir local
action "local" maildir alias <aliases>
# Reenvío al MTA externo
action "relay" relay helo mail.correo.com

# Reglas de entrega
match from local for local action "local"
match from any for domain <domains> action "local"
match from any auth for any action "relay"

Necesitamos tener el fichero /etc/mail/domains preparado con nuestro dominio:

correo.com

Cambiar el mailer

Necesitamos decirle al sistema que cualquier programa que necesite o vaya a enviar correo, utilice el agente que acabamos de instalar. Esto se realiza modificando el /etc/mail/mailer.conf

#sendmail   /usr/libexec/sendmail/sendmail
#mailq      /usr/libexec/sendmail/sendmail
#newaliases /usr/libexec/sendmail/sendmail
#hoststat   /usr/libexec/sendmail/sendmail
#purgestat  /usr/libexec/sendmail/sendmail
sendmail    /usr/local/sbin/smtpctl
send-mail   /usr/local/sbin/smtpctl
mailq       /usr/local/sbin/smtpctl
makemap     /usr/local/libexec/opensmtpd/makemap
newaliases  /usr/local/libexec/opensmtpd/makemap

Iniciar el demonio

sysrc smtpd_enable="YES"
service smtpd start

Pruebas

En primer lugar podemos comprobar si el servicio queda a la escucha:

sockstat -4l
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS
_smtpd   smtpd      804   10 tcp4   172.16.249.20:25      *:*
_smtpd   smtpd      804   11 tcp4   172.16.249.20:465     *:*
_smtpd   smtpd      804   12 tcp4   172.16.249.20:587     *:*

Y podemos enviar un correo de prueba y verificar en los logs que realmente se está tramitando de manera correcta.

echo "Test" | mail -s "Test" root
<22>1 2022-12-18T13:44:51.353133+02:00 mail.correo.com smtpd 804 - - 8de9183d3d571e35 smtp connected address=local host=mail.correo.com
<22>1 2022-12-18T13:44:51.355793+02:00 mail.correo.com smtpd 804 - - 8de9183d3d571e35 smtp message msgid=258c7c3a size=418 nrcpt=1 proto=ESMTP
<22>1 2022-12-18T13:44:51.356010+02:00 mail.correo.com smtpd 804 - - 8de9183d3d571e35 smtp envelope evpid=258c7c3a9728af75 from=<i686@mail.correo.com> to=<root@mail.correo.com>
<22>1 2022-12-18T13:44:51.356828+02:00 mail.correo.com smtpd 804 - - 8de9183d3d571e35 smtp disconnected reason=quit
<22>1 2022-12-18T13:44:51.371083+02:00 mail.correo.com smtpd 804 - - 8de9183ff2261c4c mta delivery evpid=258c7c3a9728af75 from=<i686@mail.correo.com> to=<root@mail.correo.com> rcpt=<root@mail.correo.com> delay=0s result=Ok stat=Delivered