#!/usr/bin/perl # # Archivo: birth.pl # # Descripcion: Dado el nombre de un archivo este script lee de alli la lista # de cumpleañeros, y si hay alguien que cumpla años el dia # anterior o el mismo dia en el que se corra el script, manda # un recordatorio a todos los miembros de la lista, exceptuando # al cumpleañero. # # Formato: El archivo contiene una linea por cada cumpleañero, y cada linea # tiene el siguiente formato: # # Nombre:Email:Dia:Mes:Ano # # Cada campo esta separado por el caracter dos puntos (:). En el # nombre se admiten espacios. El email debe ser un email valido o # no enviara correo a esa persona. El mes comienza desde uno # (es decir, 1 es enero, 2 es febrero, y asi hasta el mes 12). # El dia comienza desde uno. # Al año se le debe sustraer 1900 (estamos protegidos contra el Y2K!!) # # Por ejemplo, el cumpleaños de Pedro Perez iria en una linea asi: # # Pedro Perez:ppedro@ldc.usb.ve:12:01:83 # # Programado por: Ciro Durán # Fecha: 2005-02-02, 9.13am, en un momento de ocio # Revision: 1 (Incremente este número si hace alguna actualizacion al script) # #Las siguientes variables contienen los mensajes de correo que se van a #mandar. Todas las palabras en mayusculas que comienzan por underscore (_) #estan reservadas, porque son sustituidas por informacion real. $sendmail="/usr/sbin/sendmail"; $from="cumpleanos\@ldc.usb.ve"; %errorMsg = (); $errorMsg{'filenotfound'} = "La lista no se pudo abrir: "; $errorMsg{'invalidemail'} = "El correo electronico de esta persona es invalido: "; $errorMsg{'helpmessage'} = "birth.pl\nEscrito por: Ciro Durán \nUso: birth.pl nombre_lista\n"; $firstReminderSubject = "[Cumpleaños] MAÑANA CUMPLEAÑOS DE _PERSONA"; $firstReminderText = "Mañana cumplirá _PERSONA. Tendrá _ANOS años."; $secondReminderSubject = "[Cumpleaños] HOY CUMPLEAÑOS DE _PERSONA"; $secondReminderText = "Hoy cumple _PERSONA. Tiene _ANOS años."; #A partir de aqui no es necesario cambiar nada, a menos que sea necesario. #Subrutinas interesantes sub verificarDiferenciaDia { $persona = shift; $fecha = shift; $diferencia = shift; #Mejorar la funcion de dia siguiente return ($persona->{'mes'} == $fecha->{'mes'} && $persona->{'dia'} == $fecha->{'dia'}+$diferencia); } sub enviarCorreo { ($to, $subject, $content) = @_; open (MAIL,"| $sendmail -i -t" ); print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; print MAIL $content; close (MAIL); } #Programa principal comienza aqui use Date; #Leyendo parametros if (!($archivo = shift)) { print $errorMsg{'helpmessage'}; exit -1; } #Disculpe, me dice que dia es hoy? $hoy = {}; ($dummy, $dummy, $dummy, $hoy->{'dia'}, $hoy->{'mes'}, $hoy->{'ano'}) = localtime(time); undef $dummy; #Construyendo lista de cumpleañeros open(LISTA, "< $archivo") or die "$errorMsg{'filenotfound'} $!"; @lista = (); while ($linea = ) { $persona = {}; ($persona->{'nombre'}, $persona->{'email'}, $persona->{'dia'}, $persona->{'mes'}, $persona->{'ano'}) = split(":", $linea); ($persona->{'mes'})--; push @lista, $persona; } #uuuh, recordando programacion funcional :-) #Chequeando a ver quienes son cumpleañeros hoy o mañana @cumpleManana = grep {verificarDiferenciaDia($_, $hoy, 1)} @lista; @cumpleHoy = grep {verificarDiferenciaDia($_, $hoy, 0)} @lista; #Enviando recordatorios de los que cumplen el dia siguiente foreach $cumpleanero (@cumpleManana) { $to = ""; $diferencia = $fecha->{'ano'} - $cumpleanero->{'ano'}; @receptores = grep { $_->{'nombre'} ne $cumpleanero->{'nombre'} } @lista; map {$to .= $_->{'email'}.", "} @receptores; chop $to; chop $to; $_ = $firstReminderSubject; s/_PERSONA/$cumpleanero->{'nombre'}/g; s/_ANOS/$diferencia/g; $subject = $_; $_ = $firstReminderText; s/_PERSONA/$cumpleanero->{'nombre'}/g; s/_ANOS/$diferencia/g; $text = $_; enviarCorreo($to, $subject, $text); } #Enviando recordatorios de los que cumplen este dia foreach $cumpleanero (@cumpleHoy) { $to = ""; $diferencia = $fecha->{'ano'} - $cumpleanero->{'ano'}; @receptores = grep { $_->{'nombre'} ne $cumpleanero->{'nombre'} } @lista; map {$to .= $_->{'email'}.", "} @receptores; chop $to; chop $to; $_ = $secondReminderSubject; s/_PERSONA/$cumpleanero->{'nombre'}/g; s/_ANOS/$diferencia/g; $subject = $_; $_ = $secondReminderText; s/_PERSONA/$cumpleanero->{'nombre'}/g; s/_ANOS/$diferencia/g; $text = $_; enviarCorreo($to, $subject, $text); }