179 lines
4.3 KiB
Python
179 lines
4.3 KiB
Python
#!/usr/bin/python3 -tt
|
|
# skvidal@fedoraproject.org
|
|
# (c) red hat, inc 2013, 2015
|
|
# gpl whatever
|
|
# this is a direct port of exo-compos-mail-1 from xfce
|
|
# from perl to python
|
|
# the idea is to dump the 2000000000 perl pkgs pulled in
|
|
# by this for a single item :(
|
|
# it should handle all the behaviour the same
|
|
# it probably has bugs
|
|
|
|
# TODO:
|
|
# - figure out what the attachment parsing is trying to do
|
|
# - figure out if rebuilding the mailto for evo, sylpheed and balsa
|
|
# is actually necessary or not - feels silly but I'm not shocked by silly
|
|
# - would be nice to have an actual set of tests :)
|
|
|
|
|
|
import sys
|
|
import posix
|
|
import os
|
|
import urllib.parse
|
|
|
|
|
|
def parse_url(mailto):
|
|
url = urllib.parse.urlparse(mailto, 'mailto')
|
|
res = {}
|
|
to = []
|
|
query = None
|
|
|
|
if url.query or '?' not in url.path:
|
|
if url.path:
|
|
to.append(urllib.parse.unquote(url.path))
|
|
|
|
else:
|
|
(thisto, ques, query) = url.path.partition('?')
|
|
if thisto.strip():
|
|
to.append(urllib.parse.unquote(thisto))
|
|
|
|
if not query:
|
|
query = url.query
|
|
|
|
q_dict = urllib.parse.parse_qs(query)
|
|
to.extend(q_dict.get('to', []))
|
|
res['to'] = to
|
|
if 'to' in q_dict:
|
|
del(q_dict['to'])
|
|
|
|
res.update(q_dict)
|
|
return res
|
|
|
|
|
|
if len(sys.argv) < 3:
|
|
sys.stderr.write("Usage: %s <style> <binary> <mailto>\n" % (sys.argv[0]))
|
|
sys.exit(1)
|
|
|
|
|
|
style = sys.argv[1]
|
|
binary = sys.argv[2]
|
|
raw_mailto = sys.argv[3]
|
|
mailto = parse_url(raw_mailto)
|
|
|
|
|
|
to = mailto.get('to', [])
|
|
cc = mailto.get('cc', [])
|
|
bcc = mailto.get('bcc', [])
|
|
subject = ' '.join(mailto.get('subject', []))
|
|
body = '\n'.join(mailto.get('body', []))
|
|
attachments = mailto.get('attachment', [])
|
|
|
|
# hackish
|
|
if isinstance(subject, list):
|
|
subject = subject[0]
|
|
|
|
|
|
args = [binary]
|
|
if style == 'mozilla':
|
|
|
|
command = "to='" + ','.join(to) + "'"
|
|
command += ",cc='" + ','.join(cc) + "'"
|
|
command += ",bcc='" + ','.join(bcc) + "'"
|
|
command += ",attachment='" + ','.join(attachments) + "'"
|
|
if subject:
|
|
command += ",subject='" + subject + "'"
|
|
if body:
|
|
command += ",body='" + body + "'"
|
|
|
|
args.append('-compose')
|
|
args.append(command)
|
|
|
|
elif style == 'mozilla-remote':
|
|
# generate xfeDoCommand(composeMessage, ...) string
|
|
command = 'xfeDoCommand(composeMessage'
|
|
command += ",to='" + ','.join(to) + "'"
|
|
command += ",cc='" + ','.join(cc) + "'"
|
|
command += ",bcc='" + ','.join(bcc) + "'"
|
|
command += ",attachment='" + ','.join(attachments) + "'"
|
|
if subject:
|
|
command += ",subject='" + subject + "'"
|
|
if body:
|
|
command += ",body='" + body + "'"
|
|
|
|
command += ')'
|
|
|
|
# and add the parameters to the argv
|
|
args.append('-remote')
|
|
args.append(command)
|
|
|
|
elif style == 'evolution':
|
|
# evo takes a mailto uri and parses it itself
|
|
# just hand back what we were handed originally
|
|
# note - it my want them to be url_escaped first? or not?
|
|
args.append(raw_mailto)
|
|
|
|
elif style == 'kmail':
|
|
if len(to) >= 1:
|
|
baseaddr = to[0]
|
|
cc.extend(to[1:])
|
|
else:
|
|
baseaddr = " "
|
|
|
|
for item in cc:
|
|
args.append('--cc')
|
|
args.append(item)
|
|
for item in bcc:
|
|
args.append('--bcc')
|
|
args.append(item)
|
|
for item in attachments:
|
|
args.append('--attach')
|
|
args.append(item)
|
|
if subject:
|
|
args.append('--subject')
|
|
args.append(subject)
|
|
if body:
|
|
args.append('--body')
|
|
args.append('\n'.join(body))
|
|
args.append('--composer')
|
|
args.append(baseaddr)
|
|
|
|
elif style == 'sylpheed':
|
|
args.append('--compose')
|
|
args.append(raw_mailto)
|
|
# fixme - do attachments separately
|
|
|
|
elif style == 'balsa': # cmon, balsa? really?
|
|
args.append('--compose')
|
|
args.append(raw_mailto)
|
|
# fixme - do attachments separately
|
|
|
|
elif style == 'mutt':
|
|
for item in cc:
|
|
args.append('-c')
|
|
args.append(item)
|
|
for item in attachments:
|
|
args.append('-a')
|
|
args.append(item)
|
|
if subject:
|
|
args.append('-s')
|
|
args.append(subject)
|
|
for item in to:
|
|
args.append(item)
|
|
if to:
|
|
args.append('')
|
|
|
|
|
|
else:
|
|
sys.stderr.write("%s: Unsupported style '%s'.\n" % (sys.argv[0], style))
|
|
sys.exit(1)
|
|
|
|
# try to execute the generated command
|
|
posix.execv(binary, args)
|
|
# DEBUG
|
|
# print binary,
|
|
# print ' '.join(args)
|
|
# sys.exit(0)
|
|
# ENDDEBUG
|
|
# something went wrong
|
|
sys.exit(1)
|