aboutsummaryrefslogtreecommitdiff
path: root/mu.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--mu.py58
1 files changed, 57 insertions, 1 deletions
diff --git a/mu.py b/mu.py
index 93816f4..9337747 100644
--- a/mu.py
+++ b/mu.py
@@ -1,3 +1,7 @@
+"""
+Wrapper for the `mu` command line.
+"""
+
import email.message
import email.policy
from email.parser import BytesParser
@@ -6,16 +10,29 @@ from subprocess import PIPE
import xml.dom.minidom
import xml.dom
+from typing import (
+ Literal,
+ Union,
+)
parser = BytesParser(policy=email.policy.default)
def get_mail(id: str) -> email.message.Message:
+ """
+ Lookup email by Message-ID.
+
+ [Raises]
+ MuError
+ """
cmd = subprocess.run(['mu', 'find', '-u', f'i:{id}',
'--fields', 'l'],
stdout=PIPE)
filename = cmd.stdout.decode('UTF-8').strip()
+ if cmd.returncode != 0:
+ raise MuError(cmd.returncode)
+
with open(filename, "rb") as f:
mail = parser.parse(f)
return mail
@@ -36,7 +53,46 @@ class MuError(Exception):
return f'MuError({self.returncode}, "{self.msg}")'
-def mu_search(query, sortfield='subject', reverse=False):
+Sortfield = Union[Literal['cc'],
+ Literal['c'],
+ Literal['bcc'],
+ Literal['h'],
+ Literal['date'],
+ Literal['d'],
+ Literal['from'],
+ Literal['f'],
+ Literal['maildir'],
+ Literal['m'],
+ Literal['msgid'],
+ Literal['i'],
+ Literal['prio'],
+ Literal['p'],
+ Literal['subject'],
+ Literal['s'],
+ Literal['to'],
+ Literal['t'],
+ Literal['list'],
+ Literal['v']]
+
+
+
+def mu_search(query, sortfield: Sortfield = 'subject', reverse: bool = False) -> list[dict[str, str]]:
+ """
+ [Parameters]
+ query - Search query as per mu-find(1).
+ sortfield - Field to sort the values by
+ reverse - If the sort should be reversed
+
+ [Returns]
+ >>> {'from': 'Hugo Hörnquist <hugo@example.com>',
+ 'date': '1585678375',
+ 'size': '377',
+ 'msgid': 'SAMPLE-ID@localhost',
+ 'path': '/home/hugo/.local/var/mail/INBOX/cur/filename',
+ 'maildir': '/INBOX'
+ }
+ """
+
if not query:
raise ValueError('Query required for mu_search')
cmdline = ['mu', 'find',