Enviar correos usando un Bash Script

El envío de correo electrónico a través de la línea de comandos puede ser una gran característica, especialmente en Linux, lo que permitirá a algunos usuarios evitar el uso de la GUI y la instalación de todas las dependencias. Veremos el siguiente artículo sobre cómo escribir un script BASH (shell) que pueda enviar un correo electrónico personalizado a cualquier otro correo electrónico utilizando el servidor SMTP.

Creación de la aplicación de Google

El correo electrónico del remitente debe ser una cuenta de Gmail. La 2FA debe estar habilitada en esta cuenta. Tendrá que crear una aplicación en su ID de Gmail que manejará el envío de correos electrónicos, los permisos y el resto de las cosas por usted. Es bastante simple hacerlo, visite la página de Contraseña de la aplicación de Google. 

  1. Inicie sesión con sus credenciales desde el enlace anterior
  2. Cree una   categoría de aplicación-> Otro, asígnele cualquier nombre (llámelo como quiera, por ejemplo, mailterminal, bashmail)
  3. Ahora copie la contraseña y guárdela de forma segura en algún lugar .

Contraseñas de la aplicación de Google.

Ingresando el tipo de aplicación

Introducir el nombre del complemento

Copie el código generado desde la aplicación y guárdelo en un lugar seguro, necesitaremos esta contraseña más adelante,

Copiando la contraseña de la aplicación.

Después de crear la aplicación de Google, finalmente podemos pasar a la parte de creación de secuencias de comandos. Usaremos cURL para obtener el servidor y publicar el contenido del correo electrónico en la ruta particular proporcionada por el servidor SMTP.

Entrada del usuario

Primero ingresaremos los requisitos de la entrada, estos serán el correo electrónico del remitente, el correo electrónico del receptor, la contraseña de la aplicación de Google, el asunto, el cuerpo y los archivos adjuntos, si corresponde. Por lo tanto, es bastante simple ingresar información en BASH. Usaremos el comando de lectura junto con -p como argumento para solicitar al usuario un mensaje de información para una mejor comprensión.

#!usr/bin/env bash

# Input for sender email 
read -p "Enter your email : " sender

# Input for recipient email
read -p "Enter recipient email : " receiver

# Input for google app password
read -p "Enter your Google App password : " gapp

# Input for subject of the mail
read -p "Enter the subject of mail : " sub

Tomando la entrada del texto del cuerpo en un archivo

Por lo tanto, el correo electrónico del remitente, el correo electrónico del destinatario, la contraseña de la aplicación de Google y el asunto se tienen en cuenta, pero cómo ingresaremos el cuerpo y el archivo adjunto. Bueno, para eso usaremos el comando cat para ingresar primero en un archivo y copiar todo el contenido de ese archivo en una variable como esta:

# Using cat command to input multiline text to a variable (from file)

echo "Enter the body of mail : "
cat > tempfile.txt
body=$(cat tempfile.txt)

El comando cat usado con > puede redirigir las entradas al archivo provisto después del operador. Debe presionar CTRL + D para guardar el contenido de varias líneas que ha escrito y salir del comando cat . Finalmente, almacenamos la salida del comando cat en una variable. Hemos usado el comando cat en ambos sentidos para escribir en el archivo y también para leerlo. Por lo tanto, tenemos la variable body para trabajar con ella más adelante. 

Agregar un archivo adjunto

Ahora viene la parte del archivo adjunto, debemos proporcionar el argumento posicional como el nombre del archivo para especificar el archivo adjunto. 

# set file variable to the 1st positional parameter
file="$1"

# MIME type for multiple type of input file extensions
MIMEType=`file --mime-type "$file" | sed 's/.*: //'`

Esto almacenará el nombre del archivo y, a continuación, también necesitaremos el tipo de archivo. estamos extrayendo la extensión del archivo o su tipo usando los campos mime en el archivo. Estamos canalizando el nombre del archivo con el editor de conjuntos y filtrando el texto después de ‘:’ en la salida del comando de archivo. La demostración del código se muestra a continuación:

agregar archivos adjuntos

Entonces, el nombre del archivo se almacena en la variable de archivo y el tipo de archivo se almacena en la variable MIMEType. Después de esto, pasamos al comando cURL.

comando RIZAR

El comando CURL es uno de los comandos más útiles y populares en lo que respecta a su funcionalidad. Usaremos el comando para buscar el servidor SMTP, es decir , smtps://smtp.gmail.com:465. Básicamente, estamos abriendo una conexión con el servidor de Gmail en un puerto en particular y luego pasaremos algunos argumentos y variables para crear el cuerpo del correo electrónico.

Requisito de SSL para el servidor SMTP

Estamos pasando la URL como el servidor SMTP que es smtps://smtp.gmail.com:465 y enviaremos el correo electrónico utilizando la conexión SSL, ya que es seguro enviar correo a través del servidor de Google. Para eso, pasaremos –ssl-reqd que permitirá usar el correo electrónico de la cuenta de Google. 

Adición de información de remitente, destinatario y usuario de correo

 Comenzaremos el cuerpo del correo agregando el correo del campo que será el remitente en nuestro caso, por lo que usaremos –mail-fromcomo el valor de la variable remitente, es decir, $remitente . Usamos \ en un script de shell para ignorar todo lo que sigue en esa línea y pasar a la siguiente línea solo para una mejor visibilidad y legibilidad. Después de resolver el argumento del remitente del correo, tenemos el argumento del destinatario del correo que toma la dirección de correo del destinatario. Usaremos –mail-rcpt al que se le asignará el valor de la variable receptor como $receptor

