alter vmail db schema

This commit is contained in:
Matthew Saunders Brown 2022-11-29 16:33:15 -08:00
parent 68311ad97b
commit d064fcba84
24 changed files with 266 additions and 232 deletions

47
altervmail.sql Normal file
View File

@ -0,0 +1,47 @@
-- add & populate new columns
ALTER TABLE vm_mboxes ADD domain VARCHAR(255) NOT NULL AFTER mbox;
UPDATE vm_mboxes SET vm_mboxes.domain = ( SELECT vm_domains.domain FROM vm_domains WHERE vm_domains.id = vm_mboxes.domain_id );
ALTER TABLE vm_aliases ADD mbox VARCHAR(128) NOT NULL AFTER mbox_id;
ALTER TABLE vm_aliases ADD domain VARCHAR(255) NOT NULL AFTER mbox;
UPDATE vm_aliases SET vm_aliases.mbox = ( SELECT vm_mboxes.mbox FROM vm_mboxes WHERE vm_mboxes.id = vm_aliases.mbox_id );
UPDATE vm_aliases SET vm_aliases.domain = ( SELECT vm_domains.domain FROM vm_domains, vm_mboxes WHERE vm_mboxes.id = vm_aliases.mbox_id AND vm_domains.id = vm_mboxes.domain_id );
ALTER TABLE vm_autoresponders ADD mbox VARCHAR(128) NOT NULL AFTER mbox_id;
ALTER TABLE vm_autoresponders ADD domain VARCHAR(255) NOT NULL AFTER mbox;
UPDATE vm_autoresponders SET vm_autoresponders.mbox = ( SELECT vm_mboxes.mbox FROM vm_mboxes WHERE vm_mboxes.id = vm_autoresponders.mbox_id );
UPDATE vm_autoresponders SET vm_autoresponders.domain = ( SELECT vm_domains.domain FROM vm_domains, vm_mboxes WHERE vm_mboxes.id = vm_autoresponders.mbox_id AND vm_domains.id = vm_mboxes.domain_id );
ALTER TABLE vm_filters ADD mbox VARCHAR(128) NOT NULL AFTER mbox_id;
ALTER TABLE vm_filters ADD domain VARCHAR(255) NOT NULL AFTER mbox;
UPDATE vm_filters SET vm_filters.mbox = ( SELECT vm_mboxes.mbox FROM vm_mboxes WHERE vm_mboxes.id = vm_filters.mbox_id );
UPDATE vm_filters SET vm_filters.domain = ( SELECT vm_domains.domain FROM vm_domains, vm_mboxes WHERE vm_mboxes.id = vm_filters.mbox_id AND vm_domains.id = vm_mboxes.domain_id );
ALTER TABLE vm_forwards ADD mbox VARCHAR(128) NOT NULL AFTER mbox_id;
ALTER TABLE vm_forwards ADD domain VARCHAR(255) NOT NULL AFTER mbox;
UPDATE vm_forwards SET vm_forwards.mbox = ( SELECT vm_mboxes.mbox FROM vm_mboxes WHERE vm_mboxes.id = vm_forwards.mbox_id );
UPDATE vm_forwards SET vm_forwards.domain = ( SELECT vm_domains.domain FROM vm_domains, vm_mboxes WHERE vm_mboxes.id = vm_forwards.mbox_id AND vm_domains.id = vm_mboxes.domain_id );
-- drop foreign keys
ALTER TABLE vm_mboxes DROP FOREIGN KEY domain_delete_mboxes;
ALTER TABLE vm_aliases DROP FOREIGN KEY mbox_delete_aliases;
ALTER TABLE vm_autoresponders DROP FOREIGN KEY mbox_delete_autoresponders;
ALTER TABLE vm_filters DROP FOREIGN KEY mbox_delete_filters;
ALTER TABLE vm_forwards DROP FOREIGN KEY mbox_delete_forwards;
-- update indexes
ALTER TABLE vm_domains DROP INDEX domain, ADD UNIQUE domain (domain) USING BTREE;
ALTER TABLE vm_mboxes DROP INDEX email, ADD UNIQUE email (mbox, domain) USING BTREE;
ALTER TABLE vm_aliases ADD INDEX email (mbox, domain) USING BTREE;
ALTER TABLE vm_aliases ADD UNIQUE alias (mbox, domain, alias) USING BTREE;
ALTER TABLE vm_autoresponders ADD UNIQUE email (mbox, domain) USING BTREE;
ALTER TABLE vm_filters ADD UNIQUE email (mbox, domain) USING BTREE;
ALTER TABLE vm_forwards ADD UNIQUE email (mbox, domain) USING BTREE;
-- add new foreign keys
ALTER TABLE vm_mboxes ADD CONSTRAINT domain_delete_mboxes FOREIGN KEY (domain) REFERENCES vm_domains(domain) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE vm_aliases ADD CONSTRAINT mbox_delete_aliases FOREIGN KEY (mbox, domain) REFERENCES vm_mboxes(mbox, domain) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE vm_autoresponders ADD CONSTRAINT mbox_delete_autoresponders FOREIGN KEY (mbox, domain) REFERENCES vm_mboxes(mbox, domain) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE vm_filters ADD CONSTRAINT mbox_delete_filters FOREIGN KEY (mbox, domain) REFERENCES vm_mboxes(mbox, domain) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE vm_forwards ADD CONSTRAINT mbox_delete_forwards FOREIGN KEY (mbox, domain) REFERENCES vm_mboxes(mbox, domain) ON DELETE CASCADE ON UPDATE NO ACTION;
-- delete deprecated table columns & indexes
ALTER TABLE vm_mboxes DROP domain_id;
ALTER TABLE vm_aliases DROP mbox_id;
ALTER TABLE vm_autoresponders DROP mbox_id;
ALTER TABLE vm_filters DROP mbox_id;
ALTER TABLE vm_forwards DROP mbox_id;

View File

@ -48,21 +48,21 @@ if [ -z $domain_id ] ; then
exit 1
fi
# get mbox id, which also verfies that email address exists
mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id FROM vm_mboxes WHERE domain_id='$domain_id' AND mbox='$mbox';"`
# get mbox id which verfies that email address exists
mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id FROM vm_mboxes WHERE mbox='$mbox' AND domain='$domain';"`
if [[ -z $mbox_id ]]; then
# mbox does not exist, can't create alias
echo "ERROR: Address to Alias To ($email) does not exist."
exit 1
elif [[ $mbox_id -gt 0 ]]; then
# verified mbox, check for existing alias
existing_alias=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT vm_aliases.id FROM vm_aliases WHERE vm_aliases.alias='$alias' AND vm_aliases.mbox_id='$mbox_id';"`
existing_alias=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT vm_aliases.id FROM vm_aliases WHERE vm_aliases.alias='$alias' AND mbox='$mbox' AND domain='$domain';"`
if [[ -z $existing_alias ]]; then
# existing alias does not exist, make sure mbox with alias name does not exist
alias_mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id FROM vm_mboxes WHERE domain_id='$domain_id' AND mbox='$alias';"`
alias_mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id FROM vm_mboxes WHERE mbox='$alias' AND domain='$domain';"`
if [[ -z $alias_mbox_id ]]; then
# mailbox does not exist, add alias
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -e 'INSERT INTO vm_aliases SET vm_aliases.alias=\"$alias\", vm_aliases.mbox_id=\"$mbox_id\";'"
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -e 'INSERT INTO vm_aliases SET mbox=\"$mbox\", domain=\"$domain\", alias=\"$alias\";'"
eval $dbcmd
else
echo "ERROR: Email account $alias@$domain exists, can't create alias with the same name."

View File

@ -42,14 +42,13 @@ dbcmdopts="-s -r -N -e"
# if email set delete single alias
if [[ -n $email ]]; then
# get aliases id which also works to confirm alias exists
dbquery="SELECT vm_aliases.id FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.alias='$alias' AND vm_aliases.mbox_id=vm_mboxes.id AND vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain'"
vm_aliases_id=`$dbcmd $dbcmdopts "$dbquery"`
if [[ -z $vm_aliases_id ]]; then
dbquery="SELECT id FROM vm_aliases WHERE alias='$alias' AND mbox='$mbox' AND domain='$domain'"
aliases_id=`$dbcmd $dbcmdopts "$dbquery"`
if [[ -z $aliases_id ]]; then
echo "ERROR: Alias $alias@$domain -> $email does not exist."
exit 1
elif [ "$vm_aliases_id" -gt '0' ]; then
dbquery="DELETE FROM vm_aliases WHERE vm_aliases.id='$vm_aliases_id'"
echo $dbquery
elif [ "$aliases_id" -gt '0' ]; then
dbquery="DELETE FROM vm_aliases WHERE id='$aliases_id'"
eval $dbcmd $dbcmdopts "\"$dbquery\""
echo "SUCCESS: Alias $alias@$domain -> $email removed from system."
exit 0
@ -60,14 +59,14 @@ if [[ -n $email ]]; then
# if domain set then delete any and all aliases
elif [[ -n $domain ]]; then
# get alias id array
dbquery="SELECT vm_aliases.id FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.alias='$alias' AND vm_aliases.mbox_id=vm_mboxes.id AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain'"
mapfile -t vm_alias_ids < <( $dbcmd $dbcmdopts "$dbquery" )
if [[ -z $vm_alias_ids ]]; then
dbquery="SELECT id FROM vm_aliases WHERE alias='$alias' AND domain='$domain'"
mapfile -t aliases_ids < <( $dbcmd $dbcmdopts "$dbquery" )
if [[ -z $aliases_ids ]]; then
echo "ERROR: Alias $alias@$domain does not exist."
exit 1
elif [[ ${#vm_alias_ids[@]} -gt '0' ]]; then
for vm_alias_id in "${vm_alias_ids[@]}"; do
dbquery="DELETE FROM vm_aliases WHERE vm_aliases.id='$vm_alias_id'"
elif [[ ${#aliases_ids[@]} -gt '0' ]]; then
for aliases_id in "${aliases_ids[@]}"; do
dbquery="DELETE FROM vm_aliases WHERE id='$aliases_id'"
eval $dbcmd $dbcmdopts "\"$dbquery\""
done
echo "SUCCESS: Alias(s) for $alias@$domain removed from system."

View File

@ -35,7 +35,7 @@ vmail:getoptions "$@"
# set initial db query data
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-e"
dbquery="SELECT vm_aliases.alias, vm_mboxes.mbox, vm_domains.domain FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.mbox_id = vm_mboxes.id AND vm_mboxes.domain_id = vm_domains.id"
dbquery="SELECT alias, mbox, domain FROM vm_aliases"
if [[ -n $tab ]]; then
dbcmdopts="-s -N $dbcmdopts"
@ -43,22 +43,22 @@ fi
if [[ -n $alias ]]; then
if [[ -n $domain ]] ; then
dbquery="$dbquery AND vm_aliases.alias='$alias' AND vm_domains.domain='$domain'"
dbquery="$dbquery WHERE alias='$alias' AND domain='$domain'"
else
echo "ERROR: alias should be in full email address format."
exit 1
fi
elif [[ -n $email ]]; then
dbquery="$dbquery AND vm_mboxes.mbox='$mbox' AND vm_domains.domain='$domain'"
dbquery="$dbquery WHERE mbox='$mbox' AND domain='$domain'"
elif [[ -n $domain ]]; then
dbquery="$dbquery AND vm_domains.domain='$domain'"
dbquery="$dbquery WHERE domain='$domain'"
else
echo "You must specify either <alias> or <email> or <domain>."
exit 1
fi
# set order by
dbquery="$dbquery ORDER BY vm_domains.domain, vm_mboxes.mbox, vm_aliases.alias;";
dbquery="$dbquery ORDER BY domain, mbox, alias;";
# execute mysql query
eval $dbcmd $dbcmdopts "\"$dbquery\"" $cvs

View File

@ -54,21 +54,21 @@ fi
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get mbox id, which also verfies that email address exists
dbquery="SELECT vm_mboxes.id FROM vm_mboxes, vm_domains WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain';"
# get mbox id, which verfies that email address exists
dbquery="SELECT id FROM vm_mboxes WHERE mbox='$mbox' AND domain='$domain';"
mbox_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $mbox_id ]; then
if [[ -z $mbox_id ]]; then
# mailbox does not exist
echo "ERROR: Email account $email does not exist."
exit 1
elif [ "$mbox_id" -gt '0' ]; then
# verified mbox, check for existing forward
dbquery="SELECT id FROM vm_autoresponders WHERE mbox_id='$mbox_id';"
vm_autoresponders_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $vm_autoresponders_id ]; then
# verified mbox, check for existing autoresponder
dbquery="SELECT id FROM vm_autoresponders WHERE mbox='$mbox' AND domain='$domain';"
autoresponder_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [[ -z $autoresponder_id ]]; then
# no autoresponder, add new one now
dbquery="INSERT INTO vm_autoresponders SET mbox_id='$mbox_id', subject='$subject', body='$body'"
dbquery="INSERT INTO vm_autoresponders SET mbox='$mbox', domain='$domain', subject='$subject', body='$body'"
if [ ! -z $mode ]; then
dbquery="$dbquery, mode='$mode'"
fi
@ -76,9 +76,13 @@ elif [ "$mbox_id" -gt '0' ]; then
dbquery="$dbquery, status='$status'"
fi
eval $dbcmd $dbcmdopts \"$dbquery\;\"
else
elif [ "$autoresponder_id" -gt '0' ]; then
echo "ERROR: Autoresponder for $email already exists, edit or delete and re-create instead."
exit 1
else
# db query error
echo "ERROR: System error querying database."
exit 1
fi
else
# db query error

View File

@ -34,7 +34,7 @@ dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get autoresponders id which also works to confirm autoresponder exists
dbquery="SELECT vm_autoresponders.id FROM vm_autoresponders, vm_mboxes, vm_domains WHERE vm_autoresponders.mbox_id=vm_mboxes.id AND vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain';"
dbquery="SELECT id FROM vm_autoresponders WHERE mbox='$mbox' AND domain='$domain';"
vm_autoresponders_id=`$dbcmd $dbcmdopts "$dbquery"`
if [ -z "$vm_autoresponders_id" ]; then

View File

@ -23,21 +23,13 @@ help()
echo " -t Use tabs instead of tables for output, do not display column headers."
echo ""
echo " Search term is optional. If nothing specified all forwards for all email acccounts for all domains will be returned."
echo " Enter email address to get forward info for that email address."
echo " Enter forwarding address (in full email address format) with the -f option to get address(es) that forward to specified address."
echo " Enter domain name to get all forwards for all email addresses under that domain."
echo " Enter email address to get autoresponder info for that email address."
echo " Enter domain name to get all autoresponders for all email addresses under that domain."
exit
}
vmail:getoptions "$@"
# check for domain (which will aslo be set if email is specified)
if [[ -z $domain ]]; then
echo "Domian Name or Email is required."
exit 1
fi
# set initial db query data
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-e"
@ -46,13 +38,19 @@ if [[ -n $tab ]]; then
dbcmdopts="-s -N $dbcmdopts"
fi
dbquery="SELECT vm_mboxes.mbox, vm_domains.domain, QUOTE(vm_autoresponders.subject) AS subject, QUOTE(REPLACE(REPLACE(vm_autoresponders.body,'\r\n','\n'),'\n','\\n')) AS body, vm_autoresponders.mode, vm_autoresponders.status FROM vm_autoresponders, vm_mboxes, vm_domains WHERE vm_autoresponders.mbox_id = vm_mboxes.id AND vm_mboxes.domain_id = vm_domains.id AND vm_domains.domain='$domain'"
# build query
dbquery="SELECT mbox, domain, QUOTE(subject) AS subject, QUOTE(REPLACE(REPLACE(body,'\r\n','\n'),'\n','\\n')) AS body, mode, status FROM vm_autoresponders"
# set search options
if [[ -n $email ]]; then
# search for specific autoresponder
dbquery="$dbquery AND vm_mboxes.mbox='$mbox' ORDER BY vm_mboxes.mbox"
dbquery="$dbquery WHERE mbox='$mbox' AND domain='$domain'"
elif [[ -n $domain ]]; then
# get all autoresponders for given domain
dbquery="$dbquery WHERE domain='$domain'"
fi
# sort results
dbquery="$dbquery ORDER BY domain, mbox"
# execute mysql query
eval $dbcmd $dbcmdopts "\"$dbquery\"" $cvs

View File

@ -40,7 +40,7 @@ fi
# check for options
if [[ -z $subject && -z $body && -z $mode && -z $status ]]; then
echo "One or more options to update must be specified"
echo "One or more options to update must be specified."
exit 1
fi
@ -48,25 +48,17 @@ fi
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get mbox id, which also verfies that email address exists
dbquery="SELECT vm_mboxes.id FROM vm_mboxes, vm_domains WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain';"
mbox_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
# get autoresponder id, which also verfies that the autoresponder exists
dbquery="SELECT id FROM vm_autoresponders WHERE mbox='$mbox' AND domain='$domain';"
autoresponder_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $mbox_id ]; then
# mailbox does not exist
echo "ERROR: Email account $email does not exist."
exit 1
elif [ "$mbox_id" -gt '0' ]; then
# verified mbox, check for existing forward
dbquery="SELECT id FROM vm_autoresponders WHERE mbox_id='$mbox_id';"
vm_autoresponders_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $vm_autoresponders_id ]; then
# existing autoresponder does not exist, can't modify
if [[ -z $autoresponder_id ]]; then
# autoresponder does not exist
echo "ERROR: Autoresponder for $email does not exists, can't edit. Add new autoresponder instead."
exit 1
else
# start update by re-setting mbox_id, doesn't change anything, just facilitates following code
dbquery="UPDATE vm_autoresponders SET mbox_id='$mbox_id'"
# build update query (set id is just to facilitate building query)
dbquery="UPDATE vm_autoresponders SET id='$autoresponder_id'"
if [ ! -z "$subject" ]; then
dbquery="$dbquery, subject='$subject'"
fi
@ -79,11 +71,6 @@ elif [ "$mbox_id" -gt '0' ]; then
if [ ! -z $status ]; then
dbquery="$dbquery, status='$status'"
fi
dbquery="$dbquery WHERE vm_autoresponders.id='$vm_autoresponders_id'"
dbquery="$dbquery WHERE id='$autoresponder_id'"
eval $dbcmd $dbcmdopts \"$dbquery\;\"
fi
else
# db query error
echo "ERROR: System error querying database."
exit 1
fi

View File

@ -39,7 +39,6 @@ fi
# set initial db query data
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts=" -s -r -N -e"
dbquery="SELECT * from vm_domains"
# check if vmail domain dir exits
if [ -d $VMAIL_DIR/$domain ]; then
@ -48,21 +47,20 @@ if [ -d $VMAIL_DIR/$domain ]; then
fi
# check if domain exists in vmail database
dbquery="SELECT COUNT(*) from vm_domains WHERE domain='$domain';";
rowcount=`$dbcmd $dbcmdopts "$dbquery"`
if [ "$rowcount" -eq '0' ] ; then
dbquery="SELECT id from vm_domains WHERE domain='$domain';";
domains_id=`$dbcmd $dbcmdopts "$dbquery"`
if [[ -z $domains_id ]]; then
# looks good, build SQL
dbquery="INSERT INTO vm_domains SET domain='$domain'";
cmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -e \"INSERT INTO vm_domains SET domain='$domain'\""
if [ ! -z "$status" ] ; then
if [ "$status" == 0 ] || [ "$status" == 1 ]; then
if [[ ! -z "$status" ]] ; then
if [[ "$status" == 0 ]] || [[ "$status" == 1 ]]; then
dbquery="$dbquery, status='$status'"
else
echo "ERROR: status (-s) must be 1 or 0"
exit 1
fi
fi
if [ ! -z "$limit" ] ; then
if [[ ! -z "$limit" ]] ; then
if [[ "$limit" == "NULL" ]]; then
dbquery="$dbquery, mbox_limit=NULL"
elif [[ "$limit" =~ ^[0-9]+$ ]]; then
@ -72,7 +70,7 @@ if [ "$rowcount" -eq '0' ] ; then
exit 1
fi
fi
if [ ! -z "$quota" ] ; then
if [[ ! -z "$quota" ]] ; then
if [[ "$quota" == "NULL" ]]; then
dbquery="$dbquery, mbox_quota_default=NULL"
elif [[ "$quota" =~ ^[0-9]+$ ]]; then
@ -82,7 +80,7 @@ if [ "$rowcount" -eq '0' ] ; then
exit 1
fi
fi
if [ ! -z "$ratelimit" ] ; then
if [[ ! -z "$ratelimit" ]] ; then
if [[ "$ratelimit" == "NULL" ]]; then
dbquery="$dbquery, mbox_ratelimit_default=NULL"
elif [[ "$ratelimit" =~ ^[0-9]+$ ]]; then
@ -92,17 +90,16 @@ if [ "$rowcount" -eq '0' ] ; then
exit 1
fi
fi
dbquery="$dbquery;"
# add domain to vmail database
eval $dbcmd $dbcmdopts "\"$dbquery\""
# create vmail directory for domain
if [ ! -d "$VMAIL_DIR" ] ; then
if [[ ! -d "$VMAIL_DIR" ]] ; then
install -o vmail -g vmail -m 750 -d $VMAIL_DIR
fi
if [ ! -d "$VMAIL_DIR/$domain" ] ; then
if [[ ! -d "$VMAIL_DIR/$domain" ]] ; then
install -o vmail -g vmail -m 750 -d $VMAIL_DIR/$domain
fi
elif [ "$rowcount" -eq '1' ] ; then
elif [[ "$domains_id" -gt 0 ]] ; then
echo "ERROR: $domain already exists in vmail database."
exit 1
else

View File

@ -34,10 +34,10 @@ dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# check if domain exists in vmail database
dbquery="SELECT COUNT(*) FROM vm_domains WHERE domain='$domain';"
rowcount=`$dbcmd $dbcmdopts "$dbquery"`
dbquery="SELECT id FROM vm_domains WHERE domain='$domain';"
domains_id=`$dbcmd $dbcmdopts "$dbquery"`
if [ "$rowcount" -eq '1' ] ; then
if [[ "$domains_id" -gt '0' ]] ; then
# domain exists, delete from all vmail tables
# single delete should be sufficient for vm_* tables due to ON DELETE CASCADE foreign key references
dbquery="DELETE FROM vm_domains WHERE domain='$domain';"
@ -49,7 +49,7 @@ if [ "$rowcount" -eq '1' ] ; then
# this should be sufficient for rc due to ON DELETE CASCADE foreign key references
dbquery="DELETE FROM rc_users WHERE username LIKE '%@$domain';"
eval $dbcmd $dbcmdopts "\"$dbquery\""
elif [ "$rowcount" -eq '0' ] ; then
elif [[ -z $domains_id ]] ; then
echo "ERROR: $domain does not exist in vmail database."
exit 1
else

View File

@ -36,13 +36,13 @@ dbcmdopts="-e"
if [[ -n $tab ]]; then
dbcmdopts="-s -N $dbcmdopts"
fi
dbquery="SELECT domain, status, mbox_limit, (SELECT COUNT(*) FROM vm_mboxes WHERE vm_mboxes.domain_id = vm_domains.id) as mbox_allocated, mbox_quota_default, mbox_ratelimit_default FROM vm_domains"
dbquery="SELECT domain, status, mbox_limit, (SELECT COUNT(*) FROM vm_mboxes WHERE vm_mboxes.domain = vm_domains.domain) as mbox_allocated, mbox_quota_default, mbox_ratelimit_default from vm_domains"
# build query
if [[ -n $domain ]]; then
dbquery="$dbquery WHERE domain='$domain'"
elif [[ -n $glob ]]; then
dbquery="$dbquery WHERE domain LIKE '%$domain%'"
dbquery="$dbquery WHERE domain LIKE '%$glob%'"
fi
# sort results by domain name

View File

@ -28,7 +28,7 @@ vmail:getoptions "$@"
# check for domain
if [[ -n $domain ]]; then
domain_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id from vm_domains WHERE vm_domains.domain='$domain';"`
domain_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id from vm_domains WHERE domain='$domain';"`
if [ -z $domain_id ] ; then
echo "ERROR: Email domain $domain does not exist."
exit

View File

@ -47,22 +47,22 @@ fi
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get mbox id, which also verfies that email address exists
dbquery="SELECT vm_mboxes.id FROM vm_mboxes, vm_domains WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain';"
# get mbox id, which verfies that email address exists
dbquery="SELECT id FROM vm_mboxes WHERE mbox='$mbox' AND domain='$domain';"
mbox_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $mbox_id ]; then
if [[ -z $mbox_id ]]; then
# mbox does not exist, can't create forward
echo "ERROR: Address to Forward ($email) does not exist."
exit 1
elif [ "$mbox_id" -gt '0' ]; then
elif [[ $mbox_id -gt '0' ]]; then
# verified mbox, check for existing forward
dbquery="SELECT id FROM vm_forwards WHERE mbox_id='$mbox_id';"
vm_forwards_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $vm_forwards_id ]; then
dbquery="SELECT id FROM vm_forwards WHERE mbox='$mbox' AND domain='$domain';"
forwards_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [[ -z $forwards_id ]]; then
# existing forward does not exist, add it now
dbquery="INSERT INTO vm_forwards SET mbox_id='$mbox_id', forward_to='$forward'"
if [ ! -z $keep ]; then
dbquery="INSERT INTO vm_forwards SET mbox='$mbox', domain='$domain', forward_to='$forward'"
if [[ ! -z $keep ]]; then
dbquery="$dbquery, save_local='$keep'"
fi
eval $dbcmd $dbcmdopts \"$dbquery\;\"

