add option to skip metadata and save storage_id during runtime

This commit is contained in:
2021-09-10 01:42:33 +02:00
parent 83df637792
commit 45f5a80d85
3 changed files with 24 additions and 17 deletions

View File

@@ -336,7 +336,8 @@ class ModifyMilter(Milter.Base):
refold_source='none')) refold_source='none'))
self.msginfo = { self.msginfo = {
"mailfrom": self.mailfrom, "mailfrom": self.mailfrom,
"rcpts": self.rcpts} "rcpts": self.rcpts,
"storage_id": None}
self._replacebody = False self._replacebody = False
milter_action = None milter_action = None

View File

@@ -176,6 +176,10 @@ class ActionConfig(BaseConfig):
f"{self['name']}: file quarantine directory " f"{self['name']}: file quarantine directory "
f"'{self['directory']}' does not exist or is " f"'{self['directory']}' does not exist or is "
f"not writable") f"not writable")
if "skip_metadata" in cfg:
self.add_bool_arg(cfg, "skip_metadata")
else: else:
raise RuntimeError( raise RuntimeError(
f"{self['name']}: storage_type: invalid storage type") f"{self['name']}: storage_type: invalid storage type")
@@ -217,12 +221,11 @@ class Action:
def execute(self, milter): def execute(self, milter):
"""Execute configured action.""" """Execute configured action."""
logger = CustomLogger(
self.logger, {"name": self._name, "qid": milter.qid})
if self.conditions is None or \ if self.conditions is None or \
self.conditions.match(envfrom=milter.mailfrom, self.conditions.match(envfrom=milter.mailfrom,
envto=[*milter.rcpts], envto=[*milter.rcpts],
headers=milter.msg.items()): headers=milter.msg.items()):
logger = CustomLogger(
self.logger, {"name": self._name, "qid": milter.qid})
return self._class.execute( return self._class.execute(
milter=milter, pretend=self.pretend, logger=logger) milter=milter, pretend=self.pretend, logger=logger)

View File

@@ -50,10 +50,11 @@ class BaseMailStorage(object):
class FileMailStorage(BaseMailStorage): class FileMailStorage(BaseMailStorage):
"Storage class to store mails on filesystem." "Storage class to store mails on filesystem."
def __init__(self, directory, original=False): def __init__(self, directory, original=False, skip_metadata=False):
super().__init__() super().__init__()
self.directory = directory self.directory = directory
self.original = original self.original = original
self.skip_metadata = skip_metadata
self._metadata_suffix = ".metadata" self._metadata_suffix = ".metadata"
def _save_datafile(self, storage_id, data): def _save_datafile(self, storage_id, data):
@@ -98,19 +99,20 @@ class FileMailStorage(BaseMailStorage):
# save mail # save mail
datafile = self._save_datafile(storage_id, data) datafile = self._save_datafile(storage_id, data)
# save metadata if not self.skip_metadata:
metadata = { # save metadata
"mailfrom": mailfrom, metadata = {
"recipients": recipients, "mailfrom": mailfrom,
"subject": subject, "recipients": recipients,
"timestamp": timegm(gmtime()), "subject": subject,
"queue_id": qid} "timestamp": timegm(gmtime()),
"queue_id": qid}
try: try:
self._save_metafile(storage_id, metadata) self._save_metafile(storage_id, metadata)
except RuntimeError as e: except RuntimeError as e:
os.remove(datafile) os.remove(datafile)
raise e raise e
return (storage_id, datafile) return (storage_id, datafile)
@@ -131,6 +133,7 @@ class FileMailStorage(BaseMailStorage):
storage_id, datafile = self.add( storage_id, datafile = self.add(
data(), milter.qid, mailfrom, recipients, subject) data(), milter.qid, mailfrom, recipients, subject)
logger.info(f"stored message in file {datafile}") logger.info(f"stored message in file {datafile}")
milter.msginfo["storage_id"] = storage_id
def get_metadata(self, storage_id): def get_metadata(self, storage_id):
"Return metadata of email in storage." "Return metadata of email in storage."