diff options
author | Anton Khirnov <anton@khirnov.net> | 2021-01-16 10:31:16 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2021-01-16 10:31:16 +0100 |
commit | f0b24807e42ad95395a3885775cb1ee3322571a6 (patch) | |
tree | e5340c93471d8eb7a27f4810d57adb86af64b110 /alot/db | |
parent | 44bb1b83488ea6acf4b0f9f1deb6384c7dfa98fa (diff) |
helper: rewrite mailto_to_envelope/parse_mailto to Envelope.from_mailto
Diffstat (limited to 'alot/db')
-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) |