View File

@ -33,15 +33,15 @@ fi
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get aliases id which also works to confirm alias exists
dbquery="SELECT vm_forwards.id FROM vm_forwards, vm_mboxes, vm_domains WHERE vm_forwards.mbox_id=vm_mboxes.id AND vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain';"
vm_forwards_id=`$dbcmd $dbcmdopts "$dbquery"`
# get forward id which also works to confirm alias exists
dbquery="SELECT id FROM vm_forwards WHERE mbox='$mbox' AND domain='$domain';"
forwards_id=`$dbcmd $dbcmdopts "$dbquery"`
if [ -z "$vm_forwards_id" ]; then
if [[ -z $forwards_id ]]; then
echo "ERROR: Forward for $email does not exist."
exit 1
elif [ "$vm_forwards_id" -gt '0' ]; then
dbquery="DELETE FROM vm_forwards WHERE vm_forwards.id='$vm_forwards_id';"
elif [[ $forwards_id -gt '0' ]]; then
dbquery="DELETE FROM vm_forwards WHERE id='$forwards_id';"
eval $dbcmd $dbcmdopts \"$dbquery\"
echo "SUCCESS: Forward for $email removed from system."
exit 0

View File

@ -14,7 +14,7 @@ help()
echo "$thisfilename"
echo "Get email forwards data from vmail database."
echo ""
echo "usage: $thisfilename [-e email|-f forward|-f domain] [-c] [-t] [-h]"
echo "usage: $thisfilename [-e email|-f forward|-d domain] [-c] [-t] [-h]"
echo ""
echo " -h Print this help."
echo " -e <email> Email address to get forwarding for."
@ -35,23 +35,23 @@ vmail:getoptions "$@"
# set initial db query data
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-e"
dbquery="SELECT vm_mboxes.mbox, vm_domains.domain, vm_forwards.forward_to, vm_forwards.save_local FROM vm_forwards, vm_mboxes, vm_domains WHERE vm_forwards.mbox_id = vm_mboxes.id AND vm_mboxes.domain_id = vm_domains.id"
dbquery="SELECT mbox, domain, forward_to, save_local FROM vm_forwards"
# AND vm_forwards.forward_to='$mbox@$domain'"
# build query
if [[ -n $forward ]]; then
# search for specific forward to address
dbquery="$dbquery AND vm_forwards.forward_to='$mbox@$domain'"
dbquery="$dbquery WHERE forward_to='$forward'"
elif [[ -n $domain ]]; then
# add specific domain
dbquery="$dbquery AND vm_domains.domain='$domain'"
dbquery="$dbquery WHERE domain='$domain'"
if [[ -n "$mbox" ]]; then
# search for forward for specific email address
dbquery="$dbquery AND vm_mboxes.mbox='$mbox'"
dbquery="$dbquery AND mbox='$mbox'"
fi
fi
# set order by
dbquery="$dbquery ORDER BY vm_domains.domain, vm_mboxes.mbox, vm_forwards.forward_to;";
dbquery="$dbquery ORDER BY domain, mbox, forward_to;";
# execute mysql query
eval $dbcmd $dbcmdopts "\"$dbquery\"" $cvs

