summaryrefslogtreecommitdiff
path: root/alot/db/envelope.py
diff options
context:
space:
mode:
Diffstat (limited to 'alot/db/envelope.py')
-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)