Servidor de correo en Ubuntu, la alternativa a Gmail

Escrito por:
Fecha: 2015-02-17 15:05:00 00:00

Alojando mi correo personal en mi propio servidor

Introducción

Es normal o al menos más común mantener tu blog o página web en tu propio servidor que hacer lo mismo con tu servidor de correos, principalmente por el spam, y por que es más dificil mantener un servidor de correos que un servidor web. Esto porque debido al spam es posible que algunos de tus correos no lleguen a destino debido a el IP de tu servidor no sea conocida o hubiera sido utilizada en algún momento para enviar spam.

Igualmente muchos hackers tratarán de hacerse de tu servidor para enviar campañas de spam a travéz de él.

Pero la satisfacción de tener tu información contigo y no dependiendo de otros, especialmente Google, es grande y el trabajo extra a veces vale la pena.

Algunas cosas han cambiado desde los días en que la única forma de acceder tu correo era a travéz de Eudora, POP3 y desde tu computador, hoy en día llevamos el correo a todas partes en nuestro teléfono, y normalmente quienes te envían correos esperan una respuesta pronta.

Yo había dejado de alojar mi propio correo sobre todo debido a activesync, que es por el momento la mejor tecnología para sincronizar tu correo con el móvil, pero ahora esta disponible una versión opensource, ya veremos como se usa.

Configurando tu propio servidor de correos

Los requerimientos para mi correo son, pues la verdad solo una, correo electrónico confiable, calendario ya lo tengo disponible en el servidor Exchange de la oficina, y el directorio de contactos aún no estoy seguro de donde lo alojare, pero puede que lo haga con CardDav o con mi cuenta de Gmail, despues de todo tengo una para mis aplicaciones Android, solo que no la uso para correo. Por lo tanto, considerando que lo único que requiero es correo, y que lo acceso principalmente del celular y de Microsoft Outlook cuando estoy en la máquina de la oficina (Windows 8) o Mail.app en Mac, por lo tanto no requiero una interfaz gráfica.

El software que voy a utilizar para cubrir mis necesidades es:

  • Ubuntu (El sistema operativo)
  • Postfix (Para recibir el correo y enviarlo via SMTP)
  • Dovecot (Para recuperar el correo vía IMAP para los clientes de escritorio)
  • Procmail (Para clasificar correo)
  • D-push (Para recuperar el correo vía ActiveSync para el cliente de mi Android)
  • Amazon SES

Vamos a explicar un poco como se configura cada uno de estos componentes para lograr lo deseado, no vamos a mostrar como instalar Ubuntu, normalmente es solo arrancarlo en algún proveedor de VPS

Postfix

Vamos a comenzar con postfix, que es un servidor que nos permite recibir y enviar correos mediante el protocolo SMTP, existen otras opciones como sendmail o exim, que son tan buenas como esta, pero vamos a utilizar postfix, comencemos instalandolo.

sudo apt-get install postfix

Y vamos a configurarlo para recibir nuestros correos, colocarlos en nuestro buzón (vamos a usar Maildir), igualmente vamos a configurarlo para que podamos autenticar contra él y que reciba de esta manera nuestros correos para enviarlos al mundo, para esto último vamos a optar por un relay-host, es decir un servidor que hará las verdaderas entregas, al cual le entregaremos toda la correspondencia que tenemos. Hacemos esto porque de este modo evitamos que nuestro correo sea considerado spam, por que el IP no estuviera limpio, o por que algo en la configuración no es correcta.

Vamos a utilizar Amazon SES para que entregue nuestros correos, el precio es totalmente acequible, solo 10 centavos de dólar por cada 1.000 correos.

El principal archivo de configuracion es main.cf, vamos a colocar este contenido dentro de él.

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
delay_warning_time = 4h
mydomain = dominio.com
myhostname = mail.dominio.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mail.dominio.com, localhost.example.com, localhost, dominio.com
relayhost = email-smtp.us-east-1.amazonaws.com
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:tu-login-ses:tu-password-ses
smtp_sasl_security_options = noanonymous
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
smtpd_sasl_local_domain =
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_tls_auth_only = no
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
home_mailbox = Maildir/

