It's a good idea to separate the output from the logic if you can, especially if that output is HTML. Consider this:
use Modern::Perl;
use Email::Send::SMTP::Gmail;
use POSIX qw(strftime);
use File::Find::Rule;
use Template;
my $subject = "ICS -- Files in the Error Folder";
my $email = 'bflieck@xxx.com';
my @bad_files = File::Find::Rule
->file()
->relative
->maxdepth( 1 )
->name( '*.jpg', '*.tif', '*.tiff', '*.psd' )
->in( '/Volumes/photorepos/Partners/WorkHorse/ERROR/PhotographyDro
+p_ERROR' );
# Group files per user
my %bad_files_per_user;
foreach my $file ( @bad_files )
{
my $user = (split /-/, $file)[0];
$bad_files_per_user{ $user } = $file;
}
# Prepare the email text
my $body = Template->new->process( \*DATA, {
subject => $subject,
files => \%bad_files_per_user,
date => strftime( "%m-%d-%y", localtime ),
time => strftime( "%I:%M:%S", localtime ),
});
# Prepare sender
my ( $sender, $error ) = Email::Send::SMTP::Gmail->new
(
-subject => $subject,
-to => $email,
-from => $email,
-body => $body,
# Better to put these in some kind of configuration file
# -debug => 1,
-smtp => 'smtp.gmail.com',
-login => 'kopautomation1@xxx.com',
-pass => 'xxx',
-layer => 'ssl',
-port => '465',
-timeout => 1000
);
die "session error: $error"
unless ref $sender;
# Off we go
$sender->send;
$sender->bye;
__DATA__
<h1>[% subject %]</h1>
<p class="date">[% date %] - [% time %]</p>
<p>Please fix and redrop or delete the following errors</p>
<div class="bad_format">
<h2>Files with bad format</h2>
[% FOREACH user IN files.keys %]
<h3>User: [% user %] ([% files.$user.size %] files)</h3>
<ul class="files">
[% FOREACH file IN files.$user %]
<li>[% file %]</li>
[% END %]
</ul>
[% END %]
</div>
I am using the Template Toolkit and a template stored in the __DATA__ section of the script to generate the mail. Because the output is now separated from the code, I (you) can make the email arbitrarily complex (like adding images or styles or whatnot) without having to change or clutter the the code with print statement.
Also, I am sure you know this already, whitespace is <s>cheap</s> free!
holli
You can lead your users to water, but alas, you cannot drown them.