I use MIME::Lite for this sort of task.
Here is some code from a module I have which sends emails to a list pulled from a database:
if(defined($email->{'attachments'}->{'count'})){
$msg = MIME::Lite->new(
From => "$email->{'from'}",
To => "$row->{$email->{'db'}->{'email_field'}}",
Subject => "$subject",
Type => 'multipart/mixed',
);
if(defined($email->{'cvr_ltr_html'})){
# attach html cover letter
$msg->attach(
Type => 'text/html',
Data => $copy_html,
);
} else {
# attach plain text cover letter
$msg->attach( Type => 'TEXT',
Data => "$copy",
);
}
} else {
# print "We now produce a plain text email message.\n";
$msg = MIME::Lite->new(
From => "$email->{'from'}",
To => "$row->{$email->{'db'}->{'email_field'}}",
Subject => "$subject",
Data => $copy,
);
}
if(defined($email->{'attachments'}->{'count'})){
for my $i (1 .. $email->{'attachments'}->{'count'}){
# print STDERR $email->{'attachments'}->{$i}->{'Content-type'},"
+\n";
# print STDERR $email->{'attachments'}->{$i}->{'file-path'},"\n"
+;
$msg->attach( Type => $email->{'attachments'}->{$i}->{'Content-t
+ype'},
Disposition => $email->{'attachments'}->{$i}->{'dispositi
+on'},
Path => $email->{'attachments'}->{$i}->{'file-path
+'},
Filename => $email->{'attachments'}->{$i}->{'filename'
+},
Encoding => 'base64',
);
}
}
my $smtp = Net::SMTP->new($mailhost,
Hello => $email->{'hello'},
Debug => 0 ) or return 0;
my $data = $msg->body_as_string;
my $header = $msg->header_as_string;
$smtp->to($row->{$email->{'db'}->{'email_field'}});
$smtp->data();
$smtp->datasend("$header");
$smtp->datasend("\n\n");
$smtp->datasend("$data \n");
$smtp->dataend();
$smtp->quit;
if( $lal && $lol ) { $life++; }