diff --git a/pymodmilter/__init__.py b/pymodmilter/__init__.py index 86ad245..fcca40f 100644 --- a/pymodmilter/__init__.py +++ b/pymodmilter/__init__.py @@ -253,11 +253,12 @@ class ModifyMilter(Milter.Base): self._headersonly = True for rule in ModifyMilter._rules: if rule.conditions is None or \ - rule.conditions.match(host=self.IP): + rule.conditions.match(host=self.IP, qid=self.qid): actions = [] for action in rule.actions: if action.conditions is None or \ - action.conditions.match(host=self.IP): + action.conditions.match(host=self.IP, + qid=self.qid): actions.append(action) if not action.headersonly(): self._headersonly = False diff --git a/pymodmilter/action.py b/pymodmilter/action.py index b3c09e3..ecbd880 100644 --- a/pymodmilter/action.py +++ b/pymodmilter/action.py @@ -18,9 +18,10 @@ __all__ = [ import os -from pymodmilter import CustomLogger, BaseConfig -from pymodmilter.conditions import ConditionsConfig, Conditions +from pymodmilter import BaseConfig from pymodmilter import modify, notify, storage +from pymodmilter.base import CustomLogger +from pymodmilter.conditions import ConditionsConfig, Conditions class ActionConfig(BaseConfig): @@ -173,8 +174,6 @@ class Action: """Action to implement a pre-configured action to perform on e-mails.""" def __init__(self, milter_cfg, cfg): - self.logger = cfg.logger - if cfg["conditions"] is None: self.conditions = None else: @@ -184,6 +183,7 @@ class Action: self._name = cfg["name"] self._class = cfg["class"](**cfg["args"]) self._headersonly = cfg["headersonly"] + self.logger = cfg.logger def headersonly(self): """Return the needs of this action.""" @@ -191,11 +191,12 @@ class Action: def execute(self, milter): """Execute configured action.""" + logger = CustomLogger( + self.logger, {"qid": milter.qid, "name": self._name}) 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}) + headers=milter.msg.items(), + qid=milter.qid): return self._class.execute( milter=milter, pretend=self.pretend, logger=logger) diff --git a/pymodmilter/conditions.py b/pymodmilter/conditions.py index b47d78c..99bad32 100644 --- a/pymodmilter/conditions.py +++ b/pymodmilter/conditions.py @@ -19,7 +19,7 @@ __all__ = [ import re from netaddr import IPAddress, IPNetwork, AddrFormatError -from pymodmilter import CustomLogger, BaseConfig +from pymodmilter import BaseConfig, CustomLogger class ConditionsConfig(BaseConfig): @@ -76,14 +76,19 @@ class Conditions: """Conditions to implement conditions for rules and actions.""" def __init__(self, milter_cfg, cfg): - self.logger = cfg.logger - self._local_addrs = milter_cfg["local_addrs"] self._name = cfg["name"] self._args = cfg["args"] + self.logger = cfg.logger + + def match(self, host=None, envfrom=None, envto=None, headers=None, + qid=None): + if qid is None: + logger = self.logger + else: + logger = CustomLogger( + self.logger, {"qid": qid, "name": self._name}) - def match(self, host=None, envfrom=None, envto=None, headers=None): - logger = CustomLogger(self.logger, {"name": self._name}) if host: ip = IPAddress(host) diff --git a/pymodmilter/notify.py b/pymodmilter/notify.py index e517b6d..72fc685 100644 --- a/pymodmilter/notify.py +++ b/pymodmilter/notify.py @@ -268,7 +268,7 @@ class EMailNotification(BaseNotification): "FROM": escape(msg["from"], quote=False), "ENVELOPE_FROM": escape(mailfrom, quote=False), "ENVELOPE_FROM_URL": escape(quote(mailfrom), - quote=False), + quote=False), "TO": escape(msg["to"], quote=False), "ENVELOPE_TO": escape(recipient, quote=False), "ENVELOPE_TO_URL": escape(quote(recipient)), diff --git a/pymodmilter/rule.py b/pymodmilter/rule.py index 3b7ebce..fae266d 100644 --- a/pymodmilter/rule.py +++ b/pymodmilter/rule.py @@ -88,7 +88,8 @@ class Rule: if self.conditions is None or \ self.conditions.match(envfrom=milter.mailfrom, envto=[*milter.rcpts], - headers=milter.msg.items()): + headers=milter.msg.items(), + qid=milter.qid): for action in self.actions: milter_action = action.execute(milter) if milter_action is not None: