/usr/local/CPAN/ec/EC/Attachments.pm


package EC::Attachments;

$VERSION=0.10;

use MIME::Base64;

my $outgoing_mime_boundary = "_----------------------------------";

my @default_mime_headers = ('MIME-Version: 1.0',
                            'Content-Type: text/plain; charset="us-ascii"',
                            'Content-Transfer-Encoding: 7bit');

my @base64_headers = ('MIME-Version: 1.0',
                      'Content-Type: multipart/mixed; boundary="'.
                         $outgoing_mime_boundary.'"', 
                      'Content-Transfer-Encoding: base64');

sub attachment_filenames {
    my ($msg) = @_;
    my (@filenames, $name);
    my $boundary = mime_boundary ($msg);
    my @msglines = split /\n/, $msg;
    foreach my $l (@msglines) {
	if ($l =~ /filename\=/si) {
	    ($name) = ($l =~ /filename=(.+)/si);
	    # In case the file name is in quotes.
	    $name =~ s/\"//g;
	    push @filenames, ($name);
	}
    }
    return @filenames;
}

sub mime_boundary {
    my ($msg) = @_;
    my ($boundary) = ($msg =~ /boundary=(.*?)\n/si);
    $boundary =~ s/\"//g;
    return $boundary;
}

sub save_attachment {
    my ($msg, $attachmentfilename, $ofilename) = @_;
    my $boundary = &mime_boundary ($msg);
    # RFC 2046 - attachment body separated from preceding boundary
    # and attachment headers by two CRLFs - translated to Unix line
    # endings here.  Boundary at the end of the attachment is preceded
    # in practice by two newlines.
    my ($cstr) = ($msg =~ 
      m"filename=\"?$attachmentfilename\"?.*?\n\n(.*?)\n+--$boundary"smi);
    $line = MIME::Base64::decode_base64 ($cstr);
    open FILE, ">$ofilename" or 
	warn "Could not save $ofilename: $!\n";
    print FILE $line;
    close FILE;
}

### Required plain and base64 message header fields.

sub default_mime_headers { return @default_mime_headers }

sub base64_headers { return @base64_headers }


### Headers for each attachment

#
# This gets inserted before the message text so no 
# additional formatting is necessary.
#
sub text_attachment_header {
    return ( "",
	     "This is a multi-part message in MIME format.",
	     '--'.$outgoing_mime_boundary,
	     "Content-Type: text/plain; charset=us-ascii",
	     "Content-Transfer-Encoding: 7bit",
	     "");
}

sub format_attachment {
    my ($filepath) = @_;
    my (@formatted,$basename);
    ($basename) = ($filepath =~ /.*\/(.*)/si);
    push @formatted, ('--'.$outgoing_mime_boundary,
		  "Content-Type: application/octet-stream; name=\"$basename\"",
		  "Content-Transfer-Encoding: base64",
		  "Content-Disposition: attachment; filename=\"$basename\"");
    push @formatted, ('');

    open FILE, "$filepath" or
	warn "Could not encode $filepath: $!\n";
    my $s = '';
    while (defined ($line = <FILE>)) {
	$s .= $line;
    }
    close FILE;
    my $encoded = MIME::Base64::encode_base64 ($s);
    my @lines = split /\n/, $encoded;
    push @formatted, @lines;
    push @formatted, ('');
    return @formatted;
}

sub outgoing_mime_boundary {
    return $outgoing_mime_boundary;
}

1;