#!/usr/bin/perl -w
use strict;
use Mail::Bulkmail;
use File::Spec::Functions;
use Getopt::Std;
my %default = (
dir => ".",
addrfile => "addresslist.txt",
mailfile => "mail.txt",
errorlog => "error.log",
successlog => "success.log",
subject => q(Default subject),
fromaddr => q(vpolyakov@katrillion.com),
);
getopts('a:d:e:hf:l:m:s:', \my %option);
$option{h} && die << "HELPMSG";
usage: bulkmail [-a addrfile] [-d directory] [-e errorlog] [-h]
[-f fromaddr] [-l successlog] [-m mailfile] [-s subject]
All files must reside in the same directory.
defaults: -a $default{addrfile} -d $default{dir} -e $default{errorlo
+g}
-f $default{fromaddr} -l $default{successlog} -m $default{
+mailfile}
-s $default{subject}
HELPMSG
my $dir = $option{d} || $default{dir};
open(my $listfile, "<", catdir($dir, $option{a} || $default{addrfile})
+) or die "Couldn't open address list: $!\n";
chomp(my @address = <$listfile>);
close $listfile;
@address = map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map { $_, lc((split /\@/)[-1]) }
@address;
open(my $mailfile, "<", catdir($dir, $option{m} || $default{mailfile})
+) or die "Couldn't open message file: $!\n";
read $mailfile, my $mail, -s $mailfile;
close $mailfile;
$bulk = Mail::Bulkmail->new(
LIST => \@address,
Message => $mail,
From => $option{f} || $default{fromaddr},
Subject => $option{s} || $default{subject},
BAD => catfile($dir, $option{e} || $default{errorlog}),
GOOD => catfile($dir, $option{l} || $default{successlo
+g}),
ERRFILE => catfile($dir, $option{e} || $default{errorl
+og}),
HTML => 1,
use_envelope => 1,
);
$bulk->HFM(1);
$bulk->envelope_limit(1000);
$bulk->header(qw(Content-type text/html));
$bulk->bulkmail;
Of course you can get past the same-directory limitation by passing something like
-a ../addresses.txt
Makeshifts last the longest.