The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
# Requires the following to be installed:
#  File::Path
#  File::Spec
#  IO::Scalar, ...         from the IO-stringy distribution
#  MIME::Base64
#  MIME::QuotedPrint
#  Net::SMTP
#  Mail::Internet, ...     from the MailTools distribution.
#  MIME::Tools

use strict;
use Archive::Zip qw(:CONSTANTS :ERROR_CODES);
use IO::Scalar;
use MIME::Entity;    # part of MIME::Tools package

my $zipContents = '';
my $SH          = IO::Scalar->new(\$zipContents);

my $zip = Archive::Zip->new();
my $member;

# add a string as a member:
my $stringMember = '<html><head></head><body><h1>Testing</h1></body></html>';
$member = $zip->addString($stringMember, 'whatever.html');

# $member->desiredCompressionMethod(COMPRESSION_STORED);

# write it to the scalar
my $status = $zip->writeToFileHandle($SH);
$SH->close;

print STDERR "zip is " . length($zipContents) . " bytes long\n";

### Create an entity:
my $top = MIME::Entity->build(
    Type    => 'multipart/mixed',
    From    => 'ned@bike-nomad.com',
    To      => 'billnevin@tricom.net',
    Subject => "Your zip",
);

# attach the message
$top->attach(
    Encoding => '7bit',
    Data     => "here is the zip you ordered\n"
);

# attach the zip
$top->attach(
    Data        => \$zipContents,
    Type        => "application/x-zip",
    Encoding    => "base64",
    Disposition => 'attachment',
    Filename    => 'your.zip'
);

# attach this code
$top->attach(
    Encoding => '8bit',
    Type     => 'text/plain',
    Path     => $0,

    # Data => 'whatever',
    Disposition => 'inline'
);

# and print it out to stdout
$top->print(\*STDOUT);