From 31199e18782daf4083bb6877cb7c1dd39f085bcd Mon Sep 17 00:00:00 2001
From: Jesse Norell <jesse@kci.net>
Date: Tue, 12 Jan 2021 16:41:09 -0700
Subject: [PATCH] implement per-domain mail relaying

---
 install/dist/lib/fedora.lib.php               | 56 ++-----------------
 install/dist/lib/gentoo.lib.php               |  3 +
 install/dist/lib/opensuse.lib.php             | 53 ++----------------
 install/lib/installer_base.lib.php            | 56 ++-----------------
 .../sql/incremental/upd_dev_collection.sql    |  4 ++
 install/sql/ispconfig3.sql                    |  3 +
 install/tpl/debian_postfix.conf.master        |  8 ++-
 install/tpl/fedora_postfix.conf.master        |  8 ++-
 install/tpl/gentoo_postfix.conf.master        |  8 ++-
 .../mysql-virtual_sender-relayauth.cf.master  | 10 ++++
 .../mysql-virtual_sender-relayhost.cf.master  | 10 ++++
 install/tpl/opensuse_postfix.conf.master      |  8 ++-
 interface/web/mail/form/mail_domain.tform.php | 24 ++++++++
 .../web/mail/lib/lang/ar_mail_domain.lng      |  6 +-
 .../web/mail/lib/lang/bg_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/br_mail_domain.lng      |  3 +
 .../web/mail/lib/lang/ca_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/cz_mail_domain.lng      |  3 +
 .../web/mail/lib/lang/de_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/dk_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/el_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/en_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/es_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/fi_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/fr_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/hr_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/hu_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/id_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/it_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/ja_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/nl_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/pl_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/pt_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/ro_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/ru_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/se_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/sk_mail_domain.lng      |  4 +-
 .../web/mail/lib/lang/tr_mail_domain.lng      |  4 +-
 interface/web/mail/mail_domain_edit.php       |  7 +++
 .../web/mail/templates/mail_domain_edit.htm   | 18 ++++++
 40 files changed, 198 insertions(+), 178 deletions(-)
 create mode 100644 install/tpl/mysql-virtual_sender-relayauth.cf.master
 create mode 100644 install/tpl/mysql-virtual_sender-relayhost.cf.master

diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php
index 9620bf3561..fdb6c2e717 100644
--- a/install/dist/lib/fedora.lib.php
+++ b/install/dist/lib/fedora.lib.php
@@ -57,58 +57,12 @@ class installer_dist extends installer_base {
 			$this->error("The postfix configuration directory '$config_dir' does not exist.");
 		}
 
-		//* mysql-virtual_domains.cf
-		$this->process_postfix_config('mysql-virtual_domains.cf');
-
-		//* mysql-virtual_forwardings.cf
-		$this->process_postfix_config('mysql-virtual_forwardings.cf');
-
-		//* mysql-virtual_alias_domains.cf
-		$this->process_postfix_config('mysql-virtual_alias_domains.cf');
-
-		//* mysql-virtual_alias_maps.cf
-		$this->process_postfix_config('mysql-virtual_alias_maps.cf');
-
-		//* mysql-virtual_mailboxes.cf
-		$this->process_postfix_config('mysql-virtual_mailboxes.cf');
-
-		//* mysql-virtual_email2email.cf
-		$this->process_postfix_config('mysql-virtual_email2email.cf');
-
-		//* mysql-virtual_transports.cf
-		$this->process_postfix_config('mysql-virtual_transports.cf');
-
-		//* mysql-virtual_recipient.cf
-		$this->process_postfix_config('mysql-virtual_recipient.cf');
-
-		//* mysql-virtual_sender.cf
-		$this->process_postfix_config('mysql-virtual_sender.cf');
-
-		//* mysql-virtual_sender_login_maps.cf
-		$this->process_postfix_config('mysql-virtual_sender_login_maps.cf');
-
-		//* mysql-virtual_client.cf
-		$this->process_postfix_config('mysql-virtual_client.cf');
-
-		//* mysql-virtual_relaydomains.cf
-		$this->process_postfix_config('mysql-virtual_relaydomains.cf');
-
-		//* mysql-virtual_relayrecipientmaps.cf
-		$this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf');
-
-		//* mysql-virtual_outgoing_bcc.cf
-		$this->process_postfix_config('mysql-virtual_outgoing_bcc.cf');
-
-		//* mysql-virtual_policy_greylist.cf
-		$this->process_postfix_config('mysql-virtual_policy_greylist.cf');
-
-		//* mysql-virtual_gids.cf.master
-		$this->process_postfix_config('mysql-virtual_gids.cf');
-
-		//* mysql-virtual_uids.cf
-		$this->process_postfix_config('mysql-virtual_uids.cf');
+		//* Install virtual mappings
+		foreach (glob('tpl/mysql-virtual_*.master') as $filename) {
+			$this->process_postfix_config( basename($filename, '.master') );
+		}
 