# cURL command to send requests to SMTP server with arguments of given credentials
 
curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
    --mail-from $sender \
    --mail-rcpt $receiver\
    --user $sender:$gapp \

El siguiente bit de información es el correo electrónico del usuario y la contraseña de la aplicación que generamos antes. Tenemos que pasar el argumento como –usuario que toma dos valores separados por: como el correo electrónico y la contraseña, simplemente pasaremos el correo electrónico del usuario, es decir, las variables sender y gapp.  

El cuerpo principal de Mail

A partir de entonces, pasamos el argumento -T para cargar un archivo, pero aquí no estamos cargando ningún archivo para el contenido del correo, simplemente lo agregaremos manualmente y luego el usuario escribirá el archivo formateado para simplificar las cosas para el usuario. 

Dentro del argumento del archivo, estamos escribiendo la información del encabezado como el remitente, el campo Para, el asunto y, finalmente, el contenido del correo, es decir, el cuerpo. 

# Creating the structure of mail using previously defined variables

-T <(echo -e "From: ${sender}
To: ${receiver}
Subject:${sub}

${body}")

Archivo adjunto

También debemos pasar el archivo adjunto, debemos manejar esto de forma independiente ahora, pero si el usuario no ha especificado ningún archivo, debemos tener cuidado de no estropear el comando curl. Podemos cambiar un poco el comando cURL para el archivo adjunto, las secciones del encabezado siguen siendo las mismas, es decir, hasta la entrada de la contraseña del usuario. Necesitamos usar el atributo -F para tener un formulario para el adjunto así como para el cuerpo . Inicializaremos el formulario con la opción multipart que nos permitirá incrustar tanto el cuerpo como el archivo de forma sencilla. Luego especificaremos lo que va en el formulario, primero incluiremos el cuerpo como texto sin formato y luego agregaremos el archivo adjunto en la opción de archivo provista y tambiéncodificarlo según el tipo de archivo que se inicializó en MIMEType como una variable . Esto finaliza la parte del formulario, ahora podemos agregar los metadatos como Para, formulario y asunto al correo.

Para los metadatos, simplemente usaremos -H como encabezado para ingresar los campos Para, De y Asunto de las variables. Por lo tanto, hemos agregado un archivo adjunto al correo, la esencia del archivo adjunto del correo se verá así:

# cURL command for attachment file with extra parameters

curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
    --mail-from $sender \
    --mail-rcpt $receiver\
    --user $sender:$gapp \
     -H "Subject: $sub" -H "From: $sender" -H "To: $receiver" -F \
    '=(;type=multipart/mixed' -F "=$body;type=text/plain" -F \
      "file=@$file;type=$MIMEType;encoder=base64" -F '=)'

Haciendo el guión lógico

Ahora, para evitar romper la secuencia de comandos cuando no se pasa ningún archivo adjunto, debemos verificar el parámetro posicional si el valor no está asignado, simplemente no agregaremos el formulario y, si existe, agregaremos el formulario y cambiaremos el flujo en consecuencia.

Para verificar si los parámetros posicionales están asignados o no, podemos usar la condición -z en la declaración if. esto verificará cualquier valor NULL o vacío, si el valor está vacío, tendremos un comando cURL simple; de ​​lo contrario, incluiremos un formulario en el comando cURL. 

El guión completo se muestra a continuación:

Guion

#!usr/bin/env bash

# User input
read -p "Enter your email : " sender
read -p "Enter recipient email : " receiver
read -p "Enter your Google App password : " gapp

read -p "Enter the subject of mail : " sub

echo "Enter the body of mail : "
cat > tempfile.txt                # using cat command for multiline input
body=$(cat tempfile.txt)          # storing the content of file in a variable

rm tempfile.txt


# check for provided attachment file as a positional parameter
# -z indicating an empty positional parameter
# attachment doesn't exist condition

if [ -z "$1" ]; then 


# curl command for accessing the smtp server

    curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
    --mail-from $sender \
    --mail-rcpt $receiver\
    --user $sender:$gapp \
     -T <(echo -e "From: ${sender}
To: ${receiver}
Subject:${sub}

 ${body}")


# attachment exists condition
else

    file="$1"           # set file as the 1st positional parameter
    
    # MIME type for multiple type of input file extensions
    
    MIMEType=`file --mime-type "$file" | sed 's/.*: //'`
    curl -s --url 'smtps://smtp.gmail.com:465' --ssl-reqd \
    --mail-from $sender \
    --mail-rcpt $receiver\
    --user $sender:$gapp \
     -H "Subject: $sub" -H "From: $sender" -H "To: $receiver" -F \
    '=(;type=multipart/mixed' -F "=$body;type=text/plain" -F \
      "file=@$file;type=$MIMEType;encoder=base64" -F '=)'
     
fi

Correo enviado desde la terminal usando el script

El correo apareció en la bandeja de entrada con un archivo adjunto

Puede adjuntar solo un archivo y el correo solo se puede enviar a un destinatario en este script. También puede ampliar la funcionalidad agregando varios destinatarios. Pudimos enviar correos electrónicos desde la terminal en una cuenta de Gmail utilizando herramientas como cURL, sed, el lenguaje de programación BASH y el servidor SMTP. 

Publicación traducida automáticamente

Artículo escrito por meetgor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *