From 543e51f7ee7643f5063fe59577361681232d7ae5 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Wed, 14 Mar 2018 07:20:59 +0100 Subject: [PATCH] mail/postfix: add version 1.1 from master --- mail/postfix/Makefile | 2 +- .../Postfix/Api/AntispamController.php | 90 +++----- .../OPNsense/Postfix/Api/DomainController.php | 195 +++--------------- .../Postfix/Api/RecipientController.php | 195 +++--------------- .../OPNsense/Postfix/Api/SenderController.php | 195 +++--------------- .../OPNsense/Postfix/forms/general.xml | 24 +++ .../app/models/OPNsense/Postfix/General.xml | 17 +- .../scripts/OPNsense/Postfix/setup.sh | 1 + .../templates/OPNsense/Postfix/+TARGETS | 1 + .../templates/OPNsense/Postfix/main.cf | 10 + .../templates/OPNsense/Postfix/smtp_auth | 9 + 11 files changed, 175 insertions(+), 564 deletions(-) create mode 100644 mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/smtp_auth diff --git a/mail/postfix/Makefile b/mail/postfix/Makefile index 59f8e173c..1fdb226dc 100644 --- a/mail/postfix/Makefile +++ b/mail/postfix/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= postfix -PLUGIN_VERSION= 1.0 +PLUGIN_VERSION= 1.1 PLUGIN_COMMENT= SMTP mail relay PLUGIN_DEPENDS= postfix-sasl PLUGIN_MAINTAINER= m.muenz@gmail.com diff --git a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/AntispamController.php b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/AntispamController.php index c9896d712..2889ce938 100644 --- a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/AntispamController.php +++ b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/AntispamController.php @@ -1,76 +1,38 @@ request->isGet()) { - $mdlAntispam = new Antispam(); - $result['antispam'] = $mdlAntispam->getNodes(); - } - return $result; - } - - public function setAction() - { - $result = array("result"=>"failed"); - if ($this->request->isPost()) { - // load model and update with provided data - $mdlAntispam = new Antispam(); - $mdlAntispam->setNodes($this->request->getPost("antispam")); - - // perform validation - $valMsgs = $mdlAntispam->performValidation(); - foreach ($valMsgs as $field => $msg) { - if (!array_key_exists("validations", $result)) { - $result["validations"] = array(); - } - $result["validations"]["antispam.".$msg->getField()] = $msg->getMessage(); - } - - // serialize model to config and save - if ($valMsgs->count() == 0) { - $mdlAntispam->serializeToConfig(); - Config::getInstance()->save(); - $result["result"] = "saved"; - } - } - return $result; - } + static protected $internalModelName = 'antispam'; + static protected $internalModelClass = '\OPNsense\Postfix\Antispam'; } diff --git a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/DomainController.php b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/DomainController.php index f449b9245..c05498bf4 100644 --- a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/DomainController.php +++ b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/DomainController.php @@ -1,205 +1,68 @@ request->isGet()) { - $mdlDomain = new Domain(); - $result['domain'] = $mdlDomain->getNodes(); - } - return $result; - } - - public function setAction() - { - $result = array("result"=>"failed"); - if ($this->request->isPost()) { - // load model and update with provided data - $mdlDomain = new Domain(); - $mdlDomain->setNodes($this->request->getPost("domain")); - // perform validation - $valMsgs = $mdlDomain->performValidation(); - foreach ($valMsgs as $field => $msg) { - if (!array_key_exists("validations", $result)) { - $result["validations"] = array(); - } - $result["validations"]["domain.".$msg->getField()] = $msg->getMessage(); - } - // serialize model to config and save - if ($valMsgs->count() == 0) { - $mdlDomain->serializeToConfig(); - Config::getInstance()->save(); - $result["result"] = "saved"; - } - } - return $result; - } - public function searchDomainAction() { - $this->sessionClose(); - $mdlDomain = $this->getModel(); - $grid = new UIModelGrid($mdlDomain->domains->domain); - return $grid->fetchBindRequest( - $this->request, - array("enabled", "domainname", "destination" ) - ); + return $this->searchBase('domains.domain', array("enabled", "domainname", "destination")); } public function getDomainAction($uuid = null) { - $mdlDomain = $this->getModel(); - if ($uuid != null) { - $node = $mdlDomain->getNodeByReference('domains.domain.' . $uuid); - if ($node != null) { - // return node - return array("domain" => $node->getNodes()); - } - } else { - $node = $mdlDomain->domains->domain->add(); - return array("domain" => $node->getNodes()); - } - return array(); + return $this->getBase('domain', 'domains.domain', $uuid); } public function addDomainAction() { - $result = array("result" => "failed"); - if ($this->request->isPost() && $this->request->hasPost("domain")) { - $result = array("result" => "failed", "validations" => array()); - $mdlDomain = $this->getModel(); - $node = $mdlDomain->domains->domain->Add(); - $node->setNodes($this->request->getPost("domain")); - $valMsgs = $mdlDomain->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "domain", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - unset($result['validations']); - // save config if validated correctly - $mdlDomain->serializeToConfig(); - Config::getInstance()->save(); - unset($result['validations']); - $result["result"] = "saved"; - } - } - return $result; + return $this->addBase('domain', 'domains.domain'); } public function delDomainAction($uuid) { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlDomain = $this->getModel(); - if ($uuid != null) { - if ($mdlDomain->domains->domain->del($uuid)) { - $mdlDomain->serializeToConfig(); - Config::getInstance()->save(); - $result['result'] = 'deleted'; - } else { - $result['result'] = 'not found'; - } - } - } - return $result; + return $this->delBase('domains.domain', $uuid); } public function setDomainAction($uuid) { - if ($this->request->isPost() && $this->request->hasPost("domain")) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference('domains.domain.' . $uuid); - if ($node != null) { - $result = array("result" => "failed", "validations" => array()); - $domainInfo = $this->request->getPost("domain"); - $node->setNodes($domainInfo); - $valMsgs = $mdlSetting->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "domain", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - // save config if validated correctly - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - $result = array("result" => "saved"); - } - return $result; - } - } - } - return array("result" => "failed"); - } - - public function toggle_handler($uuid, $elements, $element) - { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference($elements . '.'. $element .'.' . $uuid); - if ($node != null) { - if ($node->enabled->__toString() == "1") { - $result['result'] = "Disabled"; - $node->enabled = "0"; - } else { - $result['result'] = "Enabled"; - $node->enabled = "1"; - } - // if item has toggled, serialize to config and save - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - } - } - } - return $result; + return $this->setBase('domain', 'domains.domain', $uuid); } public function toggleDomainAction($uuid) { - return $this->toggle_handler($uuid, 'domains', 'domain'); + return $this->toggleBase('domains.domain', $uuid); } } diff --git a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/RecipientController.php b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/RecipientController.php index a37ae7ba1..fa6bafed2 100644 --- a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/RecipientController.php +++ b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/RecipientController.php @@ -1,205 +1,68 @@ request->isGet()) { - $mdlRecipient = new Recipient(); - $result['recipient'] = $mdlRecipient->getNodes(); - } - return $result; - } - - public function setAction() - { - $result = array("result"=>"failed"); - if ($this->request->isPost()) { - // load model and update with provided data - $mdlRecipient = new Recipient(); - $mdlRecipient->setNodes($this->request->getPost("recipient")); - // perform validation - $valMsgs = $mdlRecipient->performValidation(); - foreach ($valMsgs as $field => $msg) { - if (!array_key_exists("validations", $result)) { - $result["validations"] = array(); - } - $result["validations"]["recipient.".$msg->getField()] = $msg->getMessage(); - } - // serialize model to config and save - if ($valMsgs->count() == 0) { - $mdlRecipient->serializeToConfig(); - Config::getInstance()->save(); - $result["result"] = "saved"; - } - } - return $result; - } - public function searchRecipientAction() { - $this->sessionClose(); - $mdlRecipient = $this->getModel(); - $grid = new UIModelGrid($mdlRecipient->recipients->recipient); - return $grid->fetchBindRequest( - $this->request, - array("enabled", "address", "action" ) - ); + return $this->searchBase('recipients.recipient', array("enabled", "address", "action")); } public function getRecipientAction($uuid = null) { - $mdlRecipient = $this->getModel(); - if ($uuid != null) { - $node = $mdlRecipient->getNodeByReference('recipients.recipient.' . $uuid); - if ($node != null) { - // return node - return array("recipient" => $node->getNodes()); - } - } else { - $node = $mdlRecipient->recipients->recipient->add(); - return array("recipient" => $node->getNodes()); - } - return array(); + return $this->getBase('recipient', 'recipients.recipient', $uuid); } public function addRecipientAction() { - $result = array("result" => "failed"); - if ($this->request->isPost() && $this->request->hasPost("recipient")) { - $result = array("result" => "failed", "validations" => array()); - $mdlRecipient = $this->getModel(); - $node = $mdlRecipient->recipients->recipient->Add(); - $node->setNodes($this->request->getPost("recipient")); - $valMsgs = $mdlRecipient->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "recipient", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - unset($result['validations']); - // save config if validated correctly - $mdlRecipient->serializeToConfig(); - Config::getInstance()->save(); - unset($result['validations']); - $result["result"] = "saved"; - } - } - return $result; + return $this->addBase('recipient', 'recipients.recipient'); } public function delRecipientAction($uuid) { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlRecipient = $this->getModel(); - if ($uuid != null) { - if ($mdlRecipient->recipients->recipient->del($uuid)) { - $mdlRecipient->serializeToConfig(); - Config::getInstance()->save(); - $result['result'] = 'deleted'; - } else { - $result['result'] = 'not found'; - } - } - } - return $result; + return $this->delBase('recipients.recipient', $uuid); } public function setRecipientAction($uuid) { - if ($this->request->isPost() && $this->request->hasPost("recipient")) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference('recipients.recipient.' . $uuid); - if ($node != null) { - $result = array("result" => "failed", "validations" => array()); - $recipientInfo = $this->request->getPost("recipient"); - $node->setNodes($recipientInfo); - $valMsgs = $mdlSetting->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "recipient", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - // save config if validated correctly - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - $result = array("result" => "saved"); - } - return $result; - } - } - } - return array("result" => "failed"); - } - - public function toggle_handler($uuid, $elements, $element) - { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference($elements . '.'. $element .'.' . $uuid); - if ($node != null) { - if ($node->enabled->__toString() == "1") { - $result['result'] = "Disabled"; - $node->enabled = "0"; - } else { - $result['result'] = "Enabled"; - $node->enabled = "1"; - } - // if item has toggled, serialize to config and save - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - } - } - } - return $result; + return $this->setBase('recipient', 'recipients.recipient', $uuid); } public function toggleRecipientAction($uuid) { - return $this->toggle_handler($uuid, 'recipients', 'recipient'); + return $this->toggleBase('recipients.recipient', $uuid); } } diff --git a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/SenderController.php b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/SenderController.php index 0dded2fed..df36c827d 100644 --- a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/SenderController.php +++ b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/Api/SenderController.php @@ -1,205 +1,68 @@ request->isGet()) { - $mdlSender = new Sender(); - $result['sender'] = $mdlSender->getNodes(); - } - return $result; - } - - public function setAction() - { - $result = array("result"=>"failed"); - if ($this->request->isPost()) { - // load model and update with provided data - $mdlSender = new Sender(); - $mdlSender->setNodes($this->request->getPost("sender")); - // perform validation - $valMsgs = $mdlSender->performValidation(); - foreach ($valMsgs as $field => $msg) { - if (!array_key_exists("validations", $result)) { - $result["validations"] = array(); - } - $result["validations"]["sender.".$msg->getField()] = $msg->getMessage(); - } - // serialize model to config and save - if ($valMsgs->count() == 0) { - $mdlSender->serializeToConfig(); - Config::getInstance()->save(); - $result["result"] = "saved"; - } - } - return $result; - } - public function searchSenderAction() { - $this->sessionClose(); - $mdlSender = $this->getModel(); - $grid = new UIModelGrid($mdlSender->senders->sender); - return $grid->fetchBindRequest( - $this->request, - array("enabled", "address", "action" ) - ); + return $this->searchBase('senders.sender', array("enabled", "address", "action")); } public function getSenderAction($uuid = null) { - $mdlSender = $this->getModel(); - if ($uuid != null) { - $node = $mdlSender->getNodeByReference('senders.sender.' . $uuid); - if ($node != null) { - // return node - return array("sender" => $node->getNodes()); - } - } else { - $node = $mdlSender->senders->sender->add(); - return array("sender" => $node->getNodes()); - } - return array(); + return $this->getBase('sender', 'senders.sender', $uuid); } public function addSenderAction() { - $result = array("result" => "failed"); - if ($this->request->isPost() && $this->request->hasPost("sender")) { - $result = array("result" => "failed", "validations" => array()); - $mdlSender = $this->getModel(); - $node = $mdlSender->senders->sender->Add(); - $node->setNodes($this->request->getPost("sender")); - $valMsgs = $mdlSender->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "sender", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - unset($result['validations']); - // save config if validated correctly - $mdlSender->serializeToConfig(); - Config::getInstance()->save(); - unset($result['validations']); - $result["result"] = "saved"; - } - } - return $result; + return $this->addBase('sender', 'senders.sender'); } public function delSenderAction($uuid) { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlSender = $this->getModel(); - if ($uuid != null) { - if ($mdlSender->senders->sender->del($uuid)) { - $mdlSender->serializeToConfig(); - Config::getInstance()->save(); - $result['result'] = 'deleted'; - } else { - $result['result'] = 'not found'; - } - } - } - return $result; + return $this->delBase('senders.sender', $uuid); } public function setSenderAction($uuid) { - if ($this->request->isPost() && $this->request->hasPost("sender")) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference('senders.sender.' . $uuid); - if ($node != null) { - $result = array("result" => "failed", "validations" => array()); - $senderInfo = $this->request->getPost("sender"); - $node->setNodes($senderInfo); - $valMsgs = $mdlSetting->performValidation(); - foreach ($valMsgs as $field => $msg) { - $fieldnm = str_replace($node->__reference, "sender", $msg->getField()); - $result["validations"][$fieldnm] = $msg->getMessage(); - } - if (count($result['validations']) == 0) { - // save config if validated correctly - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - $result = array("result" => "saved"); - } - return $result; - } - } - } - return array("result" => "failed"); - } - - public function toggle_handler($uuid, $elements, $element) - { - $result = array("result" => "failed"); - if ($this->request->isPost()) { - $mdlSetting = $this->getModel(); - if ($uuid != null) { - $node = $mdlSetting->getNodeByReference($elements . '.'. $element .'.' . $uuid); - if ($node != null) { - if ($node->enabled->__toString() == "1") { - $result['result'] = "Disabled"; - $node->enabled = "0"; - } else { - $result['result'] = "Enabled"; - $node->enabled = "1"; - } - // if item has toggled, serialize to config and save - $mdlSetting->serializeToConfig(); - Config::getInstance()->save(); - } - } - } - return $result; + return $this->setBase('sender', 'senders.sender', $uuid); } public function toggleSenderAction($uuid) { - return $this->toggle_handler($uuid, 'senders', 'sender'); + return $this->toggleBase('senders.sender', $uuid); } } diff --git a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/forms/general.xml b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/forms/general.xml index e6eb63bb6..0a7480b50 100644 --- a/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/forms/general.xml +++ b/mail/postfix/src/opnsense/mvc/app/controllers/OPNsense/Postfix/forms/general.xml @@ -79,6 +79,30 @@ dropdown Choose "none" to disable TLS for sending mail. Set encrypt to enforce TLS security, please do not use this for Internet wide communication as not every server supports TLS yet. Default is "may" which will use TLS when offered. + + general.relayhost + + text + Set the IP address or FQDN where all outgoung mails are sent to. + + + general.smtpauth_enabled + + checkbox + Check this to enable authentication against your Smarthost. + + + general.smtpauth_user + + text + The username to use for SMTP authentication. + + + general.smtpauth_password + + password + The password to use for SMTP authentication. + general.reject_unauth_pipelining diff --git a/mail/postfix/src/opnsense/mvc/app/models/OPNsense/Postfix/General.xml b/mail/postfix/src/opnsense/mvc/app/models/OPNsense/Postfix/General.xml index 865f8bf8e..ef3ec6dbd 100644 --- a/mail/postfix/src/opnsense/mvc/app/models/OPNsense/Postfix/General.xml +++ b/mail/postfix/src/opnsense/mvc/app/models/OPNsense/Postfix/General.xml @@ -1,7 +1,7 @@ //OPNsense/postfix/general Postfix configuration - 1.0.0 + 1.1.0 0 @@ -60,6 +60,21 @@ encrypt + + N + + + 0 + Y + + + + N + + + + N + 1 Y diff --git a/mail/postfix/src/opnsense/scripts/OPNsense/Postfix/setup.sh b/mail/postfix/src/opnsense/scripts/OPNsense/Postfix/setup.sh index 6361465ed..a907a1d71 100755 --- a/mail/postfix/src/opnsense/scripts/OPNsense/Postfix/setup.sh +++ b/mail/postfix/src/opnsense/scripts/OPNsense/Postfix/setup.sh @@ -30,6 +30,7 @@ chown -R root:postfix /var/spool/postfix/pid postmap /usr/local/etc/postfix/transport postmap /usr/local/etc/postfix/recipient_access postmap /usr/local/etc/postfix/sender_access +postmap /usr/local/etc/postfix/smtp_auth # Check for aliases if [ -f /usr/local/etc/postfix/aliases ]; then diff --git a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/+TARGETS b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/+TARGETS index 3cbe5f21d..dc01e21fd 100644 --- a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/+TARGETS +++ b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/+TARGETS @@ -4,3 +4,4 @@ postfix:/etc/rc.conf.d/postfix transport:/usr/local/etc/postfix/transport recipient_access:/usr/local/etc/postfix/recipient_access sender_access:/usr/local/etc/postfix/sender_access +smtp_auth:/usr/local/etc/postfix/smtp_auth diff --git a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf index 58721a9b2..58a9d1abe 100644 --- a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf +++ b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/main.cf @@ -88,6 +88,16 @@ smtpd_tls_cert_file = /usr/local/etc/postfix/cert_opn.pem smtpd_tls_CAfile = /usr/local/etc/postfix/ca_opn.pem {% endif %} +{% if helpers.exists('OPNsense.postfix.general.relayhost') and OPNsense.postfix.general.relayhost != '' %} +relayhost = {{ OPNsense.postfix.general.relayhost }} +{% endif %} + +{% if helpers.exists('OPNsense.postfix.general.smtpauth_enabled') and OPNsense.postfix.general.smtpauth_enabled != '' %} +smtp_sasl_auth_enable = yes +smtp_sasl_password_maps = hash:/usr/local/etc/postfix/smtp_auth +smtp_sasl_security_options = +{% endif %} + {% if helpers.exists('OPNsense.postfix.antispam.enable_rspamd') and OPNsense.postfix.antispam.enable_rspamd == '1' %} smtpd_milters = inet:localhost:11332 non_smtpd_milters = inet:localhost:11332 diff --git a/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/smtp_auth b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/smtp_auth new file mode 100644 index 000000000..9bca91917 --- /dev/null +++ b/mail/postfix/src/opnsense/service/templates/OPNsense/Postfix/smtp_auth @@ -0,0 +1,9 @@ +{% if helpers.exists('OPNsense.postfix.general.enabled') and OPNsense.postfix.general.enabled == '1' %} +{% if helpers.exists('OPNsense.postfix.general.smtpauth_enabled') and OPNsense.postfix.general.smtpauth_enabled == '1' %} +{% if helpers.exists('OPNsense.postfix.general.smtpauth_user') and OPNsense.postfix.general.smtpauth_user != '' %} +{% if helpers.exists('OPNsense.postfix.general.smtpauth_password') and OPNsense.postfix.general.smtpauth_password != '' %} +{{ OPNsense.postfix.general.relayhost }} {{ OPNsense.postfix.general.smtpauth_user }}:{{ OPNsense.postfix.general.smtpauth_password }} +{% endif %} +{% endif %} +{% endif %} +{% endif %}