From 8980f0a3fb54ccad1ba446a485e9b2f60f544040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Thu, 1 Dec 2022 01:42:13 +0100 Subject: Add ability to get raw message. --- mu4web/main.py | 14 ++++++++++++-- mu4web/mu.py | 21 +++++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/mu4web/main.py b/mu4web/main.py index 2e42edc..ba424ee 100644 --- a/mu4web/main.py +++ b/mu4web/main.py @@ -180,8 +180,6 @@ def page_base(title: Optional[str] = None, def response_for(id: str, username: Optional[str] = None) -> str: - # TODO option to show raw message - mail = cast(EmailMessage, get_mail(id)) headers = {} @@ -241,6 +239,8 @@ def response_for(id: str, username: Optional[str] = None) -> str: ('hr',), ('main', body), ('hr',), + ('a', {'href': '/raw?' + urlencode({'id': id})}, + 'Råa bitar'), ('ul', tree), ] html_str = render_document(page_base(title=title, @@ -453,6 +453,16 @@ def attachement_response(attachement: EmailMessage): return response +@app.route('/raw') +@login_required +def raw_message(): + msg_id = request.args.get('id') + filename = mu.find_file(msg_id) + if not filename: + return 'No message with that id', 404 + return flask.send_file(filename, mimetype='message/rfc822') + + @app.route('/part') @login_required def attachement_part_page(): diff --git a/mu4web/mu.py b/mu4web/mu.py index 094db6a..09861af 100644 --- a/mu4web/mu.py +++ b/mu4web/mu.py @@ -19,22 +19,27 @@ from typing import ( parser = BytesParser(policy=email.policy.default) -def get_mail(id: str) -> email.message.Message: - """ - Lookup email by Message-ID. - - [Raises] - MuError - """ +def find_file(id: str) -> Optional[str]: cmd = subprocess.run(['mu', 'find', '-u', f'i:{id}', '--fields', 'l'], stdout=PIPE) filename = cmd.stdout.decode('UTF-8').strip() + if cmd.returncode == 4: + return None if cmd.returncode != 0: raise MuError(cmd.returncode) + return filename - with open(filename, "rb") as f: + +def get_mail(id: str) -> email.message.Message: + """ + Lookup email by Message-ID. + + [Raises] + MuError + """ + with open(find_file(id), "rb") as f: mail = parser.parse(f) return mail -- cgit v1.2.3