Open dhruvasagar opened 10 years ago
Maybe adding a metadata field to the emails indicating a preprocessing option could do the trick, something like filter: markdown
, which would pass the email without metadata through any program given instead of markdown
and send the output of it instead of the original text. This would be enough for formatting needs, and would even make using pgp easier.
When metadata is needed, like the to: field for pgp, the filter could be restricted to scripts in a certain directory, which then have to parse the whole email including metadata.
This sounds like a good idea.
I forgot that to send html, a conten-type: text/html
would be needed. So the user should have to possibility to change/specify the content type. For html mails it's sometimes desirable to have a plain text and a html version in one mail, for encrypted data, it's not, so things get a little complicated.
This is a good idea, so I whipped together a hack so I could send markdown emails until the feature gets implemented.
You need to patch two files (see patch below) to get vmail to preprocess your email through any arbitrary shell script you specify (piped through STDIN). It's important that your script:
Content-type: text/html;
header, and attach:
lines) from the body and only html-ify the body, leaving the headers at the top in plain text.Here's my perl script that just runs the body part through markdown
:
#!/bin/perl
use strict;
use warnings;
my $slurp = join('',<>);
my $x = ($slurp =~ m|f:m|); #search for shortened keyword "f:m"
if (!$x) {$x = ($slurp =~ m|filter: markdown|);} #search for full keyword
if ($x) {
print "Content-type: text/html; charset=iso-8859-1\n".$`; #original headers ($` = string before match);
print q{
<html><head><title></title></head>
<body>
}; # replace the keyword with html headers
open(FH, "| markdown") || die "Couldn't run markdown";
print FH $'; #pipe body through markdown, prints to std out
close(FH);
print "\n</body>\n</html>";
}else{
print $slurp;
}
And here's the patch (remember to change "parse_mail.pl " to the name your own script):
--- a/vmail.vim 2015-08-29 02:10:41.790703085 -0700
+++ b/vmail.vim 2015-08-29 00:01:42.763514214 -0700
@@ -683,7 +686,8 @@
function! s:send_message()
let mail = join(getline(1,'$'), "\n")
echo "Sending message"
- let res = system(s:deliver_command, mail)
+ let parsed = system("parse_mail.pl ", mail)
+ let res = system(s:deliver_command, parsed)
if match(res, '^Failed') == -1
write!
call s:close_and_focus_list_window()
--- a/vmail/imap_client.rb 2015-08-29 02:10:08.570197764 -0700
+++ b/vmail/imap_client.rb 2015-08-29 02:07:28.784422766 -0700
@@ -425,15 +423,20 @@
mail.add_file(file) if File.size?(file)
end
end
- mail.text_part do
- body raw_body.split(/\n\s*\n/, 2)[1]
+ raw_body = raw_body.split(/\n\s*\n/, 2)[1]
+ end
+ if headers['Content-type'] =~ /html/
+ mail.html_part do
+ body raw_body
+ content_type headers['content-type']
end
+ mail.html_part.charset = 'UTF-8'
else
mail.text_part do
body raw_body
end
+ mail.text_part.charset = 'UTF-8'
end
- mail.text_part.charset = 'UTF-8'
mail
rescue
$logger.debug $!
Where's the like button when you need one! This would be really nice :)
I would like the ability to compose HTML emails, which will allow me to use simple tags like