-		//* mysql-virtual_alias_domains.cf
+		//* mysql-verify_recipients.cf
 		$this->process_postfix_config('mysql-verify_recipients.cf');
 
 		//* postfix-dkim
diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php
index f719fbee38..1bd58e0c38 100644
--- a/install/dist/lib/gentoo.lib.php
+++ b/install/dist/lib/gentoo.lib.php
@@ -63,6 +63,9 @@ class installer extends installer_base
 			$this->process_postfix_config( basename($filename, '.master') );
 		}
 
+		//* mysql-verify_recipients.cf
+		$this->process_postfix_config('mysql-verify_recipients.cf');
+
 		//* Changing mode and group of the new created config files.
 		caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null',
 			__FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed');
diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php
index b9e3a1c575..7332db1699 100644
--- a/install/dist/lib/opensuse.lib.php
+++ b/install/dist/lib/opensuse.lib.php
@@ -57,55 +57,12 @@ class installer_dist extends installer_base {
 			$this->error("The postfix configuration directory '$config_dir' does not exist.");
 		}
 
-		//* mysql-virtual_domains.cf
-		$this->process_postfix_config('mysql-virtual_domains.cf');
-
-		//* mysql-virtual_forwardings.cf
-		$this->process_postfix_config('mysql-virtual_forwardings.cf');
-
-		//* mysql-virtual_alias_domains.cf
-		$this->process_postfix_config('mysql-virtual_alias_domains.cf');
-
-		//* mysql-virtual_alias_maps.cf
-		$this->process_postfix_config('mysql-virtual_alias_maps.cf');
-
-		//* mysql-virtual_mailboxes.cf
-		$this->process_postfix_config('mysql-virtual_mailboxes.cf');
-
-		//* mysql-virtual_email2email.cf
-		$this->process_postfix_config('mysql-virtual_email2email.cf');
-
-		//* mysql-virtual_transports.cf
-		$this->process_postfix_config('mysql-virtual_transports.cf');
-
-		//* mysql-virtual_recipient.cf
-		$this->process_postfix_config('mysql-virtual_recipient.cf');
-
-		//* mysql-virtual_sender.cf
-		$this->process_postfix_config('mysql-virtual_sender.cf');
-
-		//* mysql-virtual_sender_login_maps.cf
-		$this->process_postfix_config('mysql-virtual_sender_login_maps.cf');
-
-		//* mysql-virtual_client.cf
-		$this->process_postfix_config('mysql-virtual_client.cf');
-
-		//* mysql-virtual_relaydomains.cf
-		$this->process_postfix_config('mysql-virtual_relaydomains.cf');
-
-		//* mysql-virtual_relayrecipientmaps.cf
-		$this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf');
-
-		//* mysql-virtual_policy_greylist.cf
-		$this->process_postfix_config('mysql-virtual_policy_greylist.cf');
-
-		//* mysql-virtual_gids.cf.master
-		$this->process_postfix_config('mysql-virtual_gids.cf');
-
-		//* mysql-virtual_uids.cf
-		$this->process_postfix_config('mysql-virtual_uids.cf');
+		//* Install virtual mappings
+		foreach (glob('tpl/mysql-virtual_*.master') as $filename) {
+			$this->process_postfix_config( basename($filename, '.master') );
+		}
 
