Introducción a los protocolos de correo electrónico.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2016 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

Preparativos.

A fin de poder realizar todas las pruebas correspondientes a cada protocolo, instale los paquetes telnet, dovecot y postfix o bien sendmail.

Ejecute lo siguiente si elige utilizar sendmail:

yum -y install mailx telnet dovecot sendmail

Ejecute lo siguiente si elige utilizar postfix:

yum -y install mailx telnet dovecot postfix

Omita el siguiente paso si utiliza CentOS 5 o Red Hat Enterprise Linux 5

Edite el archivo /etc/dovecot/conf.d/10-mail.conf si utiliza ALDOS 1.4, CentOS 6 o Red Hat™ Enterprise Linux 6 y versiones posteriores de éstos:

vim /etc/dovecot/conf.d/10-mail.conf

Alrededor de la línea 30 del archivo /etc/dovecot/conf.d/10-mail.conf, establezca mbox:~/mail:INBOX=/var/mail/%u como valor de la opción mail_location.

# See doc/wiki/Variables.txt for full list. Some examples:
#
#   mail_location = maildir:~/Maildir
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# <doc/wiki/MailLocation.txt>
#
mail_location = mbox:~/mail:INBOX=/var/mail/%u

Si se va a utilizar Sendmail como MTA predeterminado, es importante definir un grupo de acceso de correo en la configuración de Dovecot.

Alrededor de la línea 115 del archivo /etc/dovecot/conf.d/10-mail.conf, localice la opción mail_privileged_group, descomente ésta y defina como valor el grupo mail:

# Group to enable temporarily for privileged operations. Currently this is
# used only with INBOX when either its initial creation or dotlocking fails.
# Typically this is set to "mail" to give access to /var/mail.
mail_privileged_group = mail

Alrededor de la línea 122 del archivo /etc/dovecot/conf.d/10-mail.conf, localice la opción mail_access_groups, descomente ésta y defina también como valor el grupo mail:

# Grant access to these supplementary groups for mail processes. Typically
# these are used to set up access to shared mailboxes. Note that it may be
# dangerous to set these if users can create symlinks (e.g. if "mail" group is
# set here, ln -s /var/mail ~/mail/var could allow a user to delete others'
# mailboxes, or ln -s /secret/shared/box ~/mail/mybox would allow reading it).
mail_access_groups = mail

Se requiere que los usuarios locales pertenezcan al grupo mail para que lo anterior represente un problema de seguridad.

Nota.

Es importante señalar Postfix crea automáticamente los buzones de entrada con permiso 0600 (-rw-------) y por tanto impide utilizar buzones de entrada compartidos, mientras que Sendmail lo hace con permiso 0660 (-rw-rw----) y por tanto permite utilizar buzones de entrada compartidos. En ambos casos los permisos predeterminados de los buzones de entrada sólo se pueden cambiar modificando y compilando de nuevo el código fuente.

Si se utiliza Sendmail como MTA predeterminado, debido al permiso 0660 con el que son creados los buzones de entrada, a Dovecot le será imposible generar automáticamente las carpetas e índices IMAP, pues éste fallará al copiar el grupo al que pertenece el buzón de entrada cuando éste tiene permisos de lectura y escritura para grupo. Por lo tanto se obtendrían continuamente los siguientes errores en la bitácora /var/log/maillog:

Mar 21 22:31:45 mail dovecot: pop3(fulano): Error: mkdir(/home/fulano/mail/.imap/INBOX) failed: Operation not permitted
Mar 21 22:31:45 mail dovecot: pop3(fulano): Error: Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2013-03-21 22:31:45]
Mar 21 22:31:45 mail dovecot: pop3(fulano): Couldn't open INBOX top=0/0, retr=0/0, del=0/0, size=0

Es por ésto que, en el caso de utilizar Sendmail como MTA predeterminado, se requiere configurar que Dovecot tenga privilegios de acceso sobre el grupo mail. De otro modo el administrador del sistema estaría obligado a crear manualmente los directorios ~/mail/.imap/INBOX de todos los usuarios locales o cambiar manualmente los permisos de todos los buzones de entrada de 0660 a 0600 y repetir cualquiera de las dos operaciones cada vez que se genere un nuevo usuario.

