Como enviar correos con adjuntos desde Linux desde linea de comandos

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

person using macbook pro on brown wooden desk
Photo by rawpixel.com on Pexels.com

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

high angle view of paper against white background
Photo by Pixabay on Pexels.com

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

🤞 No se pierda nuestro boletín mensual !es gratis!

¡No hacemos spam! Más información en nuestra política de privacidad

Deja una respuesta