diff --git a/README.md b/README.md index 3b57f90..eb3dddc 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,11 @@ The following configuration options are mandatory in each quarantine section: * **smtp_port** SMTP port +The following configuration options are optional in each quarantine section: +* **reject_reason** + Reason to return to the client if action is set to reject. + + ### Quarantine types * **NONE** Original e-mails scrapped, sent to nirvana, black-holed or however you want to call it. diff --git a/docs/pyquarantine.conf.example b/docs/pyquarantine.conf.example index 26f42bb..84f4faa 100644 --- a/docs/pyquarantine.conf.example +++ b/docs/pyquarantine.conf.example @@ -70,6 +70,12 @@ quarantine_directory = /var/lib/pyquarantine/spam # action = discard +# Option: reject_reason +# Notes: Optionally set the reason to return if action is set to reject. +# Values: [ REASON ] +# +reject_reason = Message rejected + # Option: notification # Notes: Set the notification type. # Values: [ email | none ] diff --git a/pyquarantine/__init__.py b/pyquarantine/__init__.py index 1363fa9..c7d8c54 100644 --- a/pyquarantine/__init__.py +++ b/pyquarantine/__init__.py @@ -181,6 +181,8 @@ class QuarantineMilter(Milter.Base): quarantine = self._get_preferred_quarantine() self.logger.info("{}: {} matching quarantine is '{}', performing milter action {}".format(self.queueid, self.global_config["preferred_quarantine_action"], quarantine["name"], quarantine["action"].upper())) + if quarantine["action"] == "reject": + self.setreply("554", "5.7.0", quarantine["reject_reason"]) return quarantine["milter_action"] return Milter.CONTINUE @@ -249,6 +251,8 @@ class QuarantineMilter(Milter.Base): quarantine = self._get_preferred_quarantine() self.logger.info("{}: {} matching quarantine is '{}', performing milter action {}".format(self.queueid, self.global_config["preferred_quarantine_action"], quarantine["name"], quarantine["action"].upper())) + if quarantine["action"] == "reject": + self.setreply("554", "5.7.0", quarantine["reject_reason"]) return quarantine["milter_action"] except Exception as e: @@ -314,6 +318,17 @@ def generate_milter_config(configtest=False, config_files=[]): if option not in config.keys(): raise RuntimeError("mandatory option '{}' not present in config section '{}' or 'global'".format(option, quarantine_name)) + # check if optional config options are present in config + defaults = { + "reject_reason": "Message rejected" + } + for option in defaults.keys(): + if option not in config.keys() and \ + option in global_config.keys(): + config[option] = global_config[option] + if option not in config.keys(): + config[option] = defaults[option] + # set quarantine name config["name"] = quarantine_name