Si se utiliza Postfix como MTA predeterminado, es innecesario definir valor alguno en las opciones mail_privileged_group y mail_access_groups pues los buzones de entrada se crean con permiso 0600 y por tanto carecen de permisos de lectura y escritura para grupo.

Guarde el archivo y salga del editor de texto.

Inicie y active el servicio dovecot ejecutando:

service dovecot start
chkconfig dovecot on

Establezca sendmail o postfix, como agente de transporte de correo (MTA, Mail Transport Agent) predeterminado del sistema, utilizando el mandato alternatives, del siguiente modo:

alternatives --config mta

Lo anterior devolverá una salida similar a la siguiente, donde deberá elegir entre postfix y sendmail como MTA predeterminado del sistema:


Hay 2 programas que proporcionan 'mta'.

  Selección    Comando
-----------------------------------------------
   1           /usr/sbin/sendmail.postfix
*+ 2           /usr/sbin/sendmail.sendmail

Presione Intro para mantener la selección actual[+] o escriba el número de la selección:  2

Si eligió utilizar sendmail en lugar de postfix, detenga este último —MTA predeterminado en CentOS 6 y Red Hat Enterprise Linux 6 y versiones posteriores de éstos— e inicie el servicio sendmail:

service postfix stop
chkconfig postfix off
service sendmail start
chkconfig sendmail on

Si eligió utilizar postfix en lugar de sendmail, detenga este último> —MTA predeterminado en CentOS 5 y Red Hat Enterprise Linux 5— e inicie el servicio postfix:

service sendmail stop
chkconfig sendmail off
service postfix start
chkconfig postfix on

En todo momento podrá conmutar de nuevo entre Sendmail o Postfix, como MTA predeterminado del sistema, utilizando este mismo procedimiento.

Protocolos utilizados.

SMTP (Simple Mail Transfer Protocol).

Es un protocolo estándar de Internet del Nivel de Aplicación utilizado para la transmisión de correo electrónico a través de una conexión TCP/IP. Es el único protocolo utilizado para la transmisión de correo electrónico a través de Internet. Está basado sobre texto simple y es relativamente sencillo. A lo largo de los años han sido muchas las personas que han editado o contribuido a las especificaciones de SMTP, entre las cuales están Jon Postel, Eric Allman, Dave Crocker, Ned Freed, Randall Gellens, John Klensin y Keith Moore.

Para determinar el servidor SMTP para un dominio dado, se utilizan los registros MX (Mail Exchanger) en la Zona de Autoridad correspondiente al ese mismo dominio contestado por un Servidor DNS. Después de establecerse una conexión entre el remitente (el cliente) y el destinatario (el servidor), se inicia una sesión SMTP, ejemplificada a continuación y dónde el escenario asume que existe una cuenta de usuario regular denominada «fulano» y dónde se utilizará el dominio predeterminado del anfitrión local.

Cliente:  $ telnet 127.0.0.1 25
Servidor:  Connected to 127.0.0.1.
Escape character is '^]'.
220 nombre.dominio ESMTP Sendmail 8.13.1/8.13.1; Sat, 18 Mar 2006 16:02:27 -0600
Cliente:  HELO localhost.localdomain
Servidor:  250 nombre.dominio Hello localhost.localdomain [127.0.0.1], pleased to meet you
Cliente:  MAIL FROM:<fulano@localhost.localdomain>
Servidor:  250 2.1.0 <fulano@localhost.localdomain>... Sender ok
Cliente:  RCPT TO:<fulano@localhost.localdomain>
Servidor:  250 2.1.5 <fulano@localhost.localdomain>... Recipient ok
Cliente:  DATA
Servidor:  354 Enter mail, end with "." on a line by itself
Cliente:  Subject: Mensaje de prueba
From: fulano@localhost.localdomain
To: fulano@localhost.localdomain

Hola. Éste es un mensaje de prueba.
Adios.
.

Servidor:  250 2.0.0 k2IM2RjA003987 Message accepted for delivery
Cliente:  QUIT
Servidor:  221 2.0.0 nombre.dominio closing connection
Servidor:  Connection closed by foreign host.

La descripción completa del protocolo original STMP está definida en el RFC 821, aunque el protocolo utilizado hoy en día, también conocido como ESMTP (Extended Simple Mail Transfer Protocol), está definido en el RFC 2821. SMTP trabaja sobre TCP en el puerto 25.