Eso es todo, vamos con el siguiente.

Dovecot

Dovecot, es la interfaz que vamos a utilizar para exponer nuestros buzones de correo al mundo mediante IMAP o POP3, en este caso vamos a configurar IMAP, pues hoy en día casi todos verificamos el correo de varios lugares a la vez.

También vamos a utilizar dovecot para darnos la autenticación requerida para que postfix nos permita enviar correos solo a los usuarios con cuenta en el servidor. La configuración de Dovecot en Ubuntu no es monolítica, es decir no esta en un solo archivo, por lo que veamos a ver solo los que se requieren cambiar, es decir que no tengan los valores por defecto.

Este es contenido de /etc/dovecot/dovecot.conf

!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = *, ::
!include conf.d/*.conf
!include_try local.conf

Este el de /etc/dovecot/conf.d/10-auth.conf

auth_mechanisms = plain login
!include auth-system.conf.ext

Este el de /etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:~/Maildir
namespace inbox {
  inbox = yes
}

Vamos con /etc/dovecot/conf.d/10-master.conf

service imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    #port = 993
    #ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    #port = 110
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
  }
}
service lmtp {
  unix_listener lmtp {
    #mode = 0666
  }
}
service imap {
}
service pop3 {
}
service auth {
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}
service auth-worker {
}
service dict {
  unix_listener dict {
  }
}

Y finalmente /etc/dovecot/conf.d/10-ssl.conf

ssl = yes
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem

Con esto tenemos Dovecot configurado y listo para entregarnos las correspondencia via IMAP, esto es más que suficiente para la PC de escritorio o para nuestra laptop, pero para la tablet y en especial para nuestro celular tenemos que tener una mejor opción. IMAP puede funcionar en el celular pero no es muy eficiente desde el punto de vista de consumo de batería, algo que siempre debemos cuidar con los celulares hoy en día, pero para ello existe ActiveSync.

Para implementar ActiveSync en Ubuntu vamos a utilizar el paquete z-push, que en Debian se llama d-push, debe tener alguna diferencia pero no lo investigue.

d-push

Para funcionar correctamente d-push requiere de Apache o algún otro servidor web, y de PHP, en general si instalas el paquete este instalará todo lo necesario, pero lo que hace es instalar mod-php de Apache y no es la manera más eficiente de interactuar con PHP, si solo usarás el servidor para tu correo y solo tendras pocos clientes, entonces adelante. Si por el contrario, tendras uno o más blogs de Wordpress o Drupal y además varios clientes usando ActiveSync, entonces lo que haremos es instalar Apache + PHP-FPM y luego asegurarnos que Ubuntu no instale mod-php luego de ello podemos instalar d-push

sudo apt-get install d-push

Asegurate de marcar la autoconfiguración de Apache cuando se te pregunte si deseas hacerlo, yo lo hice para Apache 1 ya que es automático. En general no tienes que hacer ningun cambio a la configuracion de d-push, solo debes crear un sitio al que apuntaras tus dispositivos móviles. E aquí un ejemplo:

<VirtualHost localhost:8080>
        ServerName mail.dominio.com
        DocumentRoot /var/www/mail.dominio.com
   DirectoryIndex index.php
   <Directory /var/www/mail.dominio.com/>
      AllowOverride All
      Require all granted
      #Order Deny,Allow
      #Allow from all
   </Directory>

<Directory /usr/lib/cgi-bin/>
        Require all granted
</Directory>

</VirtualHost>

Dado que tengo Nginx delante, es Nginx con el que manejo https requerido para d-push, en realidad no es requerido y se puede trabajar con el puerto 80 u 8080, pero es buena idea tener una conexión segura, asi que vamos con Nginx.

Lo primero es preparar Nginx para manejar una conexión encriptada, luego configuras el sitio como en el ejemplo de abajo.

server {
    listen 80;
    listen 443 ssl;

    root /var/www/mail.dominio.com/;
    index index.html index.htm;

    server_name mail.dominio.com;
        ssl_certificate /etc/nginx/ssl/nginx.crt;
        ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        proxy_pass http://localhost:8080;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Como puede verse, Nginx se encarga de la conexión segura, y luego pasa el requerimiento a Apache que opera tras bambalinas.

Con eso hemos terminado, ya tenemos un servidor de correos que envía correos de forma segura mediante Amazon SES, y que recibe el correo dirigido a nosotros y nos lo entrega de manera eficiente en nuestras aplicaciones de escritorio y móviles utilizadon conexiones seguras y encriptadas.

Procmail

En mi caso re-envío correo de otras cuentas a esta cuenta para tener todo el correo en un solo lugar, utilizo una cuenta para facebook, Twitter, LinkedIn y demás subscripciones que no es mi cuenta principal, por lo que todo el correo enviado a esa cuenta y luego re-enviado aquí lo filtro y archivo en un directorio específico, la forma en que lo hago es mediante procmail al momento de recibir el correo.

Vamos a ver como se puede configurar.

sudo apt-get install procmail

El primer archivo que vamos crear es /etc/procmailrc y tendrá este contenido.

DROPPRIVS=yes
ORGMAIL=${HOME}/Maildir/
DEFAULT=${ORGMAIL}
:0
* ? /usr/bin/test -d $DEFAULT || /bin/mkdir $DEFAULT
{ }
:0 E
{
        EXITCODE=127
        HOST=bail.out
}

Luego en directorio del usuario que va a clasificar su correo mediante procmail son necesarios otros archivos. Vamos crearlos. Asegurate de estar conectado al servidor usando el usuario del que quieres clasificar su correo. Creamos el archivo .forward y ponemos este contenido adentro:

"|IFS=' ' && exec /usr/bin/procmail || exit 75 g"

Luego creamos el archivo .procmailrc e insertamos este contenido:

VERBOSE=no
PMDIR=$HOME/Procmail 
LOGFILE=$PMDIR/log
INCLUDERC=$PMDIR/filtros.rc
SHELL=/bin/sh

Finalmente creamos el archivo ~/Procmail/filtros.rc y colocamos allí los filtros, veamos solo un ejemplo:

:0
* ^TO_cuenta-social@gmail.com
.social/

:0
$HOME/Maildir/

Puedes buscar más ejemplos en Google, o DuckDuckGo

Amazon SES

Finalmente, tenemos que configurar Amazon SES, eso lo vamos a dejar fuera del alcance de este sitio, pues esta suficientemente bien explicado en el sitio de Amazon. Puedes utilizar MailGuy o Mandrill o cualquier otro servicio, solo asegurate de cambiar estas lineas en /etc/postfix/main.cf

relayhost = email-smtp.us-east-1.amazonaws.com
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:tu-login-ses:tu-password-ses
smtp_sasl_security_options = noanonymous

Las mismas deben ser cambiadas de acuerdo al servicio que utilices.

Conclusión

Como puedes ver, es posible instalar y configurar un servidor de correos eficiente y que tenga lo requerido las comunicaciones de hoy en día. Quedó por ver como instalar Spamassassin, y actualizaré el artículo para hacerlo, de momento no lo instalé debido a que gracias a Dios no tengo mucho spam en la cuenta de correos que manejo con este servidor.

1. En mi caso incluso tengo Nginx como proxy delante de Apache, de este modo puedo correr blogs de Wordpress directo con Nginx y sitios estáticos con Nginx, o cachear el contenido que sirve Apache, si te preguntas para que tengo Apache, pues porque algún software es más sencillo de configurar con Apache y a veces quiero evitar la molestia.