fix CLI output mail as binary stream
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import json
|
||||||
import logging
|
import logging
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
import sys
|
import sys
|
||||||
@@ -92,7 +93,7 @@ def print_table(columns, rows):
|
|||||||
|
|
||||||
def list_quarantines(quarantines, args):
|
def list_quarantines(quarantines, args):
|
||||||
if args.batch:
|
if args.batch:
|
||||||
print("\n".join([q.name for q in quarantines]))
|
print("\n".join([q["name"] for q in quarantines]))
|
||||||
else:
|
else:
|
||||||
qlist = []
|
qlist = []
|
||||||
for q in quarantines:
|
for q in quarantines:
|
||||||
@@ -280,8 +281,14 @@ def delete(quarantines, args):
|
|||||||
|
|
||||||
def get(quarantines, args):
|
def get(quarantines, args):
|
||||||
storage = _get_quarantine(quarantines, args.quarantine, args.debug).storage
|
storage = _get_quarantine(quarantines, args.quarantine, args.debug).storage
|
||||||
_, msg = storage.get_mail(args.quarantine_id)
|
data = storage.get_mail_bytes(args.quarantine_id)
|
||||||
print(msg.as_string())
|
sys.stdout.buffer.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
def metadata(quarantines, args):
|
||||||
|
storage = _get_quarantine(quarantines, args.quarantine, args.debug).storage
|
||||||
|
metadata = storage.get_metadata(args.quarantine_id)
|
||||||
|
print(json.dumps(metadata))
|
||||||
|
|
||||||
|
|
||||||
class StdErrFilter(logging.Filter):
|
class StdErrFilter(logging.Filter):
|
||||||
@@ -462,6 +469,17 @@ def main():
|
|||||||
metavar="ID",
|
metavar="ID",
|
||||||
help="Quarantine ID.")
|
help="Quarantine ID.")
|
||||||
quarantine_get_parser.set_defaults(func=get)
|
quarantine_get_parser.set_defaults(func=get)
|
||||||
|
# quarantine metadata command
|
||||||
|
quarantine_metadata_parser = quarantine_subparsers.add_parser(
|
||||||
|
"metadata",
|
||||||
|
description="Get metadata of email from quarantine.",
|
||||||
|
help="Get metadata of email from quarantine",
|
||||||
|
formatter_class=formatter_class)
|
||||||
|
quarantine_metadata_parser.add_argument(
|
||||||
|
"quarantine_id",
|
||||||
|
metavar="ID",
|
||||||
|
help="Quarantine ID.")
|
||||||
|
quarantine_metadata_parser.set_defaults(func=metadata)
|
||||||
|
|
||||||
# whitelist command group
|
# whitelist command group
|
||||||
whitelist_parser = subparsers.add_parser(
|
whitelist_parser = subparsers.add_parser(
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import os
|
|||||||
|
|
||||||
from calendar import timegm
|
from calendar import timegm
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from email import message_from_binary_file
|
from email import message_from_bytes
|
||||||
from email.policy import SMTPUTF8
|
from email.policy import SMTPUTF8
|
||||||
from glob import glob
|
from glob import glob
|
||||||
from time import gmtime
|
from time import gmtime
|
||||||
@@ -80,10 +80,10 @@ class FileMailStorage(BaseMailStorage):
|
|||||||
super().__init__(original, metadata, metavar, pretend)
|
super().__init__(original, metadata, metavar, pretend)
|
||||||
# check if directory exists and is writable
|
# check if directory exists and is writable
|
||||||
if not os.path.isdir(directory) or \
|
if not os.path.isdir(directory) or \
|
||||||
not os.access(directory, os.W_OK):
|
not os.access(directory, os.R_OK):
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
f"directory '{directory}' does not exist or is "
|
f"directory '{directory}' does not exist or is "
|
||||||
f"not writable")
|
f"not readable")
|
||||||
self.directory = directory
|
self.directory = directory
|
||||||
try:
|
try:
|
||||||
self.mode = int(mode, 8) if mode is not None else None
|
self.mode = int(mode, 8) if mode is not None else None
|
||||||
@@ -346,18 +346,23 @@ class FileMailStorage(BaseMailStorage):
|
|||||||
else:
|
else:
|
||||||
self._save_metafile(metafile, metadata)
|
self._save_metafile(metafile, metadata)
|
||||||
|
|
||||||
|
def get_mail_bytes(self, storage_id):
|
||||||
|
_, datafile = self._get_file_paths(storage_id)
|
||||||
|
try:
|
||||||
|
with open(datafile, "rb") as fh:
|
||||||
|
data = fh.read()
|
||||||
|
except IOError as e:
|
||||||
|
raise RuntimeError(f"unable to open email data file: {e}")
|
||||||
|
return data
|
||||||
|
|
||||||
def get_mail(self, storage_id):
|
def get_mail(self, storage_id):
|
||||||
super().get_mail(storage_id)
|
super().get_mail(storage_id)
|
||||||
|
|
||||||
metadata = self.get_metadata(storage_id)
|
metadata = self.get_metadata(storage_id)
|
||||||
_, datafile = self._get_file_paths(storage_id)
|
msg = message_from_bytes(
|
||||||
try:
|
self.get_mail_bytes(storage_id),
|
||||||
with open(datafile, "rb") as fh:
|
_class=MilterMessage,
|
||||||
msg = message_from_binary_file(
|
policy=SMTPUTF8.clone(refold_source='none'))
|
||||||
fh, _class=MilterMessage, policy=SMTPUTF8.clone(
|
|
||||||
refold_source='none'))
|
|
||||||
except IOError as e:
|
|
||||||
raise RuntimeError(f"unable to open email data file: {e}")
|
|
||||||
return (metadata, msg)
|
return (metadata, msg)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user