Configuración de servidor de correo electrónico

Instalación de servidor Postfix y Mysql

Requisitos previos:

Contar con un servidor LAMP previamente instalado y configurado, FQDN configurado y Mysql instalado y configurado.

Paso 1: Instalar los paquetes necesarios

user@server:$sudo apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

Paso 2: Crear la base de datos, tabla de dominios, usuarios y alias

mysqladmin -p create servermail
mysql -u root -p
mysql > GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword';
mysql > FLUSH PRIVILEGES;
mysql> USE servermail;

CREATE TABLE `virtual_domains` (
`id`  INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `servermail`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'example.com'),
('2', 'hostname.example.com');

INSERT INTO `servermail`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');

INSERT INTO `servermail`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'alias@example.com', 'email1@example.com');

mysql > exit

Paso 3: Configuración de Postfix main.cf

Hasta el momento se ha tomado como referencia la guía publicada en digital ocean https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassassin, pero esta guía esta pensada para una versión de ubuntu muy antigua y no funciona en las versiones modernas, es por ello que le hice adaptaciones y el siguiente codigo del archivo de configuración es fruto de revisar muchos post y de aplicar el criterio sumado a varias pruebas de ensayo error. El código siguiente ha sido probado en ubuntu 16.04 y funciona a la perfección.

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
nano /etc/postfix/main.cf

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
#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

#agregar estas dos lineas
smtpd_tls_security_level = may
smtp_tls_security_level = may

#smtpd_tls_cert_file=/etc/dovecot/dovecot.pem
#smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem

smtpd_tls_cert_file = /etc/letsencrypt/live/enappserver.com/cert.pem
smtpd_tls_key_file = /etc/letsencrypt/live/enappserver.com/privkey.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/enappserver.com/chain.pem

smtpd_use_tls=yes
#smtp_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes

#agregar otras 2 lineas
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unauth_destination

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

#smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mail.enappserver.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
message_size_limit = 0
virtual_mailbox_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
strict_mailbox_ownership = no

virtual_transport = lmtp:unix:private/dovecot-lmtp

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

#OpenDKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
#smtpd_milters = inet:8891@localhost
non_smtpd_milters = inet:localhost:8891

#controlar el reintento de correos no enviados
maximal_queue_lifetime = 3h
queue_run_delay = 300s
minimal_backoff_time = 300s
maximal_backoff_time = 4000s

Lo siguiente es crear y configurar los archivos necesarios para conectar postfix con la base de datos mysql y las tablas ya creadas

nano /etc/postfix/mysql-virtual-mailbox-domains.cf
		
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

nano /etc/postfix/mysql-virtual-mailbox-maps.cf 
		
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

nano /etc/postfix/mysql-virtual-alias-maps.cf
		
user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Finalmente reiniciamos el servicio de postfix y probamos la configuracion de los tres archivos. Deberíamos obtener un 1 en cada caso.

service postfix restart

postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Copiamos el archivo de configuracion master.cf
   cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
Editamos el  archivo master.cf
   nano /etc/postfix/master.cf

El código debería quedar así:

smtp      inet  n       -       -       -       -       smtpd
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_tls_security_level=encrypt
  -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticate,reject
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=
  -o smtpd_data_restrictions=
  -o smtpd_end_of_data_restrictions=

pickup    unix  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
${user}
${user}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} $$
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}

Configurar un dominio personalizado en gmail y gestionarlo desde cliente outlook

Para quienes contamos con dominios empresariales y no queremos utilizar los aburridos y poco amigables webmail clásicos, tales como horde, rouncube y squirrelmail, utilizamos las plataformas de Hotmail o Gmail y lo gestionamos desde un cliente de correos como outlook.

Sin embargo, Hotmail ha puesto muchas limitaciones para evitar que los correos que no pertenecen a office 365 puedan gestionarse desde outlook usando hotmail como servidor, e incluso hay demoras si se utiliza otro gestor de correos como mozilla thunderbird. Para este caso en particular la única forma viable que he encontrado de usar hotmail como servidor es gestionándolo directamente desde su plataforma web o a través de una aplicación móvil.

Por el contrario, en el caso de Gmail sí es posible realizar esta configuración, pero es algo compleja y la documentación al respecto es rebuscada y con algunos vacíos en la integración de todos los procedimientos necesarios.

Esta publicación pretende ser una pequeña pero poderosa guía que integre todos los pasos necesarios para tener éxito en este acometido, sin explayarse en los detalles pero incluyendo las referencias necesarias para lograrlo. Sigue leyendo

Instalar un certificado de seguridad SSL gratis y confiable con Let’s Encrypt

El uso de certificados de seguridad confiables en una necesidad imprescindible para quienes se encuentran involucrados en la administración de servidores. Desde dicha gestión se asegura la protección de los datos del usuario al hacer uso de sitios web alojados en nuestros servidores.

Esto repercute en el SEO, en la correcta gestión de correos institucionales y en la seguridad de las transacciones, entre otros. Tal es su importancia que un certificado de seguridad comercial cuesta un promedio de $ 200 USD anuales por dominio.

Anteriormente contábamos con los certificados gratuitos de la empresa StartCom, pero debido a fallas de seguridad y confiabilidad, entre otros, su autoridad ha sido revocada, complicando mucho a quienes no pueden darse el lujo de pagar esta exorbitante suma de dinero por cada usuario que tengan (suponiendo que cada usuario cuente con un solo dominio).

Afortunadamente, tenemos otra opción gratuita, mucho mas confiable, segura y respaldada por los grandes grupos informáticos: Mozilla, Cisco, Chrome, Facebook, SiteGround, IdentyTrust, Composer, entre otros.

Se trata de Let’s Encrypt. Let’s Encrypt,una autoridad certificadora (CA) libre, automatizada y abierta, que se ejecuta para beneficio del público. Es un servicio proporcionado por Internet Security Research Group (ISRG). Sigue leyendo

Implementación de un sistema web para la gestión de correos empresariales

Implementar un sistema web para la gestión de correos empresariales responde a una necesidad vigente: Como proveedores de servicios de correos empresariales o como usuarios del mismo necesitamos un sistema rápido, confiable y estable de servir y utilizar los correos corporativos, sin descuidar los aspectos de calidad y óptima experiencia de usuario. Pero este es un proyecto de gran magnitud que involucra varios importantes aspectos para su correcta realización. Sigue leyendo