# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Añadir la cabecera Content-type al usar el comando mail o mailx


En algunas versiones del comando mail|mailx|Mail (creo que en las antiguas) se podía especificar una cabecera con el parámetro -a:

$ mail --help
usage: mail [-dEIinv] [-a header] [-b bcc-addr] [-c cc-addr] [-s subject] to-addr ...

De este modo era sencillo especificar cualquier cabecera y modificarla, como por ejemplo el Content-type si quisieramos enviar un correo en formato HTML (text/html). En cambio en nuevas versiones este parámetro ha desaparecido, y si queremos añadir el Content-type, por ejemplo, hay que engañar al MTA del siguiente modo:

$ cat mensaje.html | mail -s "$(echo -e "Este es el asunto\nContent-Type: text/html")" foo@bar.com

Como véis, a la hora de especificar el subject del mail con el parámetro -s, hacemos la trampa de crear un salto de línea y especificar después el Content-type, al igual que podemos ver en las cabeceras de un email estándar. De este modo, el MTA no asocia la segunda línea con el Subject sino como si fuera una cabecera normal de Content Type.

Configurar IP de salida en Postfix


Por defecto, una instalación de Postfix tiene configurado en blanco la variable que indica la IP a utilizar para la salida de correo del servidor (smtp_bind_address). Podemos ver su configuración en el fichero main.cf:

Main.cf por defecto:

smtp_bind_address =

Esto hará que Postfix sea quien elija la IP de salida. En mi caso concreto, tenía una interfaz con salida a Internet y además otra interfaz virtual (eth0 192.168.0.13 y eth0:1 192.168.0.14). En este caso Postfix usaba eth0 para la salida de correos.

Si queremos elegir nosotros la interfaz eth0:1 (192.168.0.14) para el outbound SMTP, simplemente le decimos cual debe usar:

smtp_bind_address = 192.168.0.14

Reiniciamos Postfix y todo correo que salga desde nuestro servidor lo hará por esta IP (192.168.0.14).

Verificar funcionamiento correo SMTP vía TELNET


Algo extremadamente útil y que supongo la mayoría conoceréis (esto va para los que no lo conozcan…) es poder chequear de forma rápida y sencilla si un servidor de correo SMTP está funcionando de forma correcta o no.
Normalmente un usuario corriente configuraría la cuenta de correo en su cliente, como por ejemplo Outlook o Thunderbird, una pérdida de tiempo que podemos evitar si utilizamos TELNET para hacer un test de conexión o envío de correo contra ese SMTP.
A continuación podéis ver el modo de establecer esta conexión y los pasos para enviar el correo:

En primera instancia conectamos vía TELNET al servidor SMTP por el puerto 25:

# telnet xx.xx.xx.xx 25
Trying xx.xx.xx.xx...
Connected to xxx.xxxxxxx (xx.xx.xx.xx).
Escape character is '^]'.
220 xxxxx.xxxxxxx.com ESMTP Sendmail 8.13.8/8.13.8; Thu, 1 Oct 2009 23:12:13 +0200

Como podéis apreciar, el primer paso lo hemos pasado con éxito, hemos podido acceder al servidor SMTP. Ahora vamos a decir al servidor SMTP quienes somos, hay que identificarse (normalmente nos identificamos con el nombre de nuestro PC, por ejemplo):

helo alex.portatil

Y el servidor nos responde correctamente:

250 xxxx.xxxxxxxxx.com Hello xxxx.xxxxxxx [xx.xx.xx.xx], pleased to meet you

Ya estamos en disposición de enviar el correo, primero decimos desde que cuenta vamos a enviarlo:

mail from: <micuenta@midominio.com>

Si recibimos una respuesta 250 OK todo va bien:

250 2.1.0 <micuenta@midominio.com>....Sender OK

Ahora toca poner la cuenta a la que vamos a enviar:

 rcpt to: <destino@sudominio.com>

Y si la respuesta sigue siendo 250, todo correcto:

  250 2.1.5 destino@sudominio.com

Lo siguiente será el cuerpo del mensaje (data), escribimos data y presionamos enter:

data

Escribiremos el cuerpo del correo, para acabar Enter + . + Enter (.)
Tened en cuenta que dentro del “data” podemos especificar el asunto del correo, el nombre del remitente, etc:

subject: Asunto del correo
to: destino@sudominio.com
esto es una prueba

Ya podemos salir del Telnet y el correo se enviará al destino indicado:

quit

La secuencia completa:

# telnet xx.xx.xx.xx 25
Trying xx.xx.xx.xx...
Connected to xxx.xxxxxxx (xx.xx.xx.xx).
Escape character is '^]'.
220 xxxxx.xxxxxxx.com ESMTP Sendmail 8.13.8/8.13.8; Thu, 1 Oct 2009 23:12:13 +0200
helo alex.portatil
250 xxxx.xxxxxxxxx.com Hello xxxx.xxxxxxx [xx.xx.xx.xx], pleased to meet you
mail from: <micuenta@midominio.com>
250 2.1.0 <micuenta@midominio.com>....Sender OK
rcpt to: <destino@sudominio.com>
250 2.1.5 destino@sudominio.com
data
Esto es un mail de prueba

.
quit

Nota: Si necesitáis probar una cuenta con autenticación, tendréis que usar el método SMTP AUTH, lo explicaré otro día en profundidad, aunque si buscáis en google encontraréis rápido cómo hacerlo (SMTP AUTH, SMTP Authentication Telnet).

Deshabilitar VRFY en Postfix


Una petición VRFY consulta al un determinado servidor de correo si una dirección de correo existe o no. Básicamente cuando conectamos vía telnet al puerto de un servidor de correo podemos lanzarle una petición y ver si en dicho servidor existe una cuenta de correo.

Si queremos, por seguridad deshabilitar esta opción en postfix, añadiremos la siguiente línea al fichero de configuración, normalmente /etc/postfix/main.cf

disable_vrfy_command = yes

De este modo evitamos que por telnet, cualquiera con el comando VRFY pueda verificar si una dirección de correo/usuario existe.

Ejemplo:

# telnet test.com 25
Trying 65.233.23.33...
Connected to test.com (65.233.23.33).
Escape character is '^]'.
220 test2.com ESMTP SMTP Ready; Sun, 19 Ene 2009 14:32:19 GMT
vrfy alex@test.com
252 2.5.2 Cannot VRFY user; try RCPT to attempt delivery (or try finger)
expn root
502 5.7.0 Sorry, we do not allow this operation
quit
221 2.0.0 test2.com closing connection
Connection closed by foreign host.

Gracias Jacob y David ;)