Use MIME::Lite to create a multipart message with attachment

MIME::Lite is a great Perl module for working with MIME formatted email messages. However, one problem I ran into was trying to create a multipart message that has 1) a text version of the message 2) an HTML version of the message and 3) an HTML attachment. If I set the content type to “multipart/alternative” then the attachment showed up as part of the message but if I set the content type to “multipart/mixed” then the message showed up as an attachment. I couldn’t find a solution online so I figured it out on my own. Hopefully this helps someone in the future.

To get things right you have to create a multipart/alternative message that is nested within a multipart/mixed message. Here is the code I used:

my $html = “<html><body>This is the HTML message</body></html>”;
my $text = “This is the text message”;
my $attachment = “<html><body>This is the HTML attachment</body></html>”;
my $email = “someone@example.com”;

my $msg = MIME::Lite->new(
From        =>  ‘me@example.com’,
To          =>  $email,
Subject     =>  ‘Test message’,
Type        =>  ‘multipart/mixed’
);

my $part = MIME::Lite->new(
Type => ‘multipart/alternative’,
);
$part->attach(
Type => ‘text/html; charset=utf-8’,
Data => $html,
);
$part->attach(
Type => ‘text/plain’,
Data => $text,
);
$msg->attach($part);

$msg->attach(
Type => ‘text/html’,
Data => $attachment,
Filename => ‘filename.htm’,
Disposition => ‘attachment’
);

$msg->send;
if ( $msg->last_send_successful() ) {
print ”  Message sent to $email\n”;
} else {
print ”  Error sending email to $email\n”;
}

Add a Comment

Your email address will not be published. Required fields are marked *