summaryrefslogtreecommitdiff
path: root/alot/db
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2021-01-16 10:31:16 +0100
committerAnton Khirnov <anton@khirnov.net>2021-01-16 10:31:16 +0100
commitf0b24807e42ad95395a3885775cb1ee3322571a6 (patch)
treee5340c93471d8eb7a27f4810d57adb86af64b110 /alot/db
parent44bb1b83488ea6acf4b0f9f1deb6384c7dfa98fa (diff)
helper: rewrite mailto_to_envelope/parse_mailto to Envelope.from_mailto
Diffstat (limited to 'alot/db')
-rw-r--r--alot/db/envelope.py34
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)