Introducción

Hola a todos de nuevo,

El otro día estaba dándole vueltas al tarro por que queria automatizar el envio de ciertos mails a ciertas cuentas desde una máquina linux. Este articulo cubre como automatizar dicho envio mediante varios ficheros de shell script. Lo que no cubre este artículo es la instalación del software base necesario. Es obvio que si queremos mandar mails de este tipo sin ningún tipo de restricción, tendremos que montar en servidor de mail, sendmail por ejemplo.

A modo de información estos scripts los tengo corriendo en una raspberrypi cuyo sistema se corresponde a:

pi@raspberrypi01 ~ $ uname -a
Linux raspberrypi01 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l GNU/Linux

Objetivo

Bien paso a explicar el objetivo del script. La idea es enviar de forma automática un mail recordatorio a una direccion de correo de forma repetida, a modo de aviso o algo similar. No voy a dar detalles del uso que le estoy dando, pero seguro que, el mismo script, os puede dar a vosotros otras ideas, se puede emplear de múltiples formas.

El script recibe 6 parámetros, la dirección origen, el destino, el asunto del mensaje, la ruta del fichero de cuerpo, la ruta de una adjunto en el caso de querer y el número de veces que queremos mandar el mail.
Con respecto a la dirección origen, poco que explicar, es tan sencillo como que para el envio de ciertos mails no quiero que aparezca como remitente mi direccion, prefiero que aparezca pepito@grillo.com o la que me dé la gana. En este caso el script hace una pequeña variación para cada uno de los envíos que realiza. Esta operación intenta evitar que el destino pueda crear una simple regla de borrado, modificando levemente el origen en cada iteración.

Contenido fichero envioMail.sh:

#!/bin/bash

# Por Eloy Mier Perez
#
# Script para el envio de mensajes de mail usando el mail server local

#PARAMS
# from - direccion desde la que se escribe
# to - direccion destino
# asunto - asunto que quieres que lleve el mail
# cuerpo - fichero de cuerpo del mensaje
# attachment - fichero adjunto al mensaje
# numero de envios - nº de veces que queremos mandar el mensaje

if [ $# -eq 0 ]; then
  echo "envioMail <from> <to> <asunto> <cuerpo> <num_envios>"
  exit 1
fi

#Separo la direccion origen en from_user@from_domain.com
pos_arroba=`expr index $1 @`
from_user=`expr substr $1 1 $(($pos_arroba -1))`
from_domain=`expr substr $1 $(($pos_arroba + 1)) ${#1}`

to=$2
asunto=$3
cuerpo=$4
attachment=$5
num_envios=$6

for ((i=1; i&amp;lt;=$num_envios; i++)){
  # composición del from, fijaos que le meto la i del bucle
  from="$from_user$i""@""$from_domain"
  #Linea real de envio
  (cat $4 | sendemail -f "$from" -t "$to" -q -s localhost -u "$3" -a "$attachment") &amp;amp;
  sleep 10 # esta línea es opcional en mi caso es que la raspberrypi no puede atender tantas peticiones simultáneas asi que se las voy dando de alta poco a poco
}
exit

Para el uso que le estoy dando, este script es llamado mediante otro script que es el que compone la línea de llamada. Contenido del fichero envioGeneral.sh:

/home/pi/envioMail.sh wwwwwww@xxxxxxxxx.net yyyyyyyyyy@zzzzzzzzzzz.net "asunto ejemplo" /home/pi/cuerpo.txt "/home/pi/adjunto.pdf" 10

Para proceder al envio simplemente llamamos a envioGeneral.sh, y en el ejemplo lo que hara dicho script es:

  •  Enviara 10 mails
  • Usara como origen wwwwwww1@xxxxxxxxx.net a wwwwwww10@xxxxxxxxx.net
  • El destino de todos los mails es yyyyyyyyyy@zzzzzzzzzzzz.net
  • El asunto de todos los mails es «asunto ejemplo»
  • Incluirá como cuerpo del mensaje el contenido del fichero cuerpo.txt
  • Adjuntará a cada mensaje el fichero pdf indicado

Bueno, me costó un tiempo encontrar un sistema que me permitiese indicar el asunto y ademas que me permitiese incluir un adjunto.

El objeto de este script no lo voy a contar, simplemente voy a indicar que esta relacionado con el artículo [intlink id=»3081″ type=»post»]{{empty}}[/intlink]

Automatización

Para automatizar la ejecución del script nada mas sencillo como usar el cron, que para eso esta. En mi caso lo envio el domingo a las 3am, lunes a las 2am, martes a las 3 am, miercoles a la 1am, jueves a las 3am, viernes a las 4am y sabado a las 2:30am. El fichero de cron es el siguiente por lo tanto:


pi@raspberrypi01 ~ $ crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command

0 3 * * 0 /home/pi/envioGeneral.sh
0 2 * * 1 /home/pi/envioGeneral.sh
0 3 * * 2 /home/pi/envioGeneral.sh
0 1 * * 3 /home/pi/envioGeneral.sh
0 3 * * 4 /home/pi/envioGeneral.sh
0 4 * * 5 /home/pi/envioGeneral.sh
30 2 * * 6 /home/pi/envioGeneral.sh

Pues nada, ya lo dejo por hoy, espero que os guste y seguro que muchos de vosotros le encontrais utilidades muy variopintas.

Un saludo a todos.

You must be logged in to post a comment.