diff options
Diffstat (limited to 'alot/db/envelope.py')
-rw-r--r-- | alot/db/envelope.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/alot/db/envelope.py b/alot/db/envelope.py index 314be03c..d5b84b3e 100644 --- a/alot/db/envelope.py +++ b/alot/db/envelope.py @@ -12,6 +12,8 @@ from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication import email.charset as charset +from urllib.parse import unquote + import gpg from .attachment import Attachment @@ -347,3 +349,35 @@ class Envelope: del self['Attach'] self.body = raw[headerEndPos:].strip() + + _MAILTO_PREFIX = 'mailto:' + _MAILTO_SAFE_HEADERS = ('Subject', 'Cc', 'Keywords') + + @classmethod + def from_mailto(cls, mailto): + if not mailto.startswith(cls._MAILTO_PREFIX): + raise ValueError('Invalid mailto string: %s' % mailto) + mailto = mailto[len(cls._MAILTO_PREFIX):] + + headers = {} + body = '' + + to, _, hfields = mailto.partition('?') + to = unquote(to) + if to: + headers['To'] = [to] + + for hfield in hfields.split('&'): + key, _, value = hfield.partition('=') + + key = key.capitalize() + value = unquote(value) + if not value: + continue + + if key == 'Body': + body = value + elif key in cls._MAILTO_SAFE_HEADERS: + headers[key] = [value] + + return cls(headers = headers, bodytext = body) |