-		//* mysql-virtual_alias_domains.cf
+		//* mysql-verify_recipients.cf
 		$this->process_postfix_config('mysql-verify_recipients.cf');
 
 		//* postfix-dkim
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 688fd32a83..16fe665fca 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -1060,58 +1060,12 @@ class installer_base {
 		$postfix_version = preg_replace('/.*=\s*/', '', $out[0]);
 		unset($out);
 
-		//* mysql-virtual_domains.cf
-		$this->process_postfix_config('mysql-virtual_domains.cf');
-
-		//* mysql-virtual_forwardings.cf
-		$this->process_postfix_config('mysql-virtual_forwardings.cf');
-
-		//* mysql-virtual_alias_domains.cf
-		$this->process_postfix_config('mysql-virtual_alias_domains.cf');
-
-		//* mysql-virtual_alias_maps.cf
-		$this->process_postfix_config('mysql-virtual_alias_maps.cf');
-
-		//* mysql-virtual_mailboxes.cf
-		$this->process_postfix_config('mysql-virtual_mailboxes.cf');
-
-		//* mysql-virtual_email2email.cf
-		$this->process_postfix_config('mysql-virtual_email2email.cf');
-
-		//* mysql-virtual_transports.cf
-		$this->process_postfix_config('mysql-virtual_transports.cf');
-
-		//* mysql-virtual_recipient.cf
-		$this->process_postfix_config('mysql-virtual_recipient.cf');
-
-		//* mysql-virtual_sender.cf
-		$this->process_postfix_config('mysql-virtual_sender.cf');
-
-		//* mysql-virtual_sender_login_maps.cf
-		$this->process_postfix_config('mysql-virtual_sender_login_maps.cf');
-
-		//* mysql-virtual_client.cf
-		$this->process_postfix_config('mysql-virtual_client.cf');
-
-		//* mysql-virtual_relaydomains.cf
-		$this->process_postfix_config('mysql-virtual_relaydomains.cf');
-
-		//* mysql-virtual_relayrecipientmaps.cf
-		$this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf');
-
-		//* mysql-virtual_outgoing_bcc.cf
-		$this->process_postfix_config('mysql-virtual_outgoing_bcc.cf');
-
-		//* mysql-virtual_policy_greylist.cf
-		$this->process_postfix_config('mysql-virtual_policy_greylist.cf');
-
-		//* mysql-virtual_gids.cf.master
-		$this->process_postfix_config('mysql-virtual_gids.cf');
-
-		//* mysql-virtual_uids.cf
-		$this->process_postfix_config('mysql-virtual_uids.cf');
+		//* Install virtual mappings
+		foreach (glob('tpl/mysql-virtual_*.master') as $filename) {
+			$this->process_postfix_config( basename($filename, '.master') );
+		}
 
-		//* mysql-virtual_alias_domains.cf
+		//* mysql-verify_recipients.cf
 		$this->process_postfix_config('mysql-verify_recipients.cf');
 
 		// test if lmtp if available
diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql
index 90f8139c60..02a588cc88 100644
--- a/install/sql/incremental/upd_dev_collection.sql
+++ b/install/sql/incremental/upd_dev_collection.sql
@@ -7,3 +7,7 @@ ALTER TABLE mail_access DROP CONSTRAINT `server_id`;
 SET SESSION old_alter_table=1;
 ALTER IGNORE TABLE mail_access ADD UNIQUE KEY `unique_source` (`server_id`,`source`,`type`);
 SET SESSION old_alter_table=0;
+
+ALTER TABLE mail_domain ADD COLUMN `relay_host` varchar(255) NOT NULL default '' AFTER `dkim_public`,
+  ADD COLUMN `relay_user` varchar(255) NOT NULL default '' AFTER `relay_host`,
+  ADD COLUMN `relay_pass` varchar(255) NOT NULL default '' AFTER `relay_user`;
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index baeb079219..587df55382 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -884,6 +884,9 @@ CREATE TABLE `mail_domain` (
   `dkim_selector` varchar(63) NOT NULL DEFAULT 'default',
   `dkim_private` mediumtext NULL,
   `dkim_public` mediumtext NULL,
+  `relay_host` varchar(255) NOT NULL DEFAULT '',
+  `relay_user` varchar(255) NOT NULL DEFAULT '',
+  `relay_pass` varchar(255) NOT NULL DEFAULT '',
   `active` enum('n','y') NOT NULL DEFAULT 'n',
   PRIMARY KEY  (`domain_id`),
   KEY `server_id` (`server_id`,`domain`),
diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master
index 24b1e154cf..42bb3f1510 100644
--- a/install/tpl/debian_postfix.conf.master
+++ b/install/tpl/debian_postfix.conf.master
@@ -24,7 +24,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf
 relay_domains = proxy:mysql:{config_dir}/mysql-virtual_relaydomains.cf
 relay_recipient_maps = proxy:mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
 smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf
-proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions
+proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions $smtp_sasl_password_maps $sender_dependent_relayhost_maps
 smtpd_helo_required = yes
 smtpd_helo_restrictions = permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo, {reject_unknown_helo_hostname}, permit
 smtpd_sender_restrictions = check_sender_access proxy:mysql:{config_dir}/mysql-virtual_sender.cf, {reject_aslm} check_sender_access regexp:{config_dir}/tag_as_originating.re, permit_mynetworks{reject_slm}, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:{config_dir}/tag_as_foreign.re
@@ -53,3 +53,9 @@ tls_preempt_cipherlist = yes
 address_verify_negative_refresh_time=60s
 # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp):
 enable_original_recipient = yes
+sender_dependent_relayhost_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayhost.cf
+smtp_sasl_password_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayauth.cf, hash:{config_dir}/sasl_passwd
+smtp_sender_dependent_authentication = yes
+smtp_sasl_auth_enable = yes
+smtp_sasl_security_options = noanonymous, noplaintext
+smtp_sasl_tls_security_options = noanonymous
diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master
index 04690bff70..dd232b6d6d 100644
--- a/install/tpl/fedora_postfix.conf.master
+++ b/install/tpl/fedora_postfix.conf.master
@@ -20,7 +20,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf
 relay_domains = proxy:mysql:{config_dir}/mysql-virtual_relaydomains.cf
 relay_recipient_maps = proxy:mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
 smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf
-proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions
+proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions $smtp_sasl_password_maps $sender_dependent_relayhost_maps
 smtpd_helo_required = yes
 smtpd_helo_restrictions = permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo, {reject_unknown_helo_hostname}, permit
 smtpd_sender_restrictions = check_sender_access proxy:mysql:{config_dir}/mysql-virtual_sender.cf, {reject_aslm} check_sender_access regexp:{config_dir}/tag_as_originating.re, permit_mynetworks{reject_slm}, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:{config_dir}/tag_as_foreign.re
@@ -49,3 +49,9 @@ tls_preempt_cipherlist = yes
 address_verify_negative_refresh_time=60s
 # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp):
 enable_original_recipient = yes
+sender_dependent_relayhost_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayhost.cf
+smtp_sasl_password_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayauth.cf, hash:{config_dir}/sasl_passwd
+smtp_sender_dependent_authentication = yes
+smtp_sasl_auth_enable = yes
+smtp_sasl_security_options = noanonymous, noplaintext
+smtp_sasl_tls_security_options = noanonymous
diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master
index 7ee0c83568..7c337bbb5d 100644
--- a/install/tpl/gentoo_postfix.conf.master
+++ b/install/tpl/gentoo_postfix.conf.master
@@ -19,7 +19,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf
 relay_domains = proxy:mysql:{config_dir}/mysql-virtual_relaydomains.cf
 relay_recipient_maps = proxy:mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
 smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf
-proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions
+proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions $smtp_sasl_password_maps $sender_dependent_relayhost_maps
 smtpd_helo_required = yes
 smtpd_helo_restrictions = permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo, {reject_unknown_helo_hostname}, permit
 smtpd_sender_restrictions = check_sender_access proxy:mysql:{config_dir}/mysql-virtual_sender.cf, {reject_aslm} check_sender_access regexp:{config_dir}/tag_as_originating.re, permit_mynetworks{reject_slm}, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:{config_dir}/tag_as_foreign.re
@@ -48,3 +48,9 @@ tls_preempt_cipherlist = yes
 address_verify_negative_refresh_time=60s
 # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp):
 enable_original_recipient = yes
+sender_dependent_relayhost_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayhost.cf
+smtp_sasl_password_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayauth.cf, hash:{config_dir}/sasl_passwd
+smtp_sender_dependent_authentication = yes
+smtp_sasl_auth_enable = yes
+smtp_sasl_security_options = noanonymous, noplaintext
+smtp_sasl_tls_security_options = noanonymous
diff --git a/install/tpl/mysql-virtual_sender-relayauth.cf.master b/install/tpl/mysql-virtual_sender-relayauth.cf.master
new file mode 100644
index 0000000000..413607c763
--- /dev/null
+++ b/install/tpl/mysql-virtual_sender-relayauth.cf.master
@@ -0,0 +1,10 @@
+user = {mysql_server_ispconfig_user}
+password = {mysql_server_ispconfig_password}
+dbname = {mysql_server_database}
+hosts = {mysql_server_ip}
+query = SELECT CONCAT(relay_user,':',relay_pass) as credential
+  FROM mail_domain
+  WHERE domain = '%d'
+  AND active = 'y'
+  AND concat(relay_host,relay_user,relay_pass) != ''
+  AND server_id = {server_id}
diff --git a/install/tpl/mysql-virtual_sender-relayhost.cf.master b/install/tpl/mysql-virtual_sender-relayhost.cf.master
new file mode 100644
index 0000000000..3bb4c81330
--- /dev/null
+++ b/install/tpl/mysql-virtual_sender-relayhost.cf.master
@@ -0,0 +1,10 @@
+user = {mysql_server_ispconfig_user}
+password = {mysql_server_ispconfig_password}
+dbname = {mysql_server_database}
+hosts = {mysql_server_ip}
+query = SELECT relay_host as relayhost
+  FROM mail_domain
+  WHERE domain = '%d'
+  AND active = 'y'
+  AND concat(relay_host,relay_user,relay_pass) != ''
+  AND server_id = {server_id}
diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master
index 8ee01580be..c7c282ca14 100644
--- a/install/tpl/opensuse_postfix.conf.master
+++ b/install/tpl/opensuse_postfix.conf.master
@@ -22,7 +22,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf
 relay_domains = proxy:mysql:{config_dir}/mysql-virtual_relaydomains.cf
 relay_recipient_maps = proxy:mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
 smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf
-proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions
+proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $virtual_uid_maps $virtual_gid_maps $smtpd_client_restrictions $smtpd_sender_restrictions $smtpd_recipient_restrictions $smtp_sasl_password_maps $sender_dependent_relayhost_maps
 smtpd_helo_required = yes
 smtpd_helo_restrictions = permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo, {reject_unknown_helo_hostname}, permit
 smtpd_sender_restrictions = check_sender_access proxy:mysql:{config_dir}/mysql-virtual_sender.cf, {reject_aslm} check_sender_access regexp:{config_dir}/tag_as_originating.re, permit_mynetworks{reject_slm}, permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:{config_dir}/tag_as_foreign.re
@@ -51,3 +51,9 @@ tls_preempt_cipherlist = yes
 address_verify_negative_refresh_time=60s
 # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp):
 enable_original_recipient = yes
+sender_dependent_relayhost_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayhost.cf
+smtp_sasl_password_maps = proxy:mysql:{config_dir}/mysql-virtual_sender-relayauth.cf, hash:{config_dir}/sasl_passwd
+smtp_sender_dependent_authentication = yes
+smtp_sasl_auth_enable = yes
+smtp_sasl_security_options = noanonymous, noplaintext
+smtp_sasl_tls_security_options = noanonymous
diff --git a/interface/web/mail/form/mail_domain.tform.php b/interface/web/mail/form/mail_domain.tform.php
index 5c8fa0185a..6e768193e0 100644
--- a/interface/web/mail/form/mail_domain.tform.php
+++ b/interface/web/mail/form/mail_domain.tform.php
@@ -136,6 +136,30 @@ $form["tabs"]['domain'] = array (
 					'errmsg'=> 'dkim_selector_error'),
 			),
 		),
