added rate limiting
This commit is contained in:
parent
dae4959817
commit
81a29508eb
|
@ -13,12 +13,13 @@ help()
|
||||||
echo "$thisfilename"
|
echo "$thisfilename"
|
||||||
echo "Add domain to vmail system"
|
echo "Add domain to vmail system"
|
||||||
echo ""
|
echo ""
|
||||||
echo "usage: $thisfilename -d <domain> [-l <limit>] [-q <quota>] [-s <status>]"
|
echo "usage: $thisfilename -d <domain> [-l <limit>] [-q <quota>] [-r <ratelimit>] [-s <status>]"
|
||||||
echo ""
|
echo ""
|
||||||
echo " -h Print this help."
|
echo " -h Print this help."
|
||||||
echo " -d Domain to add to vmail system."
|
echo " -d Domain to add to vmail system."
|
||||||
echo " -l <limit> Maximum number of mailboxes for this domain."
|
echo " -l <limit> Maximum number of mailboxes for this domain."
|
||||||
echo " -q <quota> Default mailbox quota in GB."
|
echo " -q <quota> Default mailbox quota in GB."
|
||||||
|
echo " -r <ratelimit> Default mailbox sending rate limit per hour, multiplied by 10 for limit per day."
|
||||||
echo " -s <status> 1 for enabled, 0 for disabled."
|
echo " -s <status> 1 for enabled, 0 for disabled."
|
||||||
echo ""
|
echo ""
|
||||||
echo " Defaults for all Options are configured in database."
|
echo " Defaults for all Options are configured in database."
|
||||||
|
@ -80,6 +81,16 @@ if [ "$rowcount" -eq '0' ] ; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if [ ! -z "$ratelimit" ] ; then
|
||||||
|
if [[ "$ratelimit" == "NULL" ]]; then
|
||||||
|
dbquery="$dbquery, mbox_ratelimit_default=NULL"
|
||||||
|
elif [[ "$ratelimit" =~ ^[0-9]+$ ]]; then
|
||||||
|
dbquery="$dbquery, mbox_quota_default='$ratelimit'"
|
||||||
|
else
|
||||||
|
echo "ERROR: ratelimit (-r) must numeric or NULL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
dbquery="$dbquery;"
|
dbquery="$dbquery;"
|
||||||
# add domain to vmail database
|
# add domain to vmail database
|
||||||
eval $dbcmd $dbcmdopts "\"$dbquery\""
|
eval $dbcmd $dbcmdopts "\"$dbquery\""
|
||||||
|
|
|
@ -12,12 +12,13 @@ help()
|
||||||
thisfilename=$(basename -- "$0")
|
thisfilename=$(basename -- "$0")
|
||||||
echo "Modify an existing domain."
|
echo "Modify an existing domain."
|
||||||
echo ""
|
echo ""
|
||||||
echo "usage: $thisfilename -d domain [OPTIONS]"
|
echo "usage: $thisfilename -d <domain> [OPTIONS]"
|
||||||
echo ""
|
echo ""
|
||||||
echo " -h Print this help."
|
echo " -h Print this help."
|
||||||
echo " -d Domain to be modified."
|
echo " -d Domain to be modified."
|
||||||
echo " -l LIMIT Mailbox limit - the maximum number of mailboxes under this domain."
|
echo " -l <limit> Mailbox limit - the maximum number of mailboxes under this domain."
|
||||||
echo " -q QUOTA Mailbox Quota Default in GB - default quota for new mailboxes under this domain."
|
echo " -q <quota> Mailbox Quota Default in GB - default quota for new mailboxes under this domain."
|
||||||
|
echo " -r <ratelimit> Default mailbox sending rate limit per hour, multiplied by 10 for limit per day."
|
||||||
echo " -s <0|1> Status. 1 for enabled, 0 for disabled. Default is in db structure and is normally set to 1."
|
echo " -s <0|1> Status. 1 for enabled, 0 for disabled. Default is in db structure and is normally set to 1."
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
|
@ -51,6 +52,18 @@ if [[ -n $quota ]]; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check for ratelimit update
|
||||||
|
if [[ -n $ratelimit ]]; then
|
||||||
|
# make ratelimit uppercase in case it is set to NULL
|
||||||
|
ratelimit=`echo $ratelimit | tr [:lower:] [:upper:]`
|
||||||
|
if [[ "$ratelimit" =~ ^[0-9]+$ ]] || [[ "$ratelimit" == "NULL" ]]; then
|
||||||
|
dbset=" mbox_ratelimit_default=$ratelimit"
|
||||||
|
else
|
||||||
|
echo "ERROR: ratelimit (-r) must numeric or NULL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# check for limit update
|
# check for limit update
|
||||||
if [[ -n $limit ]]; then
|
if [[ -n $limit ]]; then
|
||||||
# make limit uppercase in case it is set to NULL
|
# make limit uppercase in case it is set to NULL
|
||||||
|
|
|
@ -13,12 +13,13 @@ help()
|
||||||
echo "$thisfilename"
|
echo "$thisfilename"
|
||||||
echo "Add email account to vmail system"
|
echo "Add email account to vmail system"
|
||||||
echo ""
|
echo ""
|
||||||
echo "usage: $thisfilename -e <email> -p <password> [-q <quota>] [-s <0|1>] [-j <0|1|2>] [-h]"
|
echo "usage: $thisfilename -e <email> -p <password> [-q <quota>] [-r <ratelimit>] [-s <0|1>] [-j <0|1|2>] [-h]"
|
||||||
echo ""
|
echo ""
|
||||||
echo " -h Print this help."
|
echo " -h Print this help."
|
||||||
echo " -e <email> Email address to add."
|
echo " -e <email> Email address to add."
|
||||||
echo " -p <password> Unencrypted Password for new email address."
|
echo " -p <password> Unencrypted Password for new email address."
|
||||||
echo " -q <quota> Set mailbox quota in GB, otherwise default for this domain is used. NULL means no limit."
|
echo " -q <quota> Set mailbox quota in GB, otherwise default for this domain is used. NULL means no limit."
|
||||||
|
echo " -r <ratelimit> Hourly rate limit for sending, multiplied by 10 for the daily limit."
|
||||||
echo " -s <0|1> Status. 1 for enabled, 0 for disabled. Default is in db structure and is normally set to 1."
|
echo " -s <0|1> Status. 1 for enabled, 0 for disabled. Default is in db structure and is normally set to 1."
|
||||||
echo " -j <0|1|2> Filter Junk/Spam messages. 0 = no filtering. 1 = filter Junk only. 2 = filter Junk & Spam. Default is 2."
|
echo " -j <0|1|2> Filter Junk/Spam messages. 0 = no filtering. 1 = filter Junk only. 2 = filter Junk & Spam. Default is 2."
|
||||||
}
|
}
|
||||||
|
@ -69,6 +70,18 @@ if [ "$rowcount" -eq '0' ] ; then
|
||||||
echo "ERROR: quota (-q) must numeric or NULL"
|
echo "ERROR: quota (-q) must numeric or NULL"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
if [ -z "$ratelimit" ] ; then
|
||||||
|
# get mbox_ratelimit_default from domains table
|
||||||
|
ratelimit=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT mbox_ratelimit_default from vm_domains WHERE domain='$domain';"`
|
||||||
|
fi
|
||||||
|
if [[ "$ratelimit" == "NULL" ]]; then
|
||||||
|
dbcmd="$dbcmd, ratelimit=NULL"
|
||||||
|
elif [[ "$ratelimit" =~ ^[0-9]+$ ]]; then
|
||||||
|
dbcmd="$dbcmd, ratelimit=\"$ratelimit\""
|
||||||
|
else
|
||||||
|
echo "ERROR: ratelimit (-r) must numeric or NULL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
dbcmd="$dbcmd;'"
|
dbcmd="$dbcmd;'"
|
||||||
elif [ "$rowcount" -eq '1' ] ; then
|
elif [ "$rowcount" -eq '1' ] ; then
|
||||||
echo "ERROR: $email already exists in vmail database."
|
echo "ERROR: $email already exists in vmail database."
|
||||||
|
|
|
@ -48,7 +48,7 @@ dbquery="SELECT vm_mboxes.mbox, vm_domains.domain"
|
||||||
if [ -n "$verbose" ]; then
|
if [ -n "$verbose" ]; then
|
||||||
dbquery="$dbquery, vm_mboxes.passwd"
|
dbquery="$dbquery, vm_mboxes.passwd"
|
||||||
fi
|
fi
|
||||||
dbquery="$dbquery, vm_mboxes.status, vm_mboxes.quota, vm_mboxes.filter FROM vm_domains, vm_mboxes WHERE vm_domains.id=vm_mboxes.domain_id"
|
dbquery="$dbquery, vm_mboxes.status, vm_mboxes.quota, vm_mboxes.ratelimit, vm_mboxes.filter FROM vm_domains, vm_mboxes WHERE vm_domains.id=vm_mboxes.domain_id"
|
||||||
if [ -n "$mbox" ] && [ -n "$domain" ]; then
|
if [ -n "$mbox" ] && [ -n "$domain" ]; then
|
||||||
# search for specific email address
|
# search for specific email address
|
||||||
dbquery="$dbquery AND vm_domains.domain='$domain' AND vm_mboxes.mbox='$mbox'"
|
dbquery="$dbquery AND vm_domains.domain='$domain' AND vm_mboxes.mbox='$mbox'"
|
||||||
|
|
|
@ -19,6 +19,7 @@ help()
|
||||||
echo " -e <email> Email account to modify."
|
echo " -e <email> Email account to modify."
|
||||||
echo " -p <password> Set new password."
|
echo " -p <password> Set new password."
|
||||||
echo " -q <quota> Set mailbox quota in GB, otherwise default for this domain is used. NULL means no limit."
|
echo " -q <quota> Set mailbox quota in GB, otherwise default for this domain is used. NULL means no limit."
|
||||||
|
echo " -r <ratelimit> Hourly rate limit for sending, multiplied by 10 for the daily limit."
|
||||||
echo " -s <0|1> 1 for enabled, 0 for disabled. Default is in db structure and is normally set to 1."
|
echo " -s <0|1> 1 for enabled, 0 for disabled. Default is in db structure and is normally set to 1."
|
||||||
echo " -j <0|1|2> Filter Junk/Spam message. 0 = no filtering. 1 = filter Junk only. 2 = filter Junk & Spam. Default is 2."
|
echo " -j <0|1|2> Filter Junk/Spam message. 0 = no filtering. 1 = filter Junk only. 2 = filter Junk & Spam. Default is 2."
|
||||||
exit
|
exit
|
||||||
|
@ -55,6 +56,18 @@ if [ -n "$quota" ]; then
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# check for ratelimit update
|
||||||
|
if [ -n "$ratelimit" ]; then
|
||||||
|
# make ratelimit uppercase in case it is set to NULL
|
||||||
|
ratelimit=`echo $ratelimit | tr [:lower:] [:upper:]`
|
||||||
|
if [[ "$ratelimit" =~ ^[0-9]+$ ]] || [[ "$ratelimit" == "NULL" ]]; then
|
||||||
|
dbset=" ratelimit=$ratelimit"
|
||||||
|
else
|
||||||
|
echo "ERROR: ratelimit (-r) must numeric or NULL"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# check for password update
|
# check for password update
|
||||||
if [ ! -z "$password" ]; then
|
if [ ! -z "$password" ]; then
|
||||||
passwd=`doveadm -o stats_writer_socket_path= pw -s sha512-crypt -p "$password"`
|
passwd=`doveadm -o stats_writer_socket_path= pw -s sha512-crypt -p "$password"`
|
||||||
|
|
|
@ -85,7 +85,7 @@ function vmail::yesno() {
|
||||||
|
|
||||||
function vmail:getoptions () {
|
function vmail:getoptions () {
|
||||||
local OPTIND
|
local OPTIND
|
||||||
while getopts "ha:b:d:e:f:gj:cp:q:s:tk:gl:m:vx" opt ; do
|
while getopts "ha:b:d:e:f:gj:cp:q:r:s:tk:gl:m:vx" opt ; do
|
||||||
case "${opt}" in
|
case "${opt}" in
|
||||||
h ) # display help and exit
|
h ) # display help and exit
|
||||||
help
|
help
|
||||||
|
@ -181,6 +181,9 @@ function vmail:getoptions () {
|
||||||
q ) # quota
|
q ) # quota
|
||||||
quota=${OPTARG}
|
quota=${OPTARG}
|
||||||
;;
|
;;
|
||||||
|
r ) # ratelimit - hourly limit for sending, multiplied by 10 for daily limit
|
||||||
|
ratelimit=${OPTARG}
|
||||||
|
;;
|
||||||
s ) # status - 0 or 1
|
s ) # status - 0 or 1
|
||||||
status=${OPTARG}
|
status=${OPTARG}
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -364,11 +364,39 @@ acl_rcpt_to:
|
||||||
accept
|
accept
|
||||||
hosts = : +relay_from_hosts
|
hosts = : +relay_from_hosts
|
||||||
|
|
||||||
|
|
||||||
# Accept if the message arrived over an authenticated connection,
|
# Accept if the message arrived over an authenticated connection,
|
||||||
# from any host. Again, these messages are usually from MUAs, so
|
# from any host. Again, these messages are usually from MUAs, so
|
||||||
# recipient verification is omitted.
|
# recipient verification is omitted.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# Get rate limit for user and log current rate.
|
||||||
|
# Hourly rate limit is extracted from db, multiplied by 10 to get daily rate limit.
|
||||||
|
# The idea being that the hourly rate limit should be a maximum, peak rate, not a sustained rate.
|
||||||
|
# The default ratelimit of 100000 is meant to be so high as to never be reached (no limit).
|
||||||
|
# The primary purpose of rate limiting is fighting spam, either by an abusive user or a
|
||||||
|
# compromised account, not to restrict legitimate users. Set your defaults & limits accordignly.
|
||||||
|
warn
|
||||||
|
authenticated = *
|
||||||
|
set acl_m_ratelimit_hourly = ${lookup mysql{SELECT vm_mboxes.ratelimit FROM vm_domains, vm_mboxes WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_mboxes.ratelimit IS NOT NULL}{$value}{"100000"}}
|
||||||
|
set acl_m_ratelimit_daily = ${eval: $acl_m_ratelimit_hourly * 10}
|
||||||
|
ratelimit = 0 / 1h / per_mail / strict / $authenticated_id
|
||||||
|
log_message = Sender rate $sender_rate/$sender_rate_period for $authenticated_id
|
||||||
|
|
||||||
|
# enforce hourly rate limit
|
||||||
|
deny
|
||||||
|
authenticated = *
|
||||||
|
ratelimit = $acl_m_ratelimit_hourly / 1h / per_mail / strict / $authenticated_id
|
||||||
|
message = Rate Limit of $sender_rate/$sender_rate_period exceeded. Try again later.
|
||||||
|
log_message = $authenticated_id exceeded rate limit of $sender_rate/$sender_rate_period
|
||||||
|
|
||||||
|
# enforce daily rate limit
|
||||||
|
deny
|
||||||
|
authenticated = *
|
||||||
|
ratelimit = $acl_m_ratelimit_daily / 1d / per_mail / strict / $authenticated_id
|
||||||
|
message = Rate Limit of $sender_rate/$sender_rate_period exceeded. Try again later.
|
||||||
|
log_message = $authenticated_id exceeded rate limit of $sender_rate/$sender_rate_period
|
||||||
|
|
||||||
|
# authenticated user did not exceed rate limits, accept message now
|
||||||
accept
|
accept
|
||||||
authenticated = *
|
authenticated = *
|
||||||
|
|
||||||
|
|
226
vmail.sql
226
vmail.sql
|
@ -4,17 +4,9 @@ SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
SET time_zone = "+00:00";
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
||||||
/*!40101 SET NAMES utf8mb4 */;
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Database: `vmail`
|
-- Database: `vmail`
|
||||||
--
|
--
|
||||||
CREATE DATABASE IF NOT EXISTS `vmail` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
|
|
||||||
USE `vmail`;
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -22,114 +14,77 @@ USE `vmail`;
|
||||||
-- Table structure for table `vm_aliases`
|
-- Table structure for table `vm_aliases`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_aliases` (
|
CREATE TABLE `vm_aliases` (
|
||||||
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` int(10) UNSIGNED NOT NULL,
|
||||||
`mbox_id` int(10) UNSIGNED NOT NULL,
|
`mbox_id` int(10) UNSIGNED NOT NULL,
|
||||||
`alias` varchar(128) NOT NULL,
|
`alias` varchar(128) NOT NULL
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `mbox_delete_aliases` (`mbox_id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_aliases`:
|
|
||||||
-- `mbox_id`
|
|
||||||
-- `vm_mboxes` -> `id`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_autoresponders`
|
-- Table structure for table `vm_autoresponders`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_autoresponders` (
|
CREATE TABLE `vm_autoresponders` (
|
||||||
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` int(10) UNSIGNED NOT NULL,
|
||||||
`mbox_id` int(10) UNSIGNED NOT NULL,
|
`mbox_id` int(10) UNSIGNED NOT NULL,
|
||||||
`subject` varchar(128) NOT NULL,
|
`subject` varchar(128) NOT NULL,
|
||||||
`body` text NOT NULL,
|
`body` text NOT NULL,
|
||||||
`mode` enum('Vacation','Autoresponder') NOT NULL,
|
`mode` enum('Vacation','Autoresponder') NOT NULL,
|
||||||
`status` tinyint(1) NOT NULL DEFAULT 1,
|
`status` tinyint(1) NOT NULL DEFAULT 1,
|
||||||
`start` datetime DEFAULT NULL,
|
`start` datetime DEFAULT NULL,
|
||||||
`end` datetime DEFAULT NULL,
|
`end` datetime DEFAULT NULL
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
UNIQUE KEY `autoresponder` (`mbox_id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_autoresponders`:
|
|
||||||
-- `mbox_id`
|
|
||||||
-- `vm_mboxes` -> `id`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_domains`
|
-- Table structure for table `vm_domains`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_domains` (
|
CREATE TABLE `vm_domains` (
|
||||||
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` int(11) UNSIGNED NOT NULL,
|
||||||
`domain` varchar(255) NOT NULL,
|
`domain` varchar(255) NOT NULL,
|
||||||
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1 for enabled, 0 for disabled',
|
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1 for enabled, 0 for disabled',
|
||||||
`mbox_limit` smallint(6) UNSIGNED DEFAULT NULL COMMENT 'Maximum number of mailboxes for this domain',
|
`mbox_limit` smallint(6) UNSIGNED DEFAULT 10 COMMENT 'Maximum number of mailboxes for this domain',
|
||||||
`mbox_quota_default` smallint(6) UNSIGNED DEFAULT NULL COMMENT 'Default mailbox quota in GB',
|
`mbox_quota_default` smallint(6) UNSIGNED DEFAULT 1 COMMENT 'Default mailbox quota in GB',
|
||||||
PRIMARY KEY (`id`),
|
`mbox_ratelimit_default` smallint(6) DEFAULT 120 COMMENT 'Default hourly rate limit for new mboxes'
|
||||||
KEY `domain` (`domain`(191))
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_domains`:
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_filters`
|
-- Table structure for table `vm_filters`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_filters` (
|
CREATE TABLE `vm_filters` (
|
||||||
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` int(10) UNSIGNED NOT NULL,
|
||||||
`mbox_id` int(11) UNSIGNED NOT NULL,
|
`mbox_id` int(11) UNSIGNED NOT NULL,
|
||||||
`filter` text NOT NULL,
|
`filter` text NOT NULL
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `mbox_delete_filters` (`mbox_id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_filters`:
|
|
||||||
-- `mbox_id`
|
|
||||||
-- `vm_mboxes` -> `id`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_forwards`
|
-- Table structure for table `vm_forwards`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_forwards` (
|
CREATE TABLE `vm_forwards` (
|
||||||
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` int(10) UNSIGNED NOT NULL,
|
||||||
`mbox_id` int(10) UNSIGNED NOT NULL,
|
`mbox_id` int(10) UNSIGNED NOT NULL,
|
||||||
`forward_to` varchar(128) NOT NULL,
|
`forward_to` varchar(128) NOT NULL,
|
||||||
`save_local` tinyint(1) NOT NULL DEFAULT 0,
|
`save_local` tinyint(1) NOT NULL DEFAULT 0
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
UNIQUE KEY `mbox_id` (`mbox_id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_forwards`:
|
|
||||||
-- `mbox_id`
|
|
||||||
-- `vm_mboxes` -> `id`
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_greylisting`
|
-- Table structure for table `vm_greylisting`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_greylisting` (
|
CREATE TABLE `vm_greylisting` (
|
||||||
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` bigint(20) UNSIGNED NOT NULL,
|
||||||
`relay_hostname` varchar(255) DEFAULT NULL,
|
`relay_hostname` varchar(255) DEFAULT NULL,
|
||||||
`relay_ip` varchar(80) DEFAULT NULL,
|
`relay_ip` varchar(80) DEFAULT NULL,
|
||||||
`sender` varchar(255) DEFAULT NULL,
|
`sender` varchar(255) DEFAULT NULL,
|
||||||
|
@ -140,56 +95,151 @@ CREATE TABLE IF NOT EXISTS `vm_greylisting` (
|
||||||
`create_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
`create_time` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||||
`type` enum('AUTO','MANUAL') NOT NULL DEFAULT 'MANUAL',
|
`type` enum('AUTO','MANUAL') NOT NULL DEFAULT 'MANUAL',
|
||||||
`passcount` bigint(20) NOT NULL DEFAULT 0,
|
`passcount` bigint(20) NOT NULL DEFAULT 0,
|
||||||
`blockcount` bigint(20) NOT NULL DEFAULT 0,
|
`blockcount` bigint(20) NOT NULL DEFAULT 0
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_greylisting`:
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_greylisting_resenders`
|
-- Table structure for table `vm_greylisting_resenders`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_greylisting_resenders` (
|
CREATE TABLE `vm_greylisting_resenders` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
`id` bigint(20) NOT NULL,
|
||||||
`hostname` varchar(255) NOT NULL,
|
`hostname` varchar(255) NOT NULL,
|
||||||
`count` bigint(20) UNSIGNED NOT NULL DEFAULT 1,
|
`count` bigint(20) UNSIGNED NOT NULL DEFAULT 1,
|
||||||
`timestamp` timestamp NOT NULL DEFAULT current_timestamp(),
|
`timestamp` timestamp NOT NULL DEFAULT current_timestamp()
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_greylisting_resenders`:
|
|
||||||
--
|
|
||||||
|
|
||||||
-- --------------------------------------------------------
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `vm_mboxes`
|
-- Table structure for table `vm_mboxes`
|
||||||
--
|
--
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `vm_mboxes` (
|
CREATE TABLE `vm_mboxes` (
|
||||||
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
`id` int(10) UNSIGNED NOT NULL,
|
||||||
`domain_id` int(10) UNSIGNED NOT NULL,
|
`domain_id` int(10) UNSIGNED NOT NULL,
|
||||||
`mbox` varchar(128) NOT NULL,
|
`mbox` varchar(128) NOT NULL,
|
||||||
|
`username` varchar(128) NOT NULL,
|
||||||
`passwd` char(128) NOT NULL,
|
`passwd` char(128) NOT NULL,
|
||||||
`status` tinyint(1) NOT NULL DEFAULT 1,
|
`status` tinyint(1) NOT NULL DEFAULT 1,
|
||||||
`quota` int(10) UNSIGNED DEFAULT NULL,
|
`quota` int(10) UNSIGNED DEFAULT NULL,
|
||||||
`filter` tinyint(1) NOT NULL DEFAULT 2,
|
`ratelimit` smallint(6) DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
`filter` tinyint(4) NOT NULL DEFAULT 2
|
||||||
KEY `email` (`domain_id`,`mbox`) USING BTREE
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- RELATIONSHIPS FOR TABLE `vm_mboxes`:
|
-- Indexes for dumped tables
|
||||||
-- `domain_id`
|
|
||||||
-- `vm_domains` -> `id`
|
|
||||||
--
|
--
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_aliases`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_aliases`
|
||||||
|
ADD PRIMARY KEY (`id`),
|
||||||
|
ADD KEY `mbox_delete_aliases` (`mbox_id`);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_autoresponders`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_autoresponders`
|
||||||
|
ADD PRIMARY KEY (`id`),
|
||||||
|
ADD UNIQUE KEY `autoresponder` (`mbox_id`);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_domains`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_domains`
|
||||||
|
ADD PRIMARY KEY (`id`),
|
||||||
|
ADD KEY `domain` (`domain`(191));
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_filters`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_filters`
|
||||||
|
ADD PRIMARY KEY (`id`),
|
||||||
|
ADD KEY `mbox_delete_filters` (`mbox_id`);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_forwards`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_forwards`
|
||||||
|
ADD PRIMARY KEY (`id`),
|
||||||
|
ADD UNIQUE KEY `mbox_id` (`mbox_id`);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_greylisting`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_greylisting`
|
||||||
|
ADD PRIMARY KEY (`id`);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_greylisting_resenders`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_greylisting_resenders`
|
||||||
|
ADD PRIMARY KEY (`id`);
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Indexes for table `vm_mboxes`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_mboxes`
|
||||||
|
ADD PRIMARY KEY (`id`),
|
||||||
|
ADD UNIQUE KEY `username` (`username`),
|
||||||
|
ADD KEY `email` (`domain_id`,`mbox`) USING BTREE;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for dumped tables
|
||||||
|
--
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_aliases`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_aliases`
|
||||||
|
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_autoresponders`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_autoresponders`
|
||||||
|
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_domains`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_domains`
|
||||||
|
MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_filters`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_filters`
|
||||||
|
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_forwards`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_forwards`
|
||||||
|
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_greylisting`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_greylisting`
|
||||||
|
MODIFY `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_greylisting_resenders`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_greylisting_resenders`
|
||||||
|
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- AUTO_INCREMENT for table `vm_mboxes`
|
||||||
|
--
|
||||||
|
ALTER TABLE `vm_mboxes`
|
||||||
|
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Constraints for dumped tables
|
-- Constraints for dumped tables
|
||||||
--
|
--
|
||||||
|
@ -224,7 +274,3 @@ ALTER TABLE `vm_forwards`
|
||||||
ALTER TABLE `vm_mboxes`
|
ALTER TABLE `vm_mboxes`
|
||||||
ADD CONSTRAINT `domain_delete_mboxes` FOREIGN KEY (`domain_id`) REFERENCES `vm_domains` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
|
ADD CONSTRAINT `domain_delete_mboxes` FOREIGN KEY (`domain_id`) REFERENCES `vm_domains` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
||||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
||||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user