#!/usr/bin/perl -w

=head1 NAME

mimepostcard - send/output a multipart/alternative message


=head1 SYNOPSIS

Usage:

    mimepostcard /path/to/some/graphic.jpg to@addr.com

You can point it at a .gif file as well.
The special address "-" just causes the message to go to STDOUT.


=head1 DESCRIPTION

This sends a mesasge both as HTML and plain text.
I use "Data"; you would probably use "Path".


=head1 AUTHOR

Eryq, eryq@zeegee.com


=cut

use MIME::Entity;
use strict;
use Getopt::Std;

$SIG{__DIE__} = sub { die "mime_postcard: $_[0]\n" };

#------------------------------
# usage
#------------------------------
sub usage {
    my $problem = join '',@_;
    print STDERR "\n";
    print STDERR "Error: $problem\n" if $problem;
    my @usage;
    if (open O, '<'.$0){
	local($/) = "\n";
	1               while (defined($_ = <O>) and !/^=head1\s+SYNOPSIS/);
	push @usage, $_ while (defined($_ = <O>) and !/^=/);
	close O;
    }
    my $u = join '', @usage; $u =~ s/\A\n+//;
    $u =~ s{\n\n+(\s+)}{\n$1}g;
    print STDERR $u, "\n";
    exit -1;
}

#------------------------------
# main
#------------------------------
sub main {
    
    ### Get options:
    my %opts;
    getopts("", \%opts);

    ### Get graphic:
    my $graphic = shift @ARGV || usage "missing path to graphic\n";
    (-r $graphic) or die "$graphic unreadable\n";
    my $graphic_type;
    if    ($graphic =~ /\.gif$/i)   { $graphic_type = "image/gif" }
    elsif ($graphic =~ /\.jpe?g$/i) { $graphic_type = "image/jpeg" }
    elsif ($graphic =~ /\.png$/i)   { $graphic_type = "image/png" }
    else                            { die "unknown type for: $graphic\n"; }
    my $gid = "my-graphic";
    
    ### Get destination:
    my $dest = shift @ARGV || usage "missing destination\n";

    ### The top-level message:
    my $msg = MIME::Entity->build(To      => $dest,
				  Subject => 'A postcard for you',
				  Type    => 'multipart/alternative');
    
    ### Alternative #1 is the plain text:
    my $plain = $msg->attach(Type => 'text/plain',
			     Data => ["Having a wonderful time... \n",
				      "wish you were looking at HTML \n",
				      "instead of this boring text!\n"]);

    ### Alternative #2 is the HTML-with-content: 
    my $fancy = $msg->attach(Type => 'multipart/related');
    $fancy->attach(Type => 'text/html',
		   Data => [qq< <H1>Hey there!</H1> \n>,
			    qq< Having a <I>wonderful</I> time... \n>,
			    qq< take a look!\n >,
			    qq< <BR><IMG SRC="cid:$gid" ALT="Snapshot"><HR>>
			    ]);
    $fancy->attach(Type => $graphic_type,
		   Path => $graphic,
		   Id   => $gid);

    ### Print or send:
    if ($dest eq '-') {
	$msg->print;
    }
    else {
	$msg->smtpsend();
    }
}
eval { main() }; die "$0: $@" if $@;



