#!/usr/bin/perl -w use strict; use Mail::Bulkmail; use Mail::AddressSort; 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(email@domain.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{errorlog} -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; my $list=Mail::AddressSort->new(); $list->input(@address); (@address)=$list->sorted(); 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; my $bulk = Mail::Bulkmail->new( 'LIST' => \@address, 'Message' => $mail, 'From' => $option{f} || $default{fromaddr}, 'Reply-to' => $option{f} || $default{fromaddr}, 'Subject' => $option{s} || $default{subject}, 'BAD' => catfile($dir, $option{e} || $default{errorlog}), 'GOOD' => catfile($dir, $option{l} || $default{successlog}), 'ERRFILE' => catfile($dir, $option{e} || $default{errorlog}), 'HTML' => 1, 'use_envelope' => 1, 'envelope_limit'=> 1000 ) or die Mail::Bulkmail -> error(); $bulk->header(qw(Content-type: text/html)); $bulk->bulkmail;