View File

@ -37,40 +37,40 @@ if [[ -z $email ]]; then
exit 1
fi
# check for forward
if [[ -z $forward ]]; then
echo "forward is required"
exit 1
fi
# build query
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get mbox id, which also verfies that email address exists
dbquery="SELECT vm_mboxes.id FROM vm_mboxes, vm_domains WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain';"
mbox_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
# get forward id, which also verfies that forward already exists
dbquery="SELECT id FROM vm_forwards WHERE mbox='$mbox' AND domain='$domain';"
fowards_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $mbox_id ]; then
# mbox does not exist, can't create forward
echo "ERROR: Address to Forward ($email) does not exist."
if [[ -z $fowards_id ]]; then
# forward does not exist, can't create forward
echo "ERROR: Existing Forward for $email does not exist. Add new forward instead."
exit 1
elif [ "$mbox_id" -gt '0' ]; then
# verified mbox, check for existing forward
dbquery="SELECT id FROM vm_forwards WHERE mbox_id='$mbox_id';"
vm_forwards_id=`eval $dbcmd $dbcmdopts \"$dbquery\"`
if [ -z $vm_forwards_id ]; then
# existing forward does not exist, can't modify
echo "ERROR: Forward for $email does not exists, can't edit. Add new forward instead."
elif [[ $fowards_id -gt '0' ]]; then
# verified forward exists, build update query
dbquery="UPDATE vm_forwards"
if [[ -z $forward ]] && [[ -z $keep ]]; then
# nothing to update
echo "ERROR: No values passed for update."
exit 1
elif [[ -n $forward ]] && [[ -n $keep ]]; then
# update forward_to & save_local
dbquery="$dbquery SET forward_to='$forward', save_local='$keep'"
elif [[ -n $forward ]] && [[ -z $keep ]]; then
# only update forward_to
dbquery="$dbquery SET forward_to='$forward'"
elif [[ -z $forward ]] && [[ -n $keep ]]; then
# only update save_local
dbquery="$dbquery SET save_local='$keep'"
else
dbquery="UPDATE vm_forwards SET forward_to='$forward'"
if [ ! -z $keep ]; then
dbquery="$dbquery, save_local='$keep'"
echo "ERROR: Uknown error."
exit 1
fi
dbquery="$dbquery WHERE mbox_id='$mbox_id'"
dbquery="$dbquery WHERE id='$fowards_id'"
eval $dbcmd $dbcmdopts \"$dbquery\;\"
fi
else
# db query error
echo "ERROR: System error querying database."