POP3 (Post Office Protocol version 3).

Es un protocolo estándar de Internet del Nivel de Aplicación que recupera el correo electrónico desde un servidor remoto a través de una conexión TCP/IP iniciada desde un cliente local. El diseño de POP3 y sus predecesores permite a los usuarios recuperar el correo electrónico mientras están conectados en una red y manipular los mensajes recuperados sin necesidad de permanecer conectados. A pesar de que muchos clientes de correo electrónico incluyen soporte para dejar el correo en el servidor, todos los clientes de POP3 recuperan todos los mensajes y los almacenan como mensajes nuevos en la computadora o anfitrión utilizado por el usuario, eliminan los mensajes en el servidor y terminan la conexión.

Después de establecerse una conexión entre el cliente y el servidor, se inicia una sesión POP3, ejemplificada a continuación.

Cliente:  $ telnet 127.0.0.1 110
Servidor:  Connected to 127.0.0.1.
Escape character is '^]'.
+OK dovecot ready.
Cliente:  USER fulano
Servidor:  +OK
Cliente:  PASS contraseña
Servidor:  +OK Logged in.
Cliente:  STAT
Servidor:  +OK 1 728
Cliente:  LIST
Servidor:  +OK 1 messages:
1 728
.
Cliente:  RETR 1
Servidor:  +OK 728 octets
Return-Path: <fulano@localhost.localdomain>
Received: from localhost.localdomain (localhost.localdomain [192.168.1.254])
         by localhost.localdomain (8.13.1/8.13.1) with SMTP id k2IM2RjA003987
         for <fulano@localhost.localdomain>; Sat, 18 Mar 2006 16:03:21 -0600
Date: Sat, 18 Mar 2006 16:02:27 -0600
Message-Id: <200603182203.k2IM2RjA003987@localhost.localdomain>
Subject: Mensaje de prueba
From: fulano@localhost.localdomain
To: fulano@localhost.localdomain
Status: O
Content-Length: 43
Lines: 2
X-UID: 202
X-Keywords:

Hola. Éste es un mensaje de prueba.
Adios.
.
Cliente:  QUIT
Servidor:  +OK Logging out.
Connection closed by foreign host.

POP3 está definido en el RFC 1939. POP3 trabaja sobre TCP en el puerto 110.

IMAP (Internet Message Access Protocol).

Es un protocolo estándar de Internet del Nivel de Aplicación utilizado para acceder hacia el correo electrónico almacenado en un servidor remoto a través de una conexión TCP/IP iniciada desde un cliente local.

La versión más reciente de IMAP es la 4 revisión 1 y está definida en el RFC 3501. IMAP trabaja sobre TCP en el puerto 143.

Fue diseñado por Mark Crispin en 1986 como una alternativa más moderna que resolviera las deficiencias del protocolo POP3. Las características más importantes de IMAP incluyen:

Después de establecerse una conexión entre el cliente y el servidor, se inicia una sesión IMAP, ejemplificada a continuación.

Cliente:  $ telnet 127.0.0.1 143
Servidor:  Connected to 127.0.0.1.
Escape character is '^]'.
* OK dovecot ready.
+OK dovecot ready.
Cliente:  x LOGIN fulano contraseña
Servidor:  x OK Logged in.
Cliente:  x SELECT inbox
Servidor:  * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 0 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1100569382] UIDs valid
* OK [UIDNEXT 203] Predicted next UID
x OK [READ-WRITE] Select completed.
Cliente:  x FETCH 1 (flags body[header.fields (subject)])
Servidor:  * 1 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS (SUBJECT)] {30}
Subject: Mensaje de prueba

)
x OK Fetch completed.
.
Cliente:  x FETCH 1 (body[text])
Servidor:  * 1 FETCH (BODY[TEXT] {45}
Hola. Éste es un mensaje de prueba.
Adios.
)
x OK Fetch completed.
Cliente:  x LOGOUT
Servidor:  * BYE Logging out
x OK Logout completed.
Connection closed by foreign host.

Referencias.

http://www.ietf.org/rfc/rfc2222.txt
http://www.ietf.org/rfc/rfc821.txt
http://www.ietf.org/rfc/rfc2821.txt
http://www.ietf.org/rfc/rfc1939.txt
http://www.ietf.org/rfc/rfc3501.txt