sending an email to a email address after a perl operation
ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
sending an email to a email address after a perl operation
Hi,
i have a script named renamer.pl that takes images from a directory and renames images and stores image meta information in a mysql. i also have a script that sends an email notification when excecuted to a desired email address.
is there away that i could combine the 2 scripts together, so when the meta information are inserted into MySQL, an email is sent to me.
#The above instructs renamer to look for files called image.jpg in
/home/httpd/htdocs.
#It checks once per minute for such a file to appear. If it sees a
#readable file called /home/httpd/htdocs.jpg it moves it
to/home/httpd/htdocs/image.200302251530.jpg
#where the number is a
#time stamp with year (four digits), month, day of the month, hour (in24
mode), and minute.
#Read the bugs section closely.
=head1 BUGS
#The original and new directories must be on the same file system.The
#program probably does not work on windows systems.
#The daemon behavior is weak.Not much testing has been done, so the script
may have other problems.
my $check_file = shift or die $usage;
my $original_dir = shift or die $usage;
my $new_dir = shift or die $usage;
my $suffix = shift or die $usage;
my $lockfile = shift or die $usage;
##################################
# If you put it into the cron, comment out between the START and END BLOCK,
# and uncomment the section below it so you don't get multiple
# copies running. Also, comment out the
# lockfile bits above.
#START BLOCK
exit if (fork());
while (-e "$lockfile") {
process($check_file) if (-r "$original_dir/$check_file.$suffix");
sleep 30;
}
#END BLOCK
##################################
#
# process($check_file) if (-r "$original_dir/$check_file.$suffix");
#
##################################
sub process {
my $file = shift;
my @st = (stat("$original_dir/$file.$suffix"));
my ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear,
$IsDST) = localtime($st[10]);
$Year += 1900;
$Month++;
my $stamp = sprintf "%4d_%02d_%02d_%02d_%02d_%02d", $Year, $Month, $Day,
$Hour, $Minute, $Second;
print "renaming $original_dir/$file.$suffix to
$new_dir/$stamp.$suffix\n";
rename "$original_dir/$file.$suffix", "$new_dir/$stamp.$suffix" or warn
"couldn't rename file: $! $file to $new_dir/$file.$stamp.$suffix\n";
print "adding $new_dir/$stamp.$suffix to database\n";
my $single_string = $new_dir . '/' . $stamp . '.' . $suffix;
infoinsert ($single_string);
}
############################################################################
#
# Connect to Database Named cctvimages on the localhost with the root user
# $dbh=DBI->connect(DBI:mysql;$database", $user, $password);
# and insert info about the file given as the argument $_[0];
############################################################################
#
sub infoinsert
{
my ($file) = @_;
die"Failed to get the info\n\$file is: $file" if not defined $file;
my $dbh = DBI->connect("DBI:mysql:dbname=cctvimages;host=localhost","root",
"********", {'RaiseError' => 1});
my $size;
my $mtime;
my $secs;
($size, $secs) = (stat ($file))[7,9];
$mtime = &ParseDateString("epoch $secs");
# even after conversion ':' is used to seperate hh and mn and ss
$mtime =~ s/://g;
# the above swaps out the ':' for nothing
$file =~ s/\/home\/me\/images\///;
# the above strips path
print"size is $size\nmodified is $mtime\nfilename is $file\n";
my $rows_affected = $dbh->do("INSERT INTO imageinfo VALUES(null, '$file',
'$size', '$mtime')")
or die "Do Fails: $DBI::errstr\n";
my $sql = "SELECT * FROM imageinfo";
my $sth = $dbh->prepare($sql);
$sth->execute or die"Execute fails: $DBI::errstr\n";
$sth->finish;
I usually use sendmail but I think this should work - It is just your 2 scripts merged so if they worked properly seperate they should now
Code:
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Date::Manip;
use Net::SMTP;
# Set this variable to your smtp server name
my $ServerName = "smtp.dundee.ac.uk";
=head1 NAME # renamer - renames files received by ftp, moving them to a new
directory
=head1 SYNOPSIS
nohup ./renamer image /home/httpd/htdocs /home/me/images jpg renamer.process
&
=head1 DESCRIPTION
#The above instructs renamer to look for files called image.jpg in
/home/httpd/htdocs.
#It checks once per minute for such a file to appear. If it sees a
#readable file called /home/httpd/htdocs.jpg it moves it
to/home/httpd/htdocs/image.200302251530.jpg
#where the number is a
#time stamp with year (four digits), month, day of the month, hour (in24
mode), and minute.
#Read the bugs section closely.
=head1 BUGS
#The original and new directories must be on the same file system.The
#program probably does not work on windows systems.
#The daemon behavior is weak.Not much testing has been done, so the script
may have other problems.
=cut
my $usage = <<EOUSAGE;
usage: $0 initial_name original_dir new_dir suffix lockfile
example: $0 pic /home/httpd/htdocs /home/me/images jpg
/home/me/renamer.process
EOUSAGE
my $check_file = shift or die $usage;
my $original_dir = shift or die $usage;
my $new_dir = shift or die $usage;
my $suffix = shift or die $usage;
my $lockfile = shift or die $usage;
##################################
# If you put it into the cron, comment out between the START and END BLOCK,
# and uncomment the section below it so you don't get multiple
# copies running. Also, comment out the
# lockfile bits above.
#START BLOCK
exit if (fork());
while (-e "$lockfile") {
process($check_file) if (-r "$original_dir/$check_file.$suffix");
sleep 30;
}
#END BLOCK
##################################
#
# process($check_file) if (-r "$original_dir/$check_file.$suffix");
#
##################################
sub process {
my $file = shift;
my @st = (stat("$original_dir/$file.$suffix"));
my ($Second, $Minute, $Hour, $Day, $Month, $Year, $WeekDay, $DayOfYear,
$IsDST) = localtime($st[10]);
$Year += 1900;
$Month++;
my $stamp = sprintf "%4d_%02d_%02d_%02d_%02d_%02d", $Year, $Month, $Day,
$Hour, $Minute, $Second;
print "renaming $original_dir/$file.$suffix to
$new_dir/$stamp.$suffix\n";
rename "$original_dir/$file.$suffix", "$new_dir/$stamp.$suffix" or warn
"couldn't rename file: $! $file to $new_dir/$file.$stamp.$suffix\n";
print "adding $new_dir/$stamp.$suffix to database\n";
my $single_string = $new_dir . '/' . $stamp . '.' . $suffix;
infoinsert ($single_string);
}
############################################################################
#
# Connect to Database Named cctvimages on the localhost with the root user
# $dbh=DBI->connect(DBI:mysql;$database", $user, $password);
# and insert info about the file given as the argument $_[0];
############################################################################
#
sub infoinsert
{
my ($file) = @_;
die"Failed to get the info\n\$file is: $file" if not defined $file;
my $dbh = DBI->connect("DBI:mysql:dbname=cctvimages;host=localhost","root",
"********", {'RaiseError' => 1});
my $size;
my $mtime;
my $secs;
($size, $secs) = (stat ($file))[7,9];
$mtime = &ParseDateString("epoch $secs");
# even after conversion ':' is used to seperate hh and mn and ss
$mtime =~ s/://g;
# the above swaps out the ':' for nothing
$file =~ s/\/home\/me\/images\///;
# the above strips path
print"size is $size\nmodified is $mtime\nfilename is $file\n";
my $rows_affected = $dbh->do("INSERT INTO imageinfo VALUES(null, '$file',
'$size', '$mtime')")
or die "Do Fails: $DBI::errstr\n";
my $sql = "SELECT * FROM imageinfo";
my $sth = $dbh->prepare($sql);
$sth->execute or die"Execute fails: $DBI::errstr\n";
$sth->finish;
$dbh->disconnect;
# Create a new SMTP object
$smtp = Net::SMTP->new($ServerName, Debug => 1);
# If you can't connect, don't proceed with the rest of the script
die "Couldn't connect to server" unless $smtp;
# Initiate the mail transaction
# Your "real" email address
my $MailFrom = "melawaisi\@dundee.com";
# Recipient's "real" email address
my $MailTo = "cctv_alert\@hotmail.com";
$smtp->mail( $MailFrom );
$smtp->to( $MailTo );
# Start the mail
$smtp->data();
# Send the header
# This address will appear in the message
$smtp->datasend("To: cctv_alert\@hotmail.com\n");
# So will this one
$smtp->datasend("From: cctv_server\@hotmail.com\n");
$smtp->datasend("Subject: image_alert\n");
$smtp->datasend("\n");
# Send the body.
$smtp->datasend("size is $size\nmodified is $mtime\nfilename is $file\n");
# Send the termination string
$smtp->dataend();
# Close the connection
$smtp->quit();
}
Global symbol "$smtp" requires explicit package name at rename.pl line 140.
Global symbol "$smtp" requires explicit package name at rename.pl line 143.
Global symbol "$smtp" requires explicit package name at rename.pl line 151.
Global symbol "$smtp" requires explicit package name at rename.pl line 152.
Global symbol "$smtp" requires explicit package name at rename.pl line 155.
Global symbol "$smtp" requires explicit package name at rename.pl line 159.
Global symbol "$smtp" requires explicit package name at rename.pl line 162.
Global symbol "$smtp" requires explicit package name at rename.pl line 163.
Global symbol "$smtp" requires explicit package name at rename.pl line 164.
Global symbol "$smtp" requires explicit package name at rename.pl line 167.
Global symbol "$smtp" requires explicit package name at rename.pl line 170.
Global symbol "$smtp" requires explicit package name at rename.pl line 173.
Execution of rename.pl aborted due to compilation errors.
[root@cctv cgi-bin]#
like I said I usualy use sendmail - it is much easier
Code:
# Open Sendmail
open(MAIL, "|/usr/lib/sendmail -t");
# Write to the sendmail program
print MAIL "To: whoever\@wherever.com\n";
print MAIL "From: whoever\@wherever.com\n";
print MAIL "Subject:Your Subject\n\n";
print MAIL "Your message here";
# Close the sendmail program
close(MAIL);
-----------------------------------------retest.pl
# Open Sendmail
open(MAIL, "|/usr/lib/sendmail -t");
# Write to the sendmail program
print MAIL "To: melawaisi\@dundee.ac.uk\n";
print MAIL "From: cctv_aler\@hotmail.com\n";
print MAIL "Subject:Your Subject\n\n";
print MAIL "Your message here";
# Close the sendmail program
close(MAIL);
-----------------------------------------retest.pl
# Open Sendmail
open(MAIL, "|/usr/lib/sendmail -t");
# Write to the sendmail program
print MAIL "To: melawaisi\@dundee.ac.uk\n";
print MAIL "From: cctv_aler\@hotmail.com\n";
print MAIL "Subject:Your Subject\n\n";
print MAIL "Your message here";
# Close the sendmail program
close(MAIL);
shouldn't you have to put two dots at the end to send this? like:
Code:
# Open Sendmail
open(MAIL, "|/usr/lib/sendmail -t");
# Write to the sendmail program
print MAIL "To: melawaisi\@dundee.ac.uk\n";
print MAIL "From: cctv_aler\@hotmail.com\n";
print MAIL "Subject:Your Subject\n\n";
print MAIL "Your message here";
print MAIL "..\n";
# Close the sendmail program
close(MAIL);
I didn't try it, but piping open apps is just like using them on the command line and sendmail takes two dots and a newline to send the mail, right? Or am I mistaken?
With no flags, sendmail reads its standard input up to an end-of-file or a line consisting only of a
single dot and sends a copy of the message found there to all of the addresses listed. It determines
the network(s) to use based on the syntax and contents of the addresses.
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.