View File

@ -39,28 +39,28 @@ if [[ -z $password ]]; then
exit 1
fi
# get domain_id (and thus check if domain already exists)
# get domain_id to check if domain already exists
domain_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id from vm_domains WHERE domain='$domain';"`
if [ -z $domain_id ] ; then
if [[ -z $domain_id ]] ; then
echo "ERROR: Domain $domain does not exist."
exit 1
fi
# make sure mbox doesn't already exist
rowcount=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT COUNT(*) FROM vm_mboxes WHERE domain_id='$domain_id' AND mbox='$mbox';"`
if [ "$rowcount" -eq '0' ] ; then
mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id FROM vm_mboxes WHERE mbox='$mbox' AND domain='$domain';"`
if [[ -z $mbox_id ]] ; then
# mbox does not exist, build SQL
# first encrypt password
passwd=`/usr/bin/openssl passwd -6 "$password"`
passwd="{SHA512-CRYPT}$passwd"
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -e 'INSERT INTO vm_mboxes SET domain_id=\"$domain_id\", mbox=\"$mbox\", passwd=\"$passwd\""
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -e 'INSERT INTO vm_mboxes SET mbox=\"$mbox\", domain=\"$domain\", passwd=\"$passwd\""
if [[ -n $status ]] ; then
dbcmd="$dbcmd, status=\"$status\""
fi
if [[ -n $filter ]] ; then
dbcmd="$dbcmd, filter=\"$filter\""
fi
if [ -z "$quota" ] ; then
if [[ -z "$quota" ]] ; then
# get mbox_quota_default from domains table
quota=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT mbox_quota_default from vm_domains WHERE domain='$domain';"`
fi
@ -85,7 +85,7 @@ if [ "$rowcount" -eq '0' ] ; then
exit 1
fi
dbcmd="$dbcmd;'"
elif [ "$rowcount" -eq '1' ] ; then
elif [[ $mbox_id -gt '0' ]] ; then
echo "ERROR: $email already exists in vmail database."
exit 1
else

View File

@ -34,16 +34,16 @@ dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE"
dbcmdopts="-s -r -N -e"
# get email address id which also works to confirm address exists
dbquery="SELECT vm_mboxes.id FROM vm_mboxes, vm_domains WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id=vm_domains.id AND vm_domains.domain='$domain'"
dbquery="SELECT id FROM vm_mboxes WHERE mbox='$mbox' AND domain='$domain'"
mboxes_id=`$dbcmd $dbcmdopts "$dbquery"`
if [ -z "$mboxes_id" ]; then
if [[ -z $mboxes_id ]]; then
echo "ERROR: Email address $email does not exist."
exit 1
elif [ "$mboxes_id" -gt '0' ]; then
elif [[ $mboxes_id -gt '0' ]]; then
if [[ -n $execute ]] || vmail::yesno "Delete $email now?"; then
# this should be sufficient for vm_* tables due to ON DELETE CASCADE foreign key references
dbquery="DELETE FROM vm_mboxes WHERE vm_mboxes.id='$mboxes_id';"
dbquery="DELETE FROM vm_mboxes WHERE id='$mboxes_id';"
eval $dbcmd $dbcmdopts "\"$dbquery\""
dbquery="DELETE FROM sa_userpref WHERE username='$email';"
eval $dbcmd $dbcmdopts "\"$dbquery\""

View File

@ -23,14 +23,11 @@ help()
echo " -c Output in cvs format."
echo " -t Use tabs instead of tables for output, do not display column headers."
echo " -v Include encrypt password in output."
echo " -g Wildcard (blog) search when searching for username."
echo ""
echo " Search term is optional. If nothing specified all email acccounts for all domains will be returned."
echo " By default username searches are for exact matchs."
echo " Specify -g to turn them in to a wildcard (glob) search. Examples:"
echo " Examples:"
echo " $thisfilename -e joe@example.com # search for specific email address 'joe@example.com'."
echo " $thisfilename -m joe # search for username 'joe' in all domains."
echo " $thisfilename -m joe -g # search for usernames containing 'joe' in all domains."
echo " $thisfilename -d example.com # search for all usernames in the 'example.com' domain."
exit
}
@ -45,34 +42,29 @@ if [[ -n $tab ]]; then
fi
# build query
dbquery="SELECT vm_mboxes.mbox, vm_domains.domain"
if [ -n "$verbose" ]; then
dbquery="$dbquery, vm_mboxes.passwd"
dbquery="SELECT mbox, domain"
if [[ -n $verbose ]]; then
dbquery="$dbquery, passwd"
fi
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
dbquery="$dbquery, status, quota, ratelimit, filter FROM vm_mboxes"
if [[ -n $mbox ]] && [[ -n $domain ]]; then
# search for specific email address
dbquery="$dbquery AND vm_domains.domain='$domain' AND vm_mboxes.mbox='$mbox'"
elif [ -n "$mbox" ] && [ -z "$domain" ]; then
dbquery="$dbquery WHERE mbox='$mbox' AND domain='$domain'"
elif [[ -n $mbox ]] && [[ -z $domain ]]; then
# search all domains for username
if [ -n "$glob" ]; then
# wildcard search
dbquery="$dbquery AND vm_mboxes.mbox LIKE '%$mbox%'"
else
# exact match
dbquery="$dbquery AND vm_mboxes.mbox='$mbox'"
fi
elif [ -z "$mbox" ] && [ -n "$domain" ]; then
dbquery="$dbquery WHERE mbox='$mbox'"
elif [[ -z $mbox ]] && [[ -n $domain ]]; then
# get all usernames for domain
dbquery="$dbquery AND vm_domains.domain='$domain'"
dbquery="$dbquery WHERE domain='$domain'"
# elif [ -z "$mbox" ] && [ -z "$domain" ]; then
# echo "ERROR: No username or domain specified."
# help
# uncomment above 3 lines to force search term, otherwise all email addresses for all domains will be returned
fi
echo $dbquery
# set order by
dbquery="$dbquery ORDER BY vm_domains.domain, vm_mboxes.mbox;";
dbquery="$dbquery ORDER BY domain, mbox;";
# execute mysql query
eval $dbcmd $dbcmdopts "\"$dbquery\"" $cvs

View File

@ -35,9 +35,9 @@ if [[ -z $email ]]; then
fi
# get mbox id (and thus check if email account already exists)
mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT vm_mboxes.id from vm_mboxes, vm_domains WHERE vm_domains.domain='$domain' AND vm_mboxes.mbox='$mbox' AND vm_domains.id=vm_mboxes.domain_id;"`
mbox_id=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT id from vm_mboxes WHERE mbox='$mbox' AND domain='$domain';"`
if [ -z $mbox_id ] ; then
if [[ -z $mbox_id ]] ; then
echo "ERROR: Email address $email does not exist."
exit
fi
@ -46,7 +46,7 @@ fi
dbset=""
# check for quota update
if [ -n "$quota" ]; then
if [[ -n $quota ]]; then
# make quota uppercase in case it is set to NULL
quota=`echo $quota | tr [:lower:] [:upper:]`
if [[ "$quota" =~ ^[0-9]+$ ]] || [[ "$quota" == "NULL" ]]; then
@ -58,10 +58,13 @@ if [ -n "$quota" ]; then
fi
# check for ratelimit update
if [ -n "$ratelimit" ]; then
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
if [[ ! -z $dbset ]]; then
dbset="$dbset,"
fi
dbset=" ratelimit=$ratelimit"
else
echo "ERROR: ratelimit (-r) must numeric or NULL"
@ -70,32 +73,32 @@ if [ -n "$ratelimit" ]; then
fi
# check for password update
if [ ! -z "$password" ]; then
if [[ ! -z $password ]]; then
passwd=`/usr/bin/openssl passwd -6 "$password"`
passwd="{SHA512-CRYPT}$passwd"
if [ ! -z "$dbset" ]; then
if [[ ! -z $dbset ]]; then
dbset="$dbset,"
fi
dbset=" $dbset passwd=\"$passwd\""
fi
# check for status update
if [ ! -z "$status" ]; then
if [ ! -z "$dbset" ]; then
if [[ ! -z $status ]]; then
if [[ ! -z $dbset ]]; then
dbset="$dbset,"
fi
dbset="$dbset status=\"$status\""
fi
# check for junk filter update
if [ ! -z "$filter" ]; then
if [ ! -z "$dbset" ]; then
if [[ ! -z $filter ]]; then
if [[ ! -z $dbset ]]; then
dbset="$dbset,"
fi
dbset="$dbset filter=\"$filter\""
fi
if [ -n "$dbset" ]; then
if [[ -n $dbset ]]; then
# build query
dbcmd="mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -e 'UPDATE vm_mboxes SET $dbset WHERE id=\"$mbox_id\";'"

