diff --git a/pymodmilter/__init__.py b/pymodmilter/__init__.py index f54d680..725d291 100644 --- a/pymodmilter/__init__.py +++ b/pymodmilter/__init__.py @@ -336,7 +336,8 @@ class ModifyMilter(Milter.Base): refold_source='none')) self.msginfo = { "mailfrom": self.mailfrom, - "rcpts": self.rcpts} + "rcpts": self.rcpts, + "storage_id": None} self._replacebody = False milter_action = None diff --git a/pymodmilter/actions.py b/pymodmilter/actions.py index ebe7d78..b082876 100644 --- a/pymodmilter/actions.py +++ b/pymodmilter/actions.py @@ -176,6 +176,10 @@ class ActionConfig(BaseConfig): f"{self['name']}: file quarantine directory " f"'{self['directory']}' does not exist or is " f"not writable") + + if "skip_metadata" in cfg: + self.add_bool_arg(cfg, "skip_metadata") + else: raise RuntimeError( f"{self['name']}: storage_type: invalid storage type") @@ -217,12 +221,11 @@ class Action: def execute(self, milter): """Execute configured action.""" - logger = CustomLogger( - self.logger, {"name": self._name, "qid": milter.qid}) - if self.conditions is None or \ self.conditions.match(envfrom=milter.mailfrom, envto=[*milter.rcpts], headers=milter.msg.items()): + logger = CustomLogger( + self.logger, {"name": self._name, "qid": milter.qid}) return self._class.execute( milter=milter, pretend=self.pretend, logger=logger) diff --git a/pymodmilter/storages.py b/pymodmilter/storages.py index 8376cbd..07fcd50 100644 --- a/pymodmilter/storages.py +++ b/pymodmilter/storages.py @@ -50,10 +50,11 @@ class BaseMailStorage(object): class FileMailStorage(BaseMailStorage): "Storage class to store mails on filesystem." - def __init__(self, directory, original=False): + def __init__(self, directory, original=False, skip_metadata=False): super().__init__() self.directory = directory self.original = original + self.skip_metadata = skip_metadata self._metadata_suffix = ".metadata" def _save_datafile(self, storage_id, data): @@ -98,19 +99,20 @@ class FileMailStorage(BaseMailStorage): # save mail datafile = self._save_datafile(storage_id, data) - # save metadata - metadata = { - "mailfrom": mailfrom, - "recipients": recipients, - "subject": subject, - "timestamp": timegm(gmtime()), - "queue_id": qid} + if not self.skip_metadata: + # save metadata + metadata = { + "mailfrom": mailfrom, + "recipients": recipients, + "subject": subject, + "timestamp": timegm(gmtime()), + "queue_id": qid} - try: - self._save_metafile(storage_id, metadata) - except RuntimeError as e: - os.remove(datafile) - raise e + try: + self._save_metafile(storage_id, metadata) + except RuntimeError as e: + os.remove(datafile) + raise e return (storage_id, datafile) @@ -131,6 +133,7 @@ class FileMailStorage(BaseMailStorage): storage_id, datafile = self.add( data(), milter.qid, mailfrom, recipients, subject) logger.info(f"stored message in file {datafile}") + milter.msginfo["storage_id"] = storage_id def get_metadata(self, storage_id): "Return metadata of email in storage."