Es frecuente en el manejo de maquinas Linux usar muchos scripts en bash o c-shell para automatizar tareas de una forma sencilla, dado que al contrario de lo que muchas personas piensan, shell script (o c-shell) son bastantes potentes a la hora de manipular información .
Ante la cuestión de cómo enviar un correo electrónico desde linea de comandos o desde un script , incluso con archivos adjuntos desde una máquina Linux , lo primero que pensamos es usar la utilidad mailx la cual mejora en muchos aspectos a la utilidad mail de viejos sistemas
La sintaxis básica para enviar correos electrónicos desde una máquina Linux mediante el comando mailx se muestra a continuación:
mailx -vvv -s $asunto -r $from -S $smtp $destino
Como vemos , podemos observar varios parámetros en la línea anterior;
- -vvv = Verbosity.
- -s = especifica el asunto (subject).
- -r = especificar el origen del Email.
- -S = especifica el smtp server.
Y lo ideal es usar variables:
- $asunto: almacenamos el asunto ( subject ) del correo
- $from : almacenamos el usuario que envía el correo
- $smtp : almacenamos el servidor de correo
- $destino : almacenamos la dirección de correo destinatario ( pueden poner sucesivas separando con espacios estas)
El comando anterior se puede complementar añadiendo un cuerpo al contenido del correo gracias al comando echo redirigiendo con el pipe (|) hacia mailx
echo $cuerpo | mailx -vvv -s $asunto -r $from -S $smtp $destino
Dónde $cuerpo es una variable que almacena el cuerpo del email

Es importante destacar que podemos obviar el servidor stmp server si está configurado en la máquina así como el origen del correo obvio , quedando su uso habitual tal como sigue:
echo $cuerpo | mailx -s $asunto -S $destino1 $destino2 $destino3
Como se aprecia, se añade un cuerpo al contenido del correo gracias al comando echo redirigiendo con el pipe (|) hacia mailx y se usan varias variables:
- $cuerpo es una variable que almacena el cuerpo del email
- $asunto: almacenamos el asunto ( subject ) del correo
- $smtp : almacenamos el servidor de correo
- $destino1 : almacenamos la dirección de correo destinatario
- $destino2 : almacenamos la dirección de correo destinatario
- $destino3 : almacenamos la dirección de correo destinatario
Anexando adjuntos
Si la versión de mailx que esta usando está por encima de 12.x,e puede usar el nuevo interruptor adjunto (-a) en mailx para enviar archivos adjuntos con el correo , lo cual es una opción más simple que el comando uuencode.
Como ejemplo mandar un fichero a un destinatario, es muy sencillo usando el siguiente comando:
mailx -a $file -s $asunto $destino1
En l comando anterior se usan estas variables :
- $asunto: almacenamos el asunto ( subject ) del correo
- $destino1 : almacenamos la dirección de correo destinatario
- $file: ruta directa cal fichero a anexar
El comando anterior imprimirá una nueva línea en blanco en el cuerpo del mensaje aunque puede escribir el cuerpo del mensaje presionar [ctrl] + [d] para enviar, lo cual adjuntará el archivo al correo electrónico saliente correctamente con el Content-Type y encabezados apropiados.
Para hacer esto más «scriptable», puede enviar el mensaje sin un cuerpo con el siguiente comando:
mailx -a $file -s $asunto $destino1< /dev/null
Para enviar correos con un cuerpo de mensaje, reemplace / dev / null en el comando anterior con su archivo de cuerpo de mensaje.
mailx -a $file -s $asunto $destino1< $cuerpo
Donde $cuerpo es una variable que almacena el cuerpo del email
En esta versión de mailx, los encabezados que se usan en el correo electrónico saliente cambian de:
From:
Date:
To:
Subject:
A la forma siguiente:
From:
Date:
To:
Subject:
User-Agent:
MIME-Version:
Content-Type:
Content-Transfer-Encoding:
Si la versión de mailx está por debajo de 12.x, puede usarse el comando uuencode para enviar correos con archivos adjuntos.
El comando uuencode se utiliza para codificar un archivo binario.De forma predeterminada, uuencode tiene entrada desde la entrada estándar y escribe en la salida estándar como se muestra a continuación ( esa es la razón por la que se repite el nombre del fichero) utilizando por defecto el formato de codificación estándar de UU.
uuencode $fichero $fichero | mailx -s $asunto $destino
Usando el formato anterior ,como se aprecia, se añade un cuerpo al contenido del correo gracias al comando echo redirigiendo con el pipe (|) hacia mailx , de forma similar a añadir un cuerpo al correo , pero esta vez estamos anexamos un fichero previamente codificado con uuencode
Las variables usadas:
- $asunto: almacenamos el asunto ( subject ) del correo
- $destino : almacenamos la dirección de correo destinatario
- $fichero : almacenamos la ruta completa del fichero a adjuntar
- $fichero : almacenamos la misma ruta completa del fichero a adjuntar ( en efecto se repite y no es un error)
Por cierto, en caso de necesitar adjuntar varios ficheros, puede usar esta receta:
uuencode $fichero1 $fichero1 >/tmp/out.mail
uuencode $fichero2 $fichero2 >/tmp/out.mail
cat email-body.txt >>/tmp/out.mail
Y ahora ya si podemos enviar el correo:
mailx -s $asunto $destino </tmp/out.mail

Correos con anexos y cuerpo
La sintaxis para enviar correos electrónicos desde una máquina Linux mediante el comando mailx puede tener problemas a la hora de incluir además de anexo un cuerpo en el mensaje, por lo que podemos usar en su lugar el comando mutt usando la siguiente sintaxis:
echo $body | mutt -s $asunto -a $fichero $destino1 $destino2 $destino3
Como vemos , podemos observar varios parámetros en la línea anterior;
- -s = especifica el asunto (subject).
- -a = especifica el nombre del fichero con la ruta completa
Y como en los ejemplos anteriores , lo ideal es usar variables:
- $asunto: almacenamos el asunto ( subject ) del correo
- $destino1 : almacenamos la dirección de correo destinatario
- $destino2 : almacenamos la dirección de correo destinatario
- $destino3 : almacenamos la dirección de correo destinatario
- $body : almacenamos el cuerpo del correo
Debe estar conectado para enviar un comentario.