From: Thomas Hochstein Date: Fri, 1 May 2015 21:03:48 +0000 (+0200) Subject: Add mmm.pl X-Git-Url: https://code.th-h.de/?p=scripts.git;a=commitdiff_plain;h=afd4787570bf9ab2075752764a677dc0c74cf694 Add mmm.pl Signed-off-by: Thomas Hochstein --- diff --git a/README.md b/README.md index 85e327c..1576a8f 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,12 @@ to the format of the Wordpress plugin 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]` diff --git a/mmm/mmm.pl b/mmm/mmm.pl new file mode 100644 index 0000000..1a322a5 --- /dev/null +++ b/mmm/mmm.pl @@ -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 +# +# 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 = ; + close(FILE); +} else { + $markdown = <>; +} +# read header template +my $headers; +if ($OptHeaderFile) { + open(HEADERS, "< $OptHeaderFile") or die "Can't open $OptHeaderFile: $!"; + $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 \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); +};