I am trying to program a little Perl script which send plain text/html emails with attachments:
use Encode();
use MIME::Entity();
my $msg = MIME::Entity->build(
From => '"' . Encode::encode( 'MIME-Header', 'Any User' ) . '" <any.user@example.test>',
To => '"' . Encode::encode( 'MIME-Header', 'Some User' ) . '" <some.user@example.test>',
Subject => Encode::encode( 'MIME-Header', 'Multipart alternative with attachments' ),
Type => 'multipart/alternative',
);
my $plain = $msg->attach(
Type => 'text/plain; charset=UTF-8',
Data => [ "*Multipart alternative with attachments*\n\nHere comes the plain text." ],
);
my $fancy = $msg->attach( Type => 'multipart/related' );
$fancy->attach(
Type => 'text/html; charset=UTF-8',
Data => [ "<html>\n\t<body>\n\t\t<h1>Multipart alternative with attachments</h1>\n\t\t<p>Here comes the fancy text.</p>\n\t</body>\n</html>" ],
);
$fancy->attach(
Type => 'text/plain; charset=UTF-8',
Disposition => 'attachment',
Filename => 'test.txt',
Data => [ "*Multipart alternative with attachments*\n\nHere comes the attachment." ],
);
I am getting the following MIME source code:
Content-Type: multipart/alternative; boundary="----------=_1334231022-8218-0"
Content-Transfer-Encoding: binary
MIME-Version: 1.0
X-Mailer: MIME-tools 5.502 (Entity 5.502)
From: "Any User" <any.user@example.test>
To: "Some User" <some.user@example.test>
Subject: Multipart alternative with attachments
This is a multi-part message in MIME format...
------------=_1334231022-8218-0
Content-Type: text/plain; charset=UTF-8
Content-Disposition: inline
Content-Transfer-Encoding: binary
*Multipart alternative with attachments*
Here comes the plain text.
------------=_1334231022-8218-0
Content-Type: multipart/related; boundary="----------=_1334231022-8218-1"
Content-Transfer-Encoding: binary
This is a multi-part message in MIME format...
------------=_1334231022-8218-1
Content-Type: text/html; charset=UTF-8
Content-Disposition: inline
Content-Transfer-Encoding: binary
<html>
<body>
<h1>Multipart alternative with attachments</h1>
<p>Here comes the fancy text.</p>
</body>
</html>
------------=_1334231022-8218-1
Content-Type: text/plain; charset=UTF-8; name="test.txt"
Content-Disposition: attachment; filename="test.txt"
Content-Transfer-Encoding: binary
*Multipart alternative with attachments*
Here comes the attachment.
------------=_1334231022-8218-1--
------------=_1334231022-8218-0--
If I view the email within The Bat, the plain version and the html version are displayed correctly. Within Mozilla Thunderbird 11.0.1 the plain version won't displayed but a reduced html version.
Do I have an error in my logic or does Thunderbird just failed?
You don't need $fancy
, add everything to $msg
.
The Content-Transfer-Encoding header is better base64
or quoted-printable
. It is more foolproof.
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable