Add mmm.pl

Signed-off-by: Thomas Hochstein <thh@inter.net>
This commit is contained in:
Thomas Hochstein 2015-05-01 23:03:48 +02:00
parent 8b47885dbe
commit afd4787570
2 changed files with 110 additions and 0 deletions

View file

@ -13,3 +13,12 @@ to the format of the Wordpress plugin
Usage: `footnotes --to mmd|wp [--file $inputfile]` Usage: `footnotes --to mmd|wp [--file $inputfile]`
### mmm.pl
`mmm` (*MIME multipart/alternative from Markdown*) can
create a MIME `multipart/alternative` mail, containing a
`text/plain` part (in Markdowen) and a `text/html` part, from
a Markdown file. Other mail headers (From:, To:, Subject:, ...)
can be prepended from a template file.
Usage: `mmm [--file $inputfile] [--headers $templatefile]`

101
mmm/mmm.pl Normal file
View file

@ -0,0 +1,101 @@
#! /usr/bin/perl -W
#
# mmm Version 0.1 by Thomas Hochstein
#
# Create a MIME multipart/alternative part, containing
# text/plain (in Markdowen) and text/html, from a
# Markdown file.
#
# Copyright (c) 2015 Thomas Hochstein <thh@inter.net>
#
# It can be redistributed and/or modified under the same terms under
# which Perl itself is published.
my $VERSION = "0.1";
use strict;
use Getopt::Long qw(GetOptions);
use Text::Markdown;
# read commandline option(s)
my ($OptInFile,$OptHeaderFile);
GetOptions ('f|file=s' => \$OptInFile,
't|headers=s' => \$OptHeaderFile,
'H|help' => \&ShowPOD,
'V|version' => \&ShowVersion) or exit 1;
# read input from STDIN or --file
# unset $/
undef $/;
my $markdown;
if ($OptInFile) {
open(FILE, "< $OptInFile") or die "Can't open $OptInFile: $!";
$markdown = <FILE>;
close(FILE);
} else {
$markdown = <>;
}
# read header template
my $headers;
if ($OptHeaderFile) {
open(HEADERS, "< $OptHeaderFile") or die "Can't open $OptHeaderFile: $!";
$headers = <HEADERS>;
close(HEADERS);
# remove all trailing newlines
$headers =~ s/\n+$//;
}
# reset $/
$/ = "\n";
# convert markdown to html
my $html = Text::Markdown::Markdown($markdown);
# output
print "$headers\n" if ($OptHeaderFile);
my $Boundary = &GenBoundary;
print "MIME-Version: 1.0\n";
print "Content-Type: multipart/alternative;\n";
printf ('boundary="%s"'."\n",$Boundary);
print "\n";
print "This is a multi-part message in MIME format.\n";
printf ("--%s\n",$Boundary);
print "Content-Type: text/plain; charset=ISO-8859-15\n";
print "Content-Transfer-Encoding: 8bit\n";
print "\n";
print "$markdown\n";
printf ("--%s\n",$Boundary);
print "Content-Type: text/html; charset=ISO-8859-15\n";
print "Content-Transfer-Encoding: 8bit\n";
print "X-Creator: Markdown/1.0.1\n";
print "\n";
print "$html\n";
printf ("--%s--\n",$Boundary);
exit(0);
################################################################################
sub GenBoundary {
my $hex;
$hex .= sprintf("%x", rand 16) for 1..20;
return ( "----------" . $hex);
}
sub ShowVersion {
print "mmm v$VERSION\n";
print "MIME multipart/alternative from Markdown - MMM\n";
print "Copyright (c) 2014 Thomas Hochstein <thh\@inter.net>\n";
print "This program is free software; you may redistribute it ".
"and/or modify it under the same terms as Perl itself.\n";
exit(100);
};
sub ShowPOD {
exec('perldoc', $0);
exit(100);
};