+		'relay_host' => array(
+				'datatype' => 'VARCHAR',
+				'formtype' => 'TEXT',
+				'default' => '',
+				'value' => '',
+				'width' => '40',
+				'maxlength' => '255'
+		),
+		'relay_user' => array(
+				'datatype' => 'VARCHAR',
+				'formtype' => 'TEXT',
+				'default' => '',
+				'value' => '',
+				'width' => '40',
+				'maxlength' => '255'
+		),
+		'relay_pass' => array(
+				'datatype' => 'VARCHAR',
+				'formtype' => 'TEXT',
+				'default' => '',
+				'value' => '',
+				'width' => '40',
+				'maxlength' => '255'
+		),
 		'active' => array (
 			'datatype' => 'VARCHAR',
 			'formtype' => 'CHECKBOX',
diff --git a/interface/web/mail/lib/lang/ar_mail_domain.lng b/interface/web/mail/lib/lang/ar_mail_domain.lng
index 4d99d0fb5e..e53c5d9ec2 100644
--- a/interface/web/mail/lib/lang/ar_mail_domain.lng
+++ b/interface/web/mail/lib/lang/ar_mail_domain.lng
@@ -19,5 +19,7 @@ $wb['dkim_private_key_error'] = 'Invalid DKIM-Private key';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
-$wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this accounte';
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/bg_mail_domain.lng b/interface/web/mail/lib/lang/bg_mail_domain.lng
index 6e30a26494..f2d329a62e 100644
--- a/interface/web/mail/lib/lang/bg_mail_domain.lng
+++ b/interface/web/mail/lib/lang/bg_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['policy_txt'] = 'Спамфилтър';
 $wb['no_policy'] = '- не е разрешен -';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/br_mail_domain.lng b/interface/web/mail/lib/lang/br_mail_domain.lng
index 8cf2cdce65..7371f51894 100644
--- a/interface/web/mail/lib/lang/br_mail_domain.lng
+++ b/interface/web/mail/lib/lang/br_mail_domain.lng
@@ -20,3 +20,6 @@ $wb['no_policy'] = '-desabilitado-';
 $wb['error_not_allowed_server_id'] = 'O servidor selecionado não é permitido para esta conta.';
 $wb['dkim_selector_txt'] = 'Seletor DKIM';
 $wb['dkim_selector_error'] = 'Seletor DKIM é inválido. Utilize apenas caracteres alfanuméricos em minúsculas (a-z ou 0-9) e no máximo 63 caracteres.';
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/ca_mail_domain.lng b/interface/web/mail/lib/lang/ca_mail_domain.lng
index 65d664cf3a..0b701a16c3 100644
--- a/interface/web/mail/lib/lang/ca_mail_domain.lng
+++ b/interface/web/mail/lib/lang/ca_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/cz_mail_domain.lng b/interface/web/mail/lib/lang/cz_mail_domain.lng
index 2d1adc0343..0c648a68f3 100644
--- a/interface/web/mail/lib/lang/cz_mail_domain.lng
+++ b/interface/web/mail/lib/lang/cz_mail_domain.lng
@@ -20,3 +20,6 @@ $wb['dkim_selector_error'] = 'Neplatný DKIM selektor. Používejte pouze malá
 $wb['policy_txt'] = 'Spamový filtr';
 $wb['no_policy'] = '- nepovoleno -';
 $wb['error_not_allowed_server_id'] = 'Zvolený server není povolen pro tento účet.';
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/de_mail_domain.lng b/interface/web/mail/lib/lang/de_mail_domain.lng
index 13aac42c79..1a64a44231 100644
--- a/interface/web/mail/lib/lang/de_mail_domain.lng
+++ b/interface/web/mail/lib/lang/de_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Ungültiger DKIM-Selector.  Verwenden Sie nur max. 63 alphanumerische Zeichen (a-z oder 0-9)';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/dk_mail_domain.lng b/interface/web/mail/lib/lang/dk_mail_domain.lng
index f37b81d65e..fcced58e1a 100644
--- a/interface/web/mail/lib/lang/dk_mail_domain.lng
+++ b/interface/web/mail/lib/lang/dk_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/el_mail_domain.lng b/interface/web/mail/lib/lang/el_mail_domain.lng
index 3973746dfd..3909576a3c 100644
--- a/interface/web/mail/lib/lang/el_mail_domain.lng
+++ b/interface/web/mail/lib/lang/el_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/en_mail_domain.lng b/interface/web/mail/lib/lang/en_mail_domain.lng
index 0190c0ab06..39e22f75b6 100644
--- a/interface/web/mail/lib/lang/en_mail_domain.lng
+++ b/interface/web/mail/lib/lang/en_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['no_policy'] = '- not enabled -';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/es_mail_domain.lng b/interface/web/mail/lib/lang/es_mail_domain.lng
index 36c5ae5763..bd23b94191 100644
--- a/interface/web/mail/lib/lang/es_mail_domain.lng
+++ b/interface/web/mail/lib/lang/es_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['no_policy'] = '- no habilitado -';
 $wb['policy_txt'] = 'Filtro de spam';
 $wb['server_id_txt'] = 'Servidor';
 $wb['type_txt'] = 'Tipo';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/fi_mail_domain.lng b/interface/web/mail/lib/lang/fi_mail_domain.lng
index 088c768091..d77fe32500 100644
--- a/interface/web/mail/lib/lang/fi_mail_domain.lng
+++ b/interface/web/mail/lib/lang/fi_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/fr_mail_domain.lng b/interface/web/mail/lib/lang/fr_mail_domain.lng
index eebbdc02b1..56efb88aae 100644
--- a/interface/web/mail/lib/lang/fr_mail_domain.lng
+++ b/interface/web/mail/lib/lang/fr_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/hr_mail_domain.lng b/interface/web/mail/lib/lang/hr_mail_domain.lng
index eb91862b31..2f53c694c8 100644
--- a/interface/web/mail/lib/lang/hr_mail_domain.lng
+++ b/interface/web/mail/lib/lang/hr_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/hu_mail_domain.lng b/interface/web/mail/lib/lang/hu_mail_domain.lng
index 431beb8a01..96a5dc03a5 100644
--- a/interface/web/mail/lib/lang/hu_mail_domain.lng
+++ b/interface/web/mail/lib/lang/hu_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/id_mail_domain.lng b/interface/web/mail/lib/lang/id_mail_domain.lng
index c13968dde8..2979773e8c 100644
--- a/interface/web/mail/lib/lang/id_mail_domain.lng
+++ b/interface/web/mail/lib/lang/id_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/it_mail_domain.lng b/interface/web/mail/lib/lang/it_mail_domain.lng
index 46089adb90..88e2c146df 100644
--- a/interface/web/mail/lib/lang/it_mail_domain.lng
+++ b/interface/web/mail/lib/lang/it_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/ja_mail_domain.lng b/interface/web/mail/lib/lang/ja_mail_domain.lng
index 787937668c..a96faaa367 100644
--- a/interface/web/mail/lib/lang/ja_mail_domain.lng
+++ b/interface/web/mail/lib/lang/ja_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['no_policy'] = '使わない';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/nl_mail_domain.lng b/interface/web/mail/lib/lang/nl_mail_domain.lng
index c4fe53c718..0e8a912a71 100644
--- a/interface/web/mail/lib/lang/nl_mail_domain.lng
+++ b/interface/web/mail/lib/lang/nl_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/pl_mail_domain.lng b/interface/web/mail/lib/lang/pl_mail_domain.lng
index e4483a0d64..7ff3c297ff 100644
--- a/interface/web/mail/lib/lang/pl_mail_domain.lng
+++ b/interface/web/mail/lib/lang/pl_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/pt_mail_domain.lng b/interface/web/mail/lib/lang/pt_mail_domain.lng
index 224a38a2e1..092f83f1ca 100644
--- a/interface/web/mail/lib/lang/pt_mail_domain.lng
+++ b/interface/web/mail/lib/lang/pt_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/ro_mail_domain.lng b/interface/web/mail/lib/lang/ro_mail_domain.lng
index ede56e351e..e0543f36ec 100644
--- a/interface/web/mail/lib/lang/ro_mail_domain.lng
+++ b/interface/web/mail/lib/lang/ro_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_txt'] = 'DKIM-Selector';
 $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/ru_mail_domain.lng b/interface/web/mail/lib/lang/ru_mail_domain.lng
index adc1ac74cb..7567e3c670 100644
--- a/interface/web/mail/lib/lang/ru_mail_domain.lng
+++ b/interface/web/mail/lib/lang/ru_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['dkim_selector_txt'] = 'DKIM-селектор';
 $wb['dkim_selector_error'] = 'Некорректный DKIM-селектор. Используйте только строчные буквенно-цифровые символы (a-z или 0-9) до 63 символов';
 $wb['error_not_allowed_server_id'] = 'Выбранный сервер не доступен для этой учетной записи.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/se_mail_domain.lng b/interface/web/mail/lib/lang/se_mail_domain.lng
index fcd87813ba..7f192224e6 100644
--- a/interface/web/mail/lib/lang/se_mail_domain.lng
+++ b/interface/web/mail/lib/lang/se_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanu
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['no_policy'] = '- ej aktiverat -';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/sk_mail_domain.lng b/interface/web/mail/lib/lang/sk_mail_domain.lng
index dfe8ce8899..ed67d20044 100644
--- a/interface/web/mail/lib/lang/sk_mail_domain.lng
+++ b/interface/web/mail/lib/lang/sk_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['no_policy'] = '- Nie je aktivovaný -';
 $wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.';
 $wb['dkim_selector_txt'] = 'DKIM-Selector';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/lib/lang/tr_mail_domain.lng b/interface/web/mail/lib/lang/tr_mail_domain.lng
index 3e7d9cc412..802fdcf94b 100644
--- a/interface/web/mail/lib/lang/tr_mail_domain.lng
+++ b/interface/web/mail/lib/lang/tr_mail_domain.lng
@@ -20,4 +20,6 @@ $wb['dkim_settings_txt'] = 'DomainKeys Tanımlı E-posta (DKIM)';
 $wb['error_not_allowed_server_id'] = 'Seçilmiş sunucuda bu hesap kullanılamaz.';
 $wb['dkim_selector_txt'] = 'DKIM Seçici';
 $wb['dkim_selector_error'] = 'DKIM seçici geçersiz. En fazla 63 karakter uzunluğunda, yalnız küçük İngilizce harf ve rakamları kullanın (a-z ya da 0-9)';
-?>
+$wb['relayhost_txt'] = 'Relayhost';
+$wb['relayhost_user_txt'] = 'Relayhost User';
+$wb['relayhost_password_txt'] = 'Relayhost Password';
diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php
index 7409bf0c7c..3ea60c08f9 100644
--- a/interface/web/mail/mail_domain_edit.php
+++ b/interface/web/mail/mail_domain_edit.php
@@ -215,6 +215,13 @@ class page_action extends tform_actions {
 			$app->tpl->setVar("edit_disabled", 0);
 		}
 
+		// load relayhost-values
+		$sql = "SELECT relay_host, relay_user, relay_pass FROM mail_domain WHERE domain_id = ?";
+		$rec = $app->db->queryOneRecord($sql, $app->functions->intval($_GET['id']));
+		$app->tpl->setVar('relay_host', $rec['relay_host'], true);
+		$app->tpl->setVar('relay_user', $rec['relay_user'], true);
+		$app->tpl->setVar('relay_pass', $rec['relay_pass'], true);
+
 		// load dkim-values
 		$sql = "SELECT domain, dkim_private, dkim_public, dkim_selector FROM mail_domain WHERE domain_id = ?";
 		$rec = $app->db->queryOneRecord($sql, $app->functions->intval($_GET['id']));
diff --git a/interface/web/mail/templates/mail_domain_edit.htm b/interface/web/mail/templates/mail_domain_edit.htm
index cb462c9819..676e55f9dc 100644
--- a/interface/web/mail/templates/mail_domain_edit.htm
+++ b/interface/web/mail/templates/mail_domain_edit.htm
@@ -75,6 +75,24 @@
                     {tmpl_var name='policy'}
                 </select></div>
             </div>
+            <div class="form-group">
+                <label for="relay_host" class="col-sm-3 control-label">{tmpl_var name='relayhost_txt'}</label>
+                <div class="col-sm-9">
+                    <input type="text" name="relay_host" id="relay_host" value="{tmpl_var name='relay_host'}" class="form-control" />
+                </div>
+            </div>
+            <div class="form-group">
+                <label for="relay_user" class="col-sm-3 control-label">{tmpl_var name='relayhost_user_txt'}</label>
+                <div class="col-sm-9">
+                    <input type="text" name="relay_user" id="relay_user" value="{tmpl_var name='relay_user'}" class="form-control" />
+                </div>
+            </div>
+            <div class="form-group">
+                <label for="relay_pass" class="col-sm-3 control-label">{tmpl_var name='relayhost_password_txt'}</label>
+                <div class="col-sm-9">
+                    <input type="text" name="relay_pass" id="relay_pass" value="{tmpl_var name='relay_pass'}" class="form-control" />
+                </div>
+            </div>
             <div class="form-group">
                 <label class="col-sm-3 control-label">{tmpl_var name='active_txt'}</label>
                 <div class="col-sm-9">
-- 
GitLab