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. Cheers Mel ---------------------------------------emailtest.pl #!/usr/local/bin/perl use Net::SMTP; print "Content-type: text/plain", "\n\n"; my $DEBUG = 1; if($DEBUG) { $| = 1; open(STDERR, ">&STDOUT"); } # Set this variable to your smtp server name my $ServerName = "smtp.dundee.ac.uk"; # 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("This is to notify you of a new image being sent to the server!\n\n"); # Send the termination string $smtp->dataend(); # Close the connection $smtp->quit(); --------------------------------renamerr.pl #!/usr/bin/perl use strict; use warnings; use DBI; use Date::Manip; =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; } |
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 |
thanks for the help,
but do i not need to put the email notifier inside a loop? |
this is what i get:
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 |
Hi,
i tried to run this seperatly, and i got nothing: [root@cctv cgi-bin]# perl retest.pl [root@cctv cgi-bin]# -----------------------------------------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); Cheers |
Hi,
i tried to run this seperatly, and i got nothing: [root@cctv cgi-bin]# perl retest.pl [root@cctv cgi-bin]# -----------------------------------------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); Cheers |
shouldn't you have to put two dots at the end to send this? like:
Code:
# Open Sendmail |
sorry, [from man 8 sendmail]:
Quote:
|
Note the "With no flags", "-t" causes sendmail to read the addresses from the header.
As for the problem - Is the path to sendmail right for your machine? |
All times are GMT -5. The time now is 07:10 PM. |