View File

@ -29,7 +29,7 @@ if [ -d $VMAIL_DIR ]; then
for vmail_domain in "${vmail_domain_array[@]}"; do
# make sure domain array element is a dir
if [ -d $VMAIL_DIR/$vmail_domain ]; then
# get domain id for later queries and which also works to confirm domain exists in vmail db
# get domain id which confirms domain exists in vmail db
dbquery="SELECT vm_domains.id FROM vm_domains WHERE vm_domains.domain='$vmail_domain'"
domain_id=''
domain_id=`$dbcmd $dbcmdopts "$dbquery"`
@ -45,7 +45,7 @@ if [ -d $VMAIL_DIR ]; then
# cycle thru each mailbox for this domain
for mbox in "${mbox_array[@]}"; do
# get email address id which works to confirm address exists
dbquery="SELECT vm_mboxes.id FROM vm_mboxes WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain_id='$domain_id'"
dbquery="SELECT vm_mboxes.id FROM vm_mboxes WHERE vm_mboxes.mbox='$mbox' AND vm_mboxes.domain='$vmail_domain'"
mboxes_id=''
mboxes_id=`$dbcmd $dbcmdopts "$dbquery"`
if [ -z "$mboxes_id" ]; then

View File

@ -142,5 +142,8 @@ default_pass_scheme = SHA512-CRYPT
password_query = SELECT vm_mboxes.passwd AS password, CONCAT('*:bytes=', vm_mboxes.quota, 'G') AS userdb_quota_rule, '/var/vmail/%d/%n' AS userdb_home, '/var/vmail/%d/%n/Maildir' AS userdb_mail, 'vmail' AS userdb_uid, 'vmail' AS userdb_gid FROM vm_domains, vm_mboxes WHERE vm_domains.domain = '%d' AND vm_domains.id = vm_mboxes.domain_id AND vm_mboxes.mbox = '%n' AND vm_domains.status = '1' AND vm_mboxes.status > '0'
password_query = SELECT vm_mboxes.passwd AS password, CONCAT('*:bytes=', vm_mboxes.quota, 'G') AS userdb_quota_rule, '/var/vmail/%d/%n' AS userdb_home, '/var/vmail/%d/%n/Maildir' AS userdb_mail, 'vmail' AS userdb_uid, 'vmail' AS userdb_gid FROM vm_domains, vm_mboxes WHERE vm_domains.domain = '%d' AND vm_mboxes.mbox = '%n' AND vm_mboxes.domain = '%d' AND vm_domains.status = '1' AND vm_mboxes.status > '0'
# Query to get a list of all usernames.
#iterate_query = SELECT username AS user FROM users

View File

@ -378,7 +378,7 @@ acl_rcpt_to:
# compromised account, not to restrict legitimate users. Set your defaults & limits accordignly.
warn
authenticated = *
set acl_m_ratelimit_hourly = ${lookup mysql{SELECT IFNULL(vm_mboxes.ratelimit, 100000) FROM vm_domains, vm_mboxes WHERE vm_domains.domain="$sender_address_domain" AND vm_mboxes.mbox="$sender_address_local_part" AND vm_domains.id = vm_mboxes.domain_id}{$value}{10}}
set acl_m_ratelimit_hourly = ${lookup mysql{SELECT IFNULL(vm_mboxes.ratelimit, 100000) FROM vm_mboxes WHERE vm_mboxes.mbox="$sender_address_local_part" AND vm_mboxes.domain='$sender_address_domain'}{$value}{10}}
set acl_m_ratelimit_daily = ${eval: (10 * $acl_m_ratelimit_hourly) }
ratelimit = 0 / 1h / per_mail / strict / $authenticated_id
log_message = Sender rate is $sender_rate/$sender_rate_period for $authenticated_id
@ -741,7 +741,7 @@ autowhitelist_filter:
driver = redirect
domains = ! +local_domains
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
condition = ${lookup mysql{SELECT vm_mboxes.id FROM vm_domains, vm_mboxes WHERE vm_domains.domain = "$sender_address_domain" AND vm_mboxes.mbox = "$sender_address_local_part" AND vm_domains.id = vm_mboxes.domain_id}}
condition = ${lookup mysql{SELECT vm_mboxes.id FROM vm_mboxes WHERE vm_mboxes.mbox="$sender_address_local_part" AND vm_mboxes.domain="$sender_address_domain" }}
check_local_user = false
user = Debian-exim
file = /etc/exim4/autowhitelist.filter
@ -799,7 +799,7 @@ virtual_alias:
local_part_suffix = +*
local_part_suffix_optional = true
condition = ${if !eq {$received_protocol}{spam-scanned}}
data = ${lookup mysql{SELECT CONCAT(vm_mboxes.mbox,'@${domain}') FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.alias='${local_part}' AND vm_aliases.mbox_id = vm_mboxes.id AND vm_mboxes.domain_id = vm_domains.id AND vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.status > '0'}}
data = ${lookup mysql{SELECT CONCAT(vm_aliases.mbox,'@${domain}') FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.alias='${local_part}' AND vm_aliases.domain='${domain}' AND vm_aliases.mbox=vm_mboxes.mbox AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_domains.domain='${domain}' AND vm_domains.status = '1'}}
junk_filter:
driver = accept
@ -811,7 +811,7 @@ junk_filter:
{ eq {$header_X-Junk-Flag:}{YES}} \
{ !eq {$header_X-Whitelist-Flag:}{YES}} \
} {yes}{no}}
condition = ${lookup mysql{SELECT vm_mboxes.id 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_domains.status = '1' AND vm_mboxes.status > '0' AND vm_mboxes.filter > '0'}}
condition = ${lookup mysql{SELECT vm_mboxes.id FROM vm_mboxes, vm_domains WHERE vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_mboxes.filter > '0' AND vm_domains.domain=vm_mboxes.domain AND vm_domains.status='1'}}
transport = junk_delivery
spam_filter:
@ -824,7 +824,7 @@ spam_filter:
{ eq {$header_X-Spam-Flag:}{YES}} \
{ !eq {$header_X-Whitelist-Flag:}{YES}} \
} {yes}{no}}
condition = ${lookup mysql{SELECT vm_mboxes.id 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_domains.status = '1' AND vm_mboxes.status > '0' AND vm_mboxes.filter = '2'}}
condition = ${lookup mysql{SELECT id FROM vm_domains, vm_mboxes WHERE vm_domains.domain='${domain}' vm_domains.status='1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status>'0'}}
transport = junk_delivery
virtual_vacation:
@ -835,7 +835,7 @@ virtual_vacation:
{ !match {$h_precedence:} {(?i)junk|bulk|list}} \
{ !eq {$received_protocol}{spam-scanned}} \
{ !eq {$sender_address} {}} \
{ eq {${lookup mysql{SELECT vm_autoresponders.mode FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_autoresponders.mbox_id = vm_mboxes.id AND vm_domains.status = '1' AND vm_mboxes.status > '0' AND vm_autoresponders.status = '1'}{$value}fail}}{Vacation}} \
{ eq {${lookup mysql{SELECT vm_autoresponders.mode FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_autoresponders.mbox='${local_part}' AND vm_autoresponders.domain='${domain}' AND vm_autoresponders.status='1'}{$value}fail}}{Vacation}} \
} {yes} {no}}
# add options for start & end date fields
no_expn
@ -861,7 +861,7 @@ virtual_autoresponder:
{ !match {$h_precedence:} {(?i)junk|bulk|list}} \
{ !eq {$received_protocol}{spam-scanned}} \
{ !eq {$sender_address} {}} \
{ eq {${lookup mysql{SELECT vm_autoresponders.mode FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_autoresponders.mbox_id = vm_mboxes.id AND vm_domains.status = '1' AND vm_mboxes.status > '0' AND vm_autoresponders.status = '1'}{$value}fail}}{Autoresponder} } \
{ eq {${lookup mysql{SELECT vm_autoresponders.mode FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_autoresponders.mbox='${local_part}' AND vm_autoresponders.domain='${domain}' AND vm_autoresponders.status='1'}{$value}fail}}{Autoresponder} } \
} {yes} {no}}
# add options for start & end date fields
no_expn
@ -882,7 +882,7 @@ virtual_forward_and_drop:
condition = ${if !eq {$received_protocol}{spam-scanned}}
local_part_suffix = +*
local_part_suffix_optional = true
data = ${lookup mysql{SELECT vm_forwards.forward_to FROM vm_domains, vm_mboxes, vm_forwards WHERE vm_domains.domain='${domain}' AND vm_domains.id = vm_mboxes.domain_id AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.id=vm_forwards.mbox_id AND vm_domains.status = '1' AND vm_mboxes.status > '0' AND vm_forwards.save_local='0'}}
data = ${lookup mysql{SELECT vm_forwards.forward_to FROM vm_domains, vm_mboxes, vm_forwards WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_forwards.mbox='${local_part}' AND vm_forwards.domain='${domain}' AND vm_forwards.save_local='0'}}
virtual_forward_and_keep:
driver = redirect
@ -890,7 +890,7 @@ virtual_forward_and_keep:
condition = ${if !eq {$received_protocol}{spam-scanned}}
local_part_suffix = +*
local_part_suffix_optional = true
data = ${lookup mysql{SELECT CONCAT('${local_part}@${domain}\n', vm_forwards.forward_to) FROM vm_domains, vm_mboxes, vm_forwards WHERE vm_domains.domain='${domain}' AND vm_domains.id = vm_mboxes.domain_id AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.id=vm_forwards.mbox_id AND vm_domains.status = '1' AND vm_mboxes.status > '0' AND vm_forwards.save_local='1'}}
data = ${lookup mysql{SELECT CONCAT('${local_part}@${domain}\n', vm_forwards.forward_to) FROM vm_domains, vm_mboxes, vm_forwards WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_forwards.mbox='${local_part}' AND vm_forwards.domain='${domain}' AND vm_forwards.save_local='1'}}
spamcheck_router:
driver = accept
@ -903,7 +903,7 @@ spamcheck_router:
{ < {$message_size}{512k}} \
{ !eq {$header_X-Junk-Flag:}{YES}} \
{ !eq {$header_X-Whitelist-Flag:}{YES}} \
{ gt {${lookup mysql{SELECT vm_mboxes.status 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_domains.status = '1'}{$value}fail}}{0} } \
{ gt {${lookup mysql{SELECT vm_mboxes.filter FROM vm_domains, vm_mboxes WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0'}{$value}fail}}{0} } \
} {yes} {no}}
# Check for other headers too? Blacklist, SPF, DKIM failers go directly to Spam folder without spam scan??? - actually they should go to spam folder before this router is hit?
headers_remove = X-Spam-Checker-Version:X-Spam-Flag:X-Spam-Level:X-Spam-Status:X-Spam-Score:X-Spam-Report
@ -914,7 +914,7 @@ user_filter:
domains = +local_domains
local_part_suffix = +*
local_part_suffix_optional = true
data = ${lookup mysql{SELECT vm_filters.filter FROM vm_domains, vm_mboxes, vm_filters WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_mboxes.id = vm_filters.mbox_id AND vm_domains.status = '1' AND vm_mboxes.status > '0' }}
data = ${lookup mysql{SELECT vm_filters.filter FROM vm_domains, vm_mboxes, vm_filters WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_filters.mbox='${local_part}' AND vm_filters.domain='${domain}'}}
user = vmail
no_verify
no_expn
@ -931,7 +931,7 @@ lmtp_localuser:
domains = +local_domains
local_part_suffix = +*
local_part_suffix_optional = true
condition = ${lookup mysql{SELECT vm_mboxes.id 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_domains.status = '1' AND vm_mboxes.status > '0'}}
condition = ${lookup mysql{SELECT vm_mboxes.id FROM vm_domains, vm_mboxes WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0'}}
# add checks to query for domain & mbox being active
transport = dovecot_lmtp
cannot_route_message = Unknown user
@ -941,7 +941,7 @@ virtual_alias_catchall:
driver = redirect
domains = +local_domains
condition = ${if !eq {$received_protocol}{spam-scanned}}
data = ${lookup mysql{SELECT CONCAT(vm_mboxes.mbox,'@${domain}') FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.alias='catchall' AND vm_aliases.mbox_id = vm_mboxes.id AND vm_mboxes.domain_id = vm_domains.id AND vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.status > '0'}}
data = ${lookup mysql{SELECT CONCAT(vm_aliases.mbox,'@${domain}') FROM vm_aliases, vm_mboxes, vm_domains WHERE vm_aliases.alias='catchall' AND vm_aliases.domain='${domain}' AND vm_aliases.mbox=vm_mboxes.mbox AND vm_mboxes.domain='${domain} AND vm_mboxes.status > '0' AND vm_domains.domain='${domain}' AND vm_domains.status = '1'}}
# This router handles aliasing using a linearly searched alias file with the
# name SYSTEM_ALIASES_FILE. When this configuration is installed automatically,
@ -1082,10 +1082,8 @@ vacation_transport:
return_path = ${local_part}@${domain}
to = ${sender_address}
from = ${local_part}@${domain}
# subject = ${lookup mysql{SELECT subject FROM vm_autoresponder WHERE local_part='${local_part}' AND domain='${domain}'}{$value}{"Auto Reply"}}
# text = ${lookup mysql{SELECT message FROM vm_autoresponder WHERE local_part='${local_part}' AND domain='${domain}'}{$value}fail}
subject = ${lookup mysql{SELECT vm_autoresponders.subject FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_autoresponders.mbox_id = vm_mboxes.id}{$value}{"Auto Reply"}}
text = ${lookup mysql{SELECT vm_autoresponders.body FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_autoresponders.mbox_id = vm_mboxes.id}{$value}fail}
subject = ${lookup mysql{SELECT vm_autoresponders.subject FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_autoresponders.mbox='${local_part}' AND vm_autoresponders.domain='${domain}' AND vm_autoresponders.status='1' AND vm_autoresponders.mode='Vacation'}{$value}{"Auto Reply"}}
text = ${lookup mysql{SELECT vm_autoresponders.body FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_autoresponders.mbox='${local_part}' AND vm_autoresponders.domain='${domain}' AND vm_autoresponders.status='1' AND vm_autoresponders.mode='Vacation'}{$value}fail}
user = vmail
## for autoresponder
@ -1095,8 +1093,8 @@ autoresponder_transport:
return_path = ${local_part}@${domain}
to = ${sender_address}
from = ${local_part}@${domain}
subject = ${lookup mysql{SELECT vm_autoresponders.subject FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_autoresponders.mbox_id = vm_mboxes.id}{$value}{"Auto Reply"}}
text = ${lookup mysql{SELECT vm_autoresponders.body FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_mboxes.mbox='${local_part}' AND vm_domains.id = vm_mboxes.domain_id AND vm_autoresponders.mbox_id = vm_mboxes.id}{$value}fail}
subject = ${lookup mysql{SELECT vm_autoresponders.subject FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_autoresponders.mbox='${local_part}' AND vm_autoresponders.domain='${domain}' AND vm_autoresponders.status='1' AND vm_autoresponders.mode='Autoresponder'}{$value}{"Auto Reply"}}
text = ${lookup mysql{SELECT vm_autoresponders.body FROM vm_domains, vm_mboxes, vm_autoresponders WHERE vm_domains.domain='${domain}' AND vm_domains.status = '1' AND vm_mboxes.mbox='${local_part}' AND vm_mboxes.domain='${domain}' AND vm_mboxes.status > '0' AND vm_autoresponders.mbox='${local_part}' AND vm_autoresponders.domain='${domain}' AND vm_autoresponders.status='1' AND vm_autoresponders.mode='Autoresponder'}{$value}fail}
user = vmail
maildir_delivery:

View File

@ -16,7 +16,8 @@ SET time_zone = "+00:00";
CREATE TABLE `vm_aliases` (
`id` int(10) UNSIGNED NOT NULL,
`mbox_id` int(10) UNSIGNED NOT NULL,
`mbox` varchar(128) NOT NULL,
`domain` varchar(255) NOT NULL,
`alias` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@ -28,13 +29,14 @@ CREATE TABLE `vm_aliases` (
CREATE TABLE `vm_autoresponders` (
`id` int(10) UNSIGNED NOT NULL,
`mbox_id` int(10) UNSIGNED NOT NULL,
`mbox` varchar(128) NOT NULL,
`domain` varchar(255) NOT NULL,
`subject` varchar(128) NOT NULL,
`body` text NOT NULL,
`mode` enum('Vacation','Autoresponder') NOT NULL,
`mode` enum('Vacation','Autoresponder') NOT NULL DEFAULT 'Vacation',
`status` tinyint(1) NOT NULL DEFAULT 1,
`start` datetime DEFAULT NULL,
`end` datetime DEFAULT NULL
`start` date DEFAULT NULL,
`end` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
@ -60,7 +62,8 @@ CREATE TABLE `vm_domains` (
CREATE TABLE `vm_filters` (
`id` int(10) UNSIGNED NOT NULL,
`mbox_id` int(11) UNSIGNED NOT NULL,
`mbox` varchar(128) NOT NULL,
`domain` varchar(255) NOT NULL,
`filter` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@ -72,7 +75,8 @@ CREATE TABLE `vm_filters` (
CREATE TABLE `vm_forwards` (
`id` int(10) UNSIGNED NOT NULL,
`mbox_id` int(10) UNSIGNED NOT NULL,
`mbox` varchar(128) NOT NULL,
`domain` varchar(255) NOT NULL,
`forward_to` varchar(128) NOT NULL,
`save_local` tinyint(1) NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@ -119,8 +123,8 @@ CREATE TABLE `vm_greylisting_resenders` (
CREATE TABLE `vm_mboxes` (
`id` int(10) UNSIGNED NOT NULL,
`domain_id` int(10) UNSIGNED NOT NULL,
`mbox` varchar(128) NOT NULL,
`domain` varchar(255) NOT NULL,
`passwd` char(128) NOT NULL,
`status` tinyint(1) NOT NULL DEFAULT 1,
`quota` int(10) UNSIGNED DEFAULT NULL,
@ -137,35 +141,36 @@ CREATE TABLE `vm_mboxes` (
--
ALTER TABLE `vm_aliases`
ADD PRIMARY KEY (`id`),
ADD KEY `mbox_delete_aliases` (`mbox_id`);
ADD UNIQUE KEY `alias` (`mbox`,`domain`,`alias`) USING BTREE,
ADD KEY `email` (`mbox`,`domain`) USING BTREE;
--
-- Indexes for table `vm_autoresponders`
--
ALTER TABLE `vm_autoresponders`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `autoresponder` (`mbox_id`);
ADD UNIQUE KEY `email` (`mbox`,`domain`) USING BTREE;
--
-- Indexes for table `vm_domains`
--
ALTER TABLE `vm_domains`
ADD PRIMARY KEY (`id`),
ADD KEY `domain` (`domain`(191));
ADD UNIQUE KEY `domain` (`domain`) USING BTREE;
--
-- Indexes for table `vm_filters`
--
ALTER TABLE `vm_filters`
ADD PRIMARY KEY (`id`),
ADD KEY `mbox_delete_filters` (`mbox_id`);
ADD UNIQUE KEY `email` (`mbox`,`domain`) USING BTREE;
--
-- Indexes for table `vm_forwards`
--
ALTER TABLE `vm_forwards`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `mbox_id` (`mbox_id`);
ADD UNIQUE KEY `email` (`mbox`,`domain`) USING BTREE;
--
-- Indexes for table `vm_greylisting`
@ -184,7 +189,8 @@ ALTER TABLE `vm_greylisting_resenders`
--
ALTER TABLE `vm_mboxes`
ADD PRIMARY KEY (`id`),
ADD KEY `email` (`domain_id`,`mbox`) USING BTREE;
ADD UNIQUE KEY `email` (`mbox`,`domain`) USING BTREE,
ADD KEY `domain_delete_mboxes` (`domain`);
--
-- AUTO_INCREMENT for dumped tables
@ -246,29 +252,29 @@ ALTER TABLE `vm_mboxes`
-- Constraints for table `vm_aliases`
--
ALTER TABLE `vm_aliases`
ADD CONSTRAINT `mbox_delete_aliases` FOREIGN KEY (`mbox_id`) REFERENCES `vm_mboxes` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
ADD CONSTRAINT `mbox_delete_aliases` FOREIGN KEY (`mbox`,`domain`) REFERENCES `vm_mboxes` (`mbox`, `domain`) ON DELETE CASCADE ON UPDATE NO ACTION;
--
-- Constraints for table `vm_autoresponders`
--
ALTER TABLE `vm_autoresponders`
ADD CONSTRAINT `mbox_delete_autoresponders` FOREIGN KEY (`mbox_id`) REFERENCES `vm_mboxes` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
ADD CONSTRAINT `mbox_delete_autoresponders` FOREIGN KEY (`mbox`,`domain`) REFERENCES `vm_mboxes` (`mbox`, `domain`) ON DELETE CASCADE ON UPDATE NO ACTION;
--
-- Constraints for table `vm_filters`
--
ALTER TABLE `vm_filters`
ADD CONSTRAINT `mbox_delete_filters` FOREIGN KEY (`mbox_id`) REFERENCES `vm_mboxes` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
ADD CONSTRAINT `mbox_delete_filters` FOREIGN KEY (`mbox`,`domain`) REFERENCES `vm_mboxes` (`mbox`, `domain`) ON DELETE CASCADE ON UPDATE NO ACTION;
--
-- Constraints for table `vm_forwards`
--
ALTER TABLE `vm_forwards`
ADD CONSTRAINT `mbox_delete_forwards` FOREIGN KEY (`mbox_id`) REFERENCES `vm_mboxes` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
ADD CONSTRAINT `mbox_delete_forwards` FOREIGN KEY (`mbox`,`domain`) REFERENCES `vm_mboxes` (`mbox`, `domain`) ON DELETE CASCADE ON UPDATE NO ACTION;
--
-- Constraints for 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`) REFERENCES `vm_domains` (`domain`) ON DELETE CASCADE ON UPDATE NO ACTION;
COMMIT;