diff --git a/install/dist/lib/centos_base.lib.php b/install/dist/lib/centos_base.lib.php
index 0fe988439d8098c255bf216489ab6e0053d99e2e..8c71db34a66531ec2cecc8f496ccb2113e4253d1 100644
--- a/install/dist/lib/centos_base.lib.php
+++ b/install/dist/lib/centos_base.lib.php
@@ -83,31 +83,28 @@ class installer_centos extends installer_dist {
$config_dir = $conf['postfix']['config_dir'];
- // Adding amavis-services to the master.cf file if the service does not already exists
- $add_amavis = !$this->get_postfix_service('amavis','unix');
- $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
- $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
-
- if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
- //* backup master.cf
- if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
- // adjust amavis-config
- if($add_amavis) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10025) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10027) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- }
+ // Adding amavis-services to the master.cf file
+
+ // backup master.cf
+ if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
+
+ // first remove the old service definitions
+ $this->remove_postfix_service('amavis','unix');
+ $this->remove_postfix_service('127.0.0.1:10025','inet');
+ $this->remove_postfix_service('127.0.0.1:10027','inet');
+
+ // then add them back
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn # REMOVE ME', 1);
replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1);
diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php
index 2e46ed16d351ae9bf906c588e8f39a36bd40989c..71809ac81ea0ec084a5dfa83031e3bb2e7859da2 100644
--- a/install/dist/lib/fedora.lib.php
+++ b/install/dist/lib/fedora.lib.php
@@ -330,31 +330,28 @@ class installer_dist extends installer_base {
$config_dir = $conf['postfix']['config_dir'];
- // Adding amavis-services to the master.cf file if the service does not already exists
- $add_amavis = !$this->get_postfix_service('amavis','unix');
- $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
- $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
-
- if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
- //* backup master.cf
- if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
- // adjust amavis-config
- if($add_amavis) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10025) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10027) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- }
+ // Adding amavis-services to the master.cf file
+
+ // backup master.cf
+ if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
+
+ // first remove the old service definitions
+ $this->remove_postfix_service('amavis','unix');
+ $this->remove_postfix_service('127.0.0.1:10025','inet');
+ $this->remove_postfix_service('127.0.0.1:10027','inet');
+
+ // then add them back
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn # REMOVE ME', 1);
replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1);
diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php
index 83a4b5ffafee0b140530913f8c9bde449dad0b04..ebb742a3683e1c64b72cbc7e477223a1527928a8 100644
--- a/install/dist/lib/gentoo.lib.php
+++ b/install/dist/lib/gentoo.lib.php
@@ -444,31 +444,28 @@ class installer extends installer_base
$config_dir = $conf['postfix']['config_dir'];
- // Adding amavis-services to the master.cf file if the service does not already exists
- $add_amavis = !$this->get_postfix_service('amavis','unix');
- $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
- $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
-
- if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
- //* backup master.cf
- if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
- // adjust amavis-config
- if($add_amavis) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10025) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10027) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- }
+ // Adding amavis-services to the master.cf file
+
+ // backup master.cf
+ if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
+
+ // first remove the old service definitions
+ $this->remove_postfix_service('amavis','unix');
+ $this->remove_postfix_service('127.0.0.1:10025','inet');
+ $this->remove_postfix_service('127.0.0.1:10027','inet');
+
+ // then add them back
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
//* Add the clamav user to the amavis group
exec('usermod -a -G amavis clamav');
diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php
index 3effb1d10c8cc61af717601cdaece67e784e9444..7cc368a14e3fdab0351f06f6c088c9c1d6611257 100644
--- a/install/dist/lib/opensuse.lib.php
+++ b/install/dist/lib/opensuse.lib.php
@@ -513,31 +513,28 @@ class installer_dist extends installer_base {
$config_dir = $conf['postfix']['config_dir'];
- // Adding amavis-services to the master.cf file if the service does not already exists
- $add_amavis = !$this->get_postfix_service('amavis','unix');
- $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
- $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
-
- if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
- //* backup master.cf
- if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
- // adjust amavis-config
- if($add_amavis) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10025) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10027) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- }
+ // Adding amavis-services to the master.cf file
+
+ // backup master.cf
+ if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
+
+ // first remove the old service definitions
+ $this->remove_postfix_service('amavis','unix');
+ $this->remove_postfix_service('127.0.0.1:10025','inet');
+ $this->remove_postfix_service('127.0.0.1:10027','inet');
+
+ // then add them back
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
// Add the clamav user to the vscan group
//exec('groupmod --add-user clamav vscan');
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 103abaef1909859b45017bde0f9c6bda9174e7e3..f4eb3f04517bcdbf177a77b307e59ccffca5a7c6 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -1107,7 +1107,7 @@ class installer_base {
$server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
unset($server_ini_rec);
- //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removeal after an update
+ //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removal after an update
$rbl_list = '';
if (@isset($server_ini_array['mail']['realtime_blackhole_list']) && $server_ini_array['mail']['realtime_blackhole_list'] != '') {
$rbl_hosts = explode(",", str_replace(" ", "", $server_ini_array['mail']['realtime_blackhole_list']));
@@ -1647,6 +1647,12 @@ class installer_base {
public function configure_amavis() {
global $conf;
+ //* These postconf commands will be executed on installation and update
+ $server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']);
+ $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
+ $mail_server = ($server_ini_rec['mail_server']) ? true : false;
+ unset($server_ini_rec);
+
// amavisd user config file
$configfile = 'amavisd_user_config';
if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) copy($conf['amavis']['config_dir'].'/conf.d/50-user', $conf['amavis']['config_dir'].'/50-user~');
@@ -1660,63 +1666,82 @@ class installer_base {
wf($conf['amavis']['config_dir'].'/conf.d/50-user', $content);
chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640);
- // TODO: chmod and chown on the config file
-
- // test if lmtp if available
- $configure_lmtp = $this->get_postfix_service('lmtp','unix');
+ $config_dir = $conf['postfix']['config_dir'];
+ $quoted_config_dir = preg_quote($config_dir, '|');
- // Adding the amavisd commands to the postfix configuration
- // Add array for no error in foreach and maybe future options
- $postconf_commands = array ();
+ $mail_config = $server_ini_array['mail'];
+ //* only change postfix config if amavisd is active filter
+ if($mail_server && $mail_config['content_filter'] === 'amavisd') {
+ // test if lmtp if available
+ $configure_lmtp = $this->get_postfix_service('lmtp','unix');
- // Check for amavisd -> pure webserver with postfix for mailing without antispam
- if ($conf['amavis']['installed']) {
- $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis';
- $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024";
- $postconf_commands[] = 'receive_override_options = no_address_mappings';
- }
+ // Adding the amavisd commands to the postfix configuration
+ $postconf_commands = array ();
- // Make a backup copy of the main.cf file
- copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~2');
+ // Check for amavisd -> pure webserver with postfix for mailing without antispam
+ if ($conf['amavis']['installed']) {
+ $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis';
+ $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024";
+ $postconf_commands[] = 'receive_override_options = no_address_mappings';
+ $postconf_commands[] = 'address_verify_virtual_transport = smtp:[127.0.0.1]:10025';
+ $postconf_commands[] = 'address_verify_transport_maps = static:smtp:[127.0.0.1]:10025';
+ }
- // Executing the postconf commands
- foreach($postconf_commands as $cmd) {
- $command = "postconf -e '$cmd'";
- caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
- }
+ $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions"));
+ $new_options = array();
+ foreach ($options as $value) {
+ $value = trim($value);
+ if ($value == '') continue;
+ if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) {
+ continue;
+ }
+ $new_options[] = $value;
+ }
+ if ($configure_lmtp) {
+ for ($i = 0; isset($new_options[$i]); $i++) {
+ if ($new_options[$i] == 'reject_unlisted_recipient') {
+ array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${config_dir}/mysql-verify_recipients.cf"));
+ break;
+ }
+ }
+ # postfix < 3.3 needs this when using reject_unverified_recipient:
+ if(version_compare($postfix_version, 3.3, '<')) {
+ $postconf_commands[] = "enable_original_recipient = yes";
+ }
+ }
+ $postconf_commands[] = "smtpd_recipient_restrictions = ".implode(", ", $new_options);
- $config_dir = $conf['postfix']['config_dir'];
+ // Make a backup copy of the main.cf file
+ copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~2');
- // Adding amavis-services to the master.cf file if the service does not already exists
-// $add_amavis = !$this->get_postfix_service('amavis','unix');
-// $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
-// $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
- //*TODO: check templates against existing postfix-services to make sure we use the template
+ // Executing the postconf commands
+ foreach($postconf_commands as $cmd) {
+ $command = "postconf -e '$cmd'";
+ caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
+ }
- // Or just remove the old service definitions and add them again?
- $add_amavis = $this->remove_postfix_service('amavis','unix');
- $add_amavis_10025 = $this->remove_postfix_service('127.0.0.1:10025','inet');
- $add_amavis_10027 = $this->remove_postfix_service('127.0.0.1:10027','inet');
+ // Adding amavis-services to the master.cf file
- if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
- //* backup master.cf
+ // backup master.cf
if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
- // adjust amavis-config
- if($add_amavis) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10025) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
- if ($add_amavis_10027) {
- $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
- af($config_dir.'/master.cf', $content);
- unset($content);
- }
+
+ // first remove the old service definitions
+ $this->remove_postfix_service('amavis','unix');
+ $this->remove_postfix_service('127.0.0.1:10025','inet');
+ $this->remove_postfix_service('127.0.0.1:10027','inet');
+
+ // then add them back
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
+
+ $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
+ af($config_dir.'/master.cf', $content);
+ unset($content);
}
// Add the clamav user to the amavis group
@@ -1746,14 +1771,21 @@ class installer_base {
global $conf;
//* These postconf commands will be executed on installation and update
- $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']);
+ $server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']);
$server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
+ $mail_server = ($server_ini_rec['mail_server']) ? true : false;
unset($server_ini_rec);
+ $config_dir = $conf['postfix']['config_dir'];
+ $quoted_config_dir = preg_quote($config_dir, '|');
+
$mail_config = $server_ini_array['mail'];
- if($mail_config['content_filter'] === 'rspamd') {
- exec("postconf -X 'receive_override_options'");
- exec("postconf -X 'content_filter'");
+ //* only change postfix config if rspamd is active filter
+ if($mail_server && $mail_config['content_filter'] === 'rspamd') {
+ exec("postconf -X receive_override_options");
+ exec("postconf -X content_filter");
+ exec("postconf -X address_verify_virtual_transport");
+ exec("postconf -X address_verify_transport_maps");
exec("postconf -e 'smtpd_milters = inet:localhost:11332'");
exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'");
@@ -1804,6 +1836,9 @@ class installer_base {
if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) {
continue;
}
+ if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) {
+ continue;
+ }
$new_options[] = $value;
}
exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'");
diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b7df9f50d15cf8fc74d96b3e6f9364c8239ab1ad 100644
--- a/install/sql/incremental/upd_dev_collection.sql
+++ b/install/sql/incremental/upd_dev_collection.sql
@@ -0,0 +1,18 @@
+-- create mail_relay_domain and load with current domains from mail_transport table
+CREATE TABLE IF NOT EXISTS `mail_relay_domain` (
+ `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `sys_userid` int(11) NOT NULL DEFAULT '0',
+ `sys_groupid` int(11) NOT NULL DEFAULT '0',
+ `sys_perm_user` varchar(5) DEFAULT NULL,
+ `sys_perm_group` varchar(5) DEFAULT NULL,
+ `sys_perm_other` varchar(5) DEFAULT NULL,
+ `server_id` int(11) NOT NULL DEFAULT '0',
+ `domain` varchar(255) DEFAULT NULL,
+ `access` varchar(255) NOT NULL DEFAULT 'OK',
+ `active` varchar(255) NOT NULL DEFAULT 'y',
+ PRIMARY KEY (`relay_domain_id`),
+ UNIQUE KEY `domain` (`domain`, `server_id`)
+ ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
+
+INSERT INTO `mail_relay_domain` SELECT NULL, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `domain`, 'OK', `active` FROM `mail_transport` WHERE `domain` NOT LIKE '%@%' AND `domain` LIKE '%.%' GROUP BY `domain`, `server_id`;
+
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 51106cc18351fa805425f8d2109bda4433ddbc6b..cab6dd7b90e893dd974cc3d5a062cf37e09c238c 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -970,6 +970,27 @@ CREATE TABLE `mail_mailinglist` (
-- --------------------------------------------------------
+--
+-- Table structure for Table `mail_relay_domain`
+--
+
+CREATE TABLE IF NOT EXISTS `mail_relay_domain` (
+ `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT,
+ `sys_userid` int(11) NOT NULL DEFAULT '0',
+ `sys_groupid` int(11) NOT NULL DEFAULT '0',
+ `sys_perm_user` varchar(5) DEFAULT NULL,
+ `sys_perm_group` varchar(5) DEFAULT NULL,
+ `sys_perm_other` varchar(5) DEFAULT NULL,
+ `server_id` int(11) NOT NULL DEFAULT '0',
+ `domain` varchar(255) DEFAULT NULL,
+ `access` varchar(255) NOT NULL DEFAULT 'OK',
+ `active` varchar(255) NOT NULL DEFAULT 'y',
+ PRIMARY KEY (`relay_domain_id`),
+ UNIQUE KEY `domain` (`domain`, `server_id`)
+) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
+
+-- --------------------------------------------------------
+
--
-- Table structure for Table `mail_relay_recipient`
--
diff --git a/install/tpl/master_cf_amavis.master b/install/tpl/master_cf_amavis.master
index 243f28a288dc2e5f27a54f79422a9b5f48571d76..a565f1a1bb50977d8d945e1efcf3b07b641c617d 100644
--- a/install/tpl/master_cf_amavis.master
+++ b/install/tpl/master_cf_amavis.master
@@ -2,5 +2,5 @@
amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
- -o smtp_bind_address=
+ -o smtp_bind_address=
diff --git a/install/tpl/master_cf_amavis10025.master b/install/tpl/master_cf_amavis10025.master
index 6dee892264d3d6f5491fecb104a0242f079cda88..68d4561494b0568c7b4bbac4e6d51ad13c1f66f2 100644
--- a/install/tpl/master_cf_amavis10025.master
+++ b/install/tpl/master_cf_amavis10025.master
@@ -14,4 +14,6 @@
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
+ -o address_verify_virtual_transport=$virtual_transport
+ -o address_verify_transport_maps=$transport_maps
diff --git a/install/tpl/master_cf_amavis10027.master b/install/tpl/master_cf_amavis10027.master
index 640902d52e109a76d206cb72123b7cf1ea65e9d0..d3a07a8bce45d1e2c415f1a6085323faa9066261 100644
--- a/install/tpl/master_cf_amavis10027.master
+++ b/install/tpl/master_cf_amavis10027.master
@@ -13,7 +13,9 @@
-o strict_rfc821_envelopes=yes
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtp_send_xforward_command=yes
- -o milter_default_action=accept
- -o milter_macro_daemon_name=ORIGINATING
-o disable_dns_lookups=yes
+ -o address_verify_virtual_transport=$virtual_transport
+ -o address_verify_transport_maps=$transport_maps
+ -o milter_default_action=accept
+ -o milter_macro_daemon_name=ORIGINATING
diff --git a/install/tpl/mysql-virtual_relaydomains.cf.master b/install/tpl/mysql-virtual_relaydomains.cf.master
index 5ce2db6954429b96b9b4437f2cd9831cb002bc21..c27596d1e75d56e522ad5c40a67399af406cec29 100644
--- a/install/tpl/mysql-virtual_relaydomains.cf.master
+++ b/install/tpl/mysql-virtual_relaydomains.cf.master
@@ -2,4 +2,4 @@ user = {mysql_server_ispconfig_user}
password = {mysql_server_ispconfig_password}
dbname = {mysql_server_database}
hosts = {mysql_server_ip}
-query = select domain from mail_transport where domain = '%s' and active = 'y' and server_id = {server_id}
+query = select domain from mail_relay_domain where domain = '%s' and active = 'y' and server_id = {server_id}
diff --git a/interface/lib/classes/validate_mail_relay_domain.inc.php b/interface/lib/classes/validate_mail_relay_domain.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..44e13998a4af1ed529c02e62ffd27dae582ccb75
--- /dev/null
+++ b/interface/lib/classes/validate_mail_relay_domain.inc.php
@@ -0,0 +1,61 @@
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class validate_mail_relay_domain {
+
+ function get_error($errmsg) {
+ global $app;
+
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."
\r\n";
+ } else {
+ return $errmsg."
\r\n";
+ }
+ }
+
+ /* Validator function for checking the 'domain' of a mail relay domain */
+ function validate_domain($field_name, $field_value, $validator) {
+ global $app, $conf;
+
+ if(isset($app->remoting_lib->primary_id)) {
+ $id = $app->remoting_lib->primary_id;
+ } else {
+ $id = $app->tform->primary_id;
+ }
+
+ // mail_relay_domain.domain must be unique per server
+ $sql = "SELECT relay_domain_id, domain FROM mail_relay_domain WHERE domain = ? AND server_id = ? AND relay_domain_id != ?";
+ $domain_check = $app->db->queryOneRecord($sql, $field_value, $app->tform_actions->dataRecord['server_id'], $id);
+
+ if($domain_check) return $this->get_error('domain_error_unique');
+ }
+
+}
diff --git a/interface/lib/lang/ar.lng b/interface/lib/lang/ar.lng
index 2763f8e82b62ca71763dcba6434898d7eb1f1fac..c2bc19a6b9f483c11d8fe2e5bcc48ac2af5ef109 100644
--- a/interface/lib/lang/ar.lng
+++ b/interface/lib/lang/ar.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/bg.lng b/interface/lib/lang/bg.lng
index 94dfaa8ad19b9f45499558418abcb46ea7cb49de..e0a0bfcdaba846f50de030d2bc1c07d7849eb154 100644
--- a/interface/lib/lang/bg.lng
+++ b/interface/lib/lang/bg.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Изтрий XMPP потребител';
$wb['unlimited_txt'] = 'Неограничен';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng
index e47df8250d24614216a07587ee96874ad4d9426c..7e78ddaf364953e5d0f567aa6bf63384c8ef513b 100644
--- a/interface/lib/lang/br.lng
+++ b/interface/lib/lang/br.lng
@@ -172,3 +172,4 @@ $wb['select_master_directive_snippet_txt'] = 'Diretiva mestre de trechos de cód
$wb['unlimited_txt'] = 'Ilimitado';
$wb['server_id_0_error_txt'] = 'Por favor, selecione um servidor válido. O ID do servidor deve ser > 0.';
$wb['datalog_changes_close_txt'] = 'Fechar';
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/ca.lng b/interface/lib/lang/ca.lng
index c57185fd108c8efb9df79f46b0b1acd786b73844..308aba545bfb2fffbfdb63b2076988f51e91f7fa 100644
--- a/interface/lib/lang/ca.lng
+++ b/interface/lib/lang/ca.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Illimité';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/cz.lng b/interface/lib/lang/cz.lng
index 04ad86178c2f46e50b7f9b0fd1e5015c0b72de02..84ce72a4c0bc98a423932e90904306ee9256fcf4 100644
--- a/interface/lib/lang/cz.lng
+++ b/interface/lib/lang/cz.lng
@@ -172,3 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Smazat XMPP uživatele';
$wb['unlimited_txt'] = 'Neomezený';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng
index 11a5e21a5d2ef0f62e26d18627c4b0cab444da93..38e9c2b40c04df1deaea832f89681ea96ed1b5d2 100644
--- a/interface/lib/lang/de.lng
+++ b/interface/lib/lang/de.lng
@@ -172,4 +172,4 @@ $wb['select_master_directive_snippet_txt'] = 'Master Direktiven Schnipsel';
$wb['unlimited_txt'] = 'unlimitiert';
$wb['server_id_0_error_txt'] = 'Bitte Server auswählen. Server ID muss > als 0 sein.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/dk.lng b/interface/lib/lang/dk.lng
index 9d09f1dc8dd97691652d4f1353d2fc9ae9490300..de52b0e704f00f5c6b9d1808ff09ad6845203aa7 100644
--- a/interface/lib/lang/dk.lng
+++ b/interface/lib/lang/dk.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Ubegrænset';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/el.lng b/interface/lib/lang/el.lng
index 31829d5f937f3b5effcfc0a26974a8298a82cf70..42d991401d696eeef8a1b9e0ed9720438ac70884 100644
--- a/interface/lib/lang/el.lng
+++ b/interface/lib/lang/el.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Απεριόριστα';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng
index dbffc95b8c9bdcb6a821b6038fa40c72ee35131b..57c8d1f79f88ac69ced6a397e5bb5dd8fe7d5806 100644
--- a/interface/lib/lang/en.lng
+++ b/interface/lib/lang/en.lng
@@ -173,4 +173,4 @@ $wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/es.lng b/interface/lib/lang/es.lng
index 3a421e7af51352f0c7e1be5b2e8d1bc0b7e6a301..2d120a2b97603a0d962508aa425e9158272c4baf 100644
--- a/interface/lib/lang/es.lng
+++ b/interface/lib/lang/es.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Borrar usuario XMPP';
$wb['unlimited_txt'] = 'Ilimitado';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Cerrar';
-?>
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/fi.lng b/interface/lib/lang/fi.lng
index f6648e88c6bcc0a07ca3e187f6bf3aea32ce780a..7974914e0e9eab89775f76fdbad6febbbaa166f9 100644
--- a/interface/lib/lang/fi.lng
+++ b/interface/lib/lang/fi.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/fr.lng b/interface/lib/lang/fr.lng
index 15e8294e0c91aa97a15e19774432a0464a8a5d2c..b4bb837e7df140a132009910c64221a5ab227d3c 100644
--- a/interface/lib/lang/fr.lng
+++ b/interface/lib/lang/fr.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Illimité';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/hr.lng b/interface/lib/lang/hr.lng
index fdb09cbff53d220195ae9b313dba6aea71c86aad..bef42f1814ce5d93bc603c69d31b3cb630b7faeb 100644
--- a/interface/lib/lang/hr.lng
+++ b/interface/lib/lang/hr.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'neograničeno';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/hu.lng b/interface/lib/lang/hu.lng
index 8e65d4c97416c77f9964c24afc0d0bbd5e96f3dd..e3913462fe0adc3a0152e4c39425d62bfb634dbf 100644
--- a/interface/lib/lang/hu.lng
+++ b/interface/lib/lang/hu.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Korlátlan';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/id.lng b/interface/lib/lang/id.lng
index 693ca49015657476fd703df309c8a45f8dd2cd4c..aea01a061486780e671c2d12e03f1e95cc18b866 100644
--- a/interface/lib/lang/id.lng
+++ b/interface/lib/lang/id.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Tak terbatas';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/it.lng b/interface/lib/lang/it.lng
index 1333cc907f541947ec262ecedf708e01985281a0..ff08d6f6337a6fdf84ed4b6befc103344e12b1e1 100644
--- a/interface/lib/lang/it.lng
+++ b/interface/lib/lang/it.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Elimina utente XMPP';
$wb['unlimited_txt'] = 'illimitati';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Chiudi';
-?>
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/ja.lng b/interface/lib/lang/ja.lng
index 2d24f9a1f70ab5bbdbebd7d53927546ffd52153c..7235de393e3c7d4a7878eeb13554b791f048084f 100644
--- a/interface/lib/lang/ja.lng
+++ b/interface/lib/lang/ja.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/nl.lng b/interface/lib/lang/nl.lng
index 3af436ca485348404bc1c3bde176ac4356b9246f..54e7045e612ff200bad7be702f0ddd74141f3e29 100644
--- a/interface/lib/lang/nl.lng
+++ b/interface/lib/lang/nl.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Ongelimiteerd';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Sluiten';
-?>
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/pl.lng b/interface/lib/lang/pl.lng
index 4a1cd0384e1c8b5f2042bfc954630fc97ec43a1b..ccd3347324793d50ead081987c6f3d1c49ee55ba 100644
--- a/interface/lib/lang/pl.lng
+++ b/interface/lib/lang/pl.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'nielimitowane';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/pt.lng b/interface/lib/lang/pt.lng
index 86d4442c42d2f31eb4d6d83359ce2a30db1cc9af..e2dc2f72acba3a877f0463fff46f38b4931641c1 100644
--- a/interface/lib/lang/pt.lng
+++ b/interface/lib/lang/pt.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/ro.lng b/interface/lib/lang/ro.lng
index 4f032832eb92c4b26c261892e3ca6a1268a42e79..6a9f596a0b74fd64d85099ce0f8b3ed941421407 100644
--- a/interface/lib/lang/ro.lng
+++ b/interface/lib/lang/ro.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/ru.lng b/interface/lib/lang/ru.lng
index 2d18c9f628a418d3e3232819798e0ff14d0364ca..dca0c7a53e4cb9fc8cfaf82529d6fb6f9358efe8 100644
--- a/interface/lib/lang/ru.lng
+++ b/interface/lib/lang/ru.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Удалить пользователя XMP
$wb['unlimited_txt'] = 'Безлимитный';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/se.lng b/interface/lib/lang/se.lng
index 5e8b3c7123a96af9a3e5697bbc3855cea19bc668..2d3c38fd3892654599a4b616b23755062d4d70b0 100644
--- a/interface/lib/lang/se.lng
+++ b/interface/lib/lang/se.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Obegränsat';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/sk.lng b/interface/lib/lang/sk.lng
index cab3ea1f8f9b8017ca6b92747e5eb5ef062e5640..d8e06d1ab3a1c024260ee1fc3fed89f00f35d8e8 100644
--- a/interface/lib/lang/sk.lng
+++ b/interface/lib/lang/sk.lng
@@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user';
$wb['unlimited_txt'] = 'Unlimited';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/lib/lang/tr.lng b/interface/lib/lang/tr.lng
index 041c8d71030e856a9e93ba18bb90a145eb4bfbdc..ec5f1bfd930ecd2d3de74f48b3ddcb48f3440511 100644
--- a/interface/lib/lang/tr.lng
+++ b/interface/lib/lang/tr.lng
@@ -173,4 +173,4 @@ $wb['select_master_directive_snippet_txt'] = 'Ana Komut Parçaları';
$wb['unlimited_txt'] = 'Sınırsız';
$wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.';
$wb['datalog_changes_close_txt'] = 'Close';
-?>
\ No newline at end of file
+$wb['non_admin_error'] = 'Requires administrator level permissions';
diff --git a/interface/web/mail/form/mail_relay_domain.tform.php b/interface/web/mail/form/mail_relay_domain.tform.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e2523309deb99e75bece53334e23464748cd905
--- /dev/null
+++ b/interface/web/mail/form/mail_relay_domain.tform.php
@@ -0,0 +1,151 @@
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ Form Definition
+
+ Tabledefinition
+
+ Datatypes:
+ - INTEGER (Forces the input to Int)
+ - DOUBLE
+ - CURRENCY (Formats the values to currency notation)
+ - VARCHAR (no format check, maxlength: 255)
+ - TEXT (no format check)
+ - DATE (Dateformat, automatic conversion to timestamps)
+
+ Formtype:
+ - TEXT (Textfield)
+ - TEXTAREA (Textarea)
+ - PASSWORD (Password textfield, input is not shown when edited)
+ - SELECT (Select option field)
+ - RADIO
+ - CHECKBOX
+ - CHECKBOXARRAY
+ - FILE
+
+ VALUE:
+ - Wert oder Array
+
+ Hint:
+ The ID field of the database table is not part of the datafield definition.
+ The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] = "mail_relay_domain_title";
+$form["description"] = "";
+$form["name"] = "mail_relay_domain";
+$form["action"] = "mail_relay_domain_edit.php";
+$form["db_table"] = "mail_relay_domain";
+$form["db_table_idx"] = "relay_domain_id";
+$form["db_history"] = "yes";
+$form["tab_default"] = "relay_domain";
+$form["list_default"] = "mail_relay_domain_list.php";
+$form["auth"] = 'yes'; // yes / no
+
+$form["auth_preset"]["userid"] = 0; // 0 = id of the user, > 0 id must match with id of current user
+$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
+$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
+
+$form["tabs"]['relay_domain'] = array (
+ 'title' => "tab_relay_domain_title",
+ 'width' => 100,
+ 'template' => "templates/mail_relay_domain_edit.htm",
+ 'fields' => array (
+ //#################################
+ // Begin Datatable fields
+ //#################################
+ 'server_id' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'value' => ''
+ ),
+ 'domain' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'filters' => array( 0 => array( 'event' => 'SAVE',
+ 'type' => 'IDNTOASCII'),
+ 1 => array( 'event' => 'SHOW',
+ 'type' => 'IDNTOUTF8'),
+ 2 => array( 'event' => 'SAVE',
+ 'type' => 'TOLOWER'),
+ 3 => array( 'event' => 'SAVE',
+ 'type' => 'STRIPNL'),
+ ),
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg' => 'domain_error_empty'),
+ 1 => array ( 'type' => 'ISDOMAIN',
+ 'errmsg' => 'domain_error_regex'),
+ 2 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_mail_relay_domain',
+ 'function' => 'validate_domain',
+ 'errmsg' => 'domain_error_unique'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ ),
+ 'access' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'filters' => array(
+ 0 => array( 'event' => 'SAVE',
+ 'type' => 'STRIPTAGS'),
+ 1 => array( 'event' => 'SAVE',
+ 'type' => 'STRIPNL')
+ ),
+ 'default' => 'OK',
+ 'value' => 'OK',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'active' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'CHECKBOX',
+ 'default' => 'y',
+ 'value' => array(0 => 'n', 1 => 'y')
+ ),
+ //#################################
+ // END Datatable fields
+ //#################################
+ )
+);
+
diff --git a/interface/web/mail/lib/lang/ar_mail_relay_domain.lng b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng
new file mode 100644
index 0000000000000000000000000000000000000000..e5296a9a9bba1dea5a068c7cef8187e5d4e51a4f
--- /dev/null
+++ b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng
@@ -0,0 +1,9 @@
+auth->is_admin())
'target' => 'content',
'link' => 'mail/mail_blacklist_list.php',
'html_id' => 'mail_blacklist_list');
-}
if($app->auth->get_client_limit($userid, 'mailrouting') != 0)
{
@@ -83,6 +82,8 @@ if($app->auth->get_client_limit($userid, 'mailrouting') != 0)
'html_id' => 'mail_transport_list');
}
+}
+
if(count($items) && $app->system->has_service($userid, 'mail'))
{
$module['nav'][] = array( 'title' => 'Email Accounts',
@@ -242,14 +243,25 @@ if($app->auth->is_admin())
'html_id' => 'mail_content_filter_list');
+ $items[] = array( 'title' => 'Email Routing',
+ 'target' => 'content',
+ 'link' => 'mail/mail_transport_list.php',
+ 'html_id' => 'mail_transport_list');
+
+
+ $items[] = array( 'title' => 'Relay Domains',
+ 'target' => 'content',
+ 'link' => 'mail/mail_relay_domain_list.php',
+ 'html_id' => 'mail_relay_domain_list');
+
+
$items[] = array( 'title' => 'Relay Recipients',
'target' => 'content',
'link' => 'mail/mail_relay_recipient_list.php',
'html_id' => 'mail_relay_recipient_list');
- $module['nav'][] = array( 'title' => 'Global Filters',
+ $module['nav'][] = array( 'title' => 'Server Settings',
'open' => 1,
'items' => $items);
}
-?>
diff --git a/interface/web/mail/list/mail_relay_domain.list.php b/interface/web/mail/list/mail_relay_domain.list.php
new file mode 100644
index 0000000000000000000000000000000000000000..a6ff7834824de4c4e703bc876b48971e3ea2afa1
--- /dev/null
+++ b/interface/web/mail/list/mail_relay_domain.list.php
@@ -0,0 +1,111 @@
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+// Name of the list
+$liste["name"] = "mail_relay_domain";
+
+// Database table
+$liste["table"] = "mail_relay_domain";
+
+// Index index field of the database table
+$liste["table_idx"] = "relay_domain_id";
+
+// Search Field Prefix
+$liste["search_prefix"] = "search_";
+
+// Records per page
+$liste["records_per_page"] = "15";
+
+// Script File of the list
+$liste["file"] = "mail_relay_domain_list.php";
+
+// Script file of the edit form
+$liste["edit_file"] = "mail_relay_domain_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"] = "mail_relay_domain_del.php";
+
+// Paging Template
+$liste["paging_tpl"] = "templates/paging.tpl.htm";
+
+// Enable auth
+$liste["auth"] = "yes";
+
+
+/*****************************************************
+ * Search fields
+ *****************************************************/
+
+/*
+ Datatypes:
+ - INTEGER
+ - DOUBLE
+ - CURRENCY
+ - VARCHAR
+ - TEXT
+ - DATE
+*/
+
+
+$liste["item"][] = array( 'field' => "active",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "SELECT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => array('y' => $app->lng('yes_txt'), 'n' => $app->lng('no_txt')));
+
+
+$liste["item"][] = array( 'field' => "server_id",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "SELECT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND mirror_server_id = 0 ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'width' => "",
+ 'value' => "");
+
+
+$liste["item"][] = array( 'field' => "domain",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
diff --git a/interface/web/mail/mail_relay_domain_del.php b/interface/web/mail/mail_relay_domain_del.php
new file mode 100644
index 0000000000000000000000000000000000000000..2981d1518d2a62287fed9aa3e68fc169b48e95b0
--- /dev/null
+++ b/interface/web/mail/mail_relay_domain_del.php
@@ -0,0 +1,50 @@
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/mail_relay_domain.list.php";
+$tform_def_file = "form/mail_relay_domain.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once '../../lib/config.inc.php';
+require_once '../../lib/app.inc.php';
+
+//* Check permissions for module
+$app->auth->check_module_permissions('mail');
+
+$app->uses("tform_actions");
+$app->tform_actions->onDelete();
+
diff --git a/interface/web/mail/mail_relay_domain_edit.php b/interface/web/mail/mail_relay_domain_edit.php
new file mode 100644
index 0000000000000000000000000000000000000000..131b6fe06af73f19a00eed5bc9e2f43b3352683e
--- /dev/null
+++ b/interface/web/mail/mail_relay_domain_edit.php
@@ -0,0 +1,78 @@
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$tform_def_file = "form/mail_relay_domain.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once '../../lib/config.inc.php';
+require_once '../../lib/app.inc.php';
+
+//* Check permissions for module
+$app->auth->check_module_permissions('mail');
+
+//* Only administrators allowed
+if(! $app->auth->is_admin()) { die( $app->lng("non_admin_error") ); }
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+
+ function onSubmit() {
+ global $app, $conf;
+
+ //* make sure that the email domain is lowercase
+ if(isset($this->dataRecord["domain"])){
+ $this->dataRecord["domain"] = $app->functions->idn_encode($this->dataRecord["domain"]);
+ $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]);
+ }
+
+ //* server_id must be > 0
+ if(isset($this->dataRecord["server_id"]) && $this->dataRecord["server_id"] < 1) {
+ $app->tform->errorMessage .= $app->lng("server_id_0_error_txt");
+ }
+
+ parent::onSubmit();
+ }
+
+}
+
+$app->tform_actions = new page_action;
+$app->tform_actions->onLoad();
+
diff --git a/interface/web/mail/mail_relay_domain_list.php b/interface/web/mail/mail_relay_domain_list.php
new file mode 100644
index 0000000000000000000000000000000000000000..56812b75805b5875695b703744d28fc6dbbffc42
--- /dev/null
+++ b/interface/web/mail/mail_relay_domain_list.php
@@ -0,0 +1,51 @@
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of ISPConfig nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once '../../lib/config.inc.php';
+require_once '../../lib/app.inc.php';
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/mail_relay_domain.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('mail');
+
+$app->uses('listform_actions');
+
+$app->listform_actions->onLoad();
+
+
diff --git a/interface/web/mail/templates/mail_relay_domain_edit.htm b/interface/web/mail/templates/mail_relay_domain_edit.htm
new file mode 100644
index 0000000000000000000000000000000000000000..2d4d1f304164726292ad760f8511bdbf38add15a
--- /dev/null
+++ b/interface/web/mail/templates/mail_relay_domain_edit.htm
@@ -0,0 +1,26 @@
+
{tmpl_var name="toolsarea_head_txt"}
+ + + +{tmpl_var name='search_limit'} | +|||
---|---|---|---|
+ | + | + | + + | +
{tmpl_var name="active"} | +{tmpl_var name="server_id"} | +{tmpl_var name="domain"} | ++ + | +
{tmpl_var name='globalsearch_noresults_text_txt'} | +|||