vmail-stack/bin/vmail-aliases-add.sh
2021-02-11 14:20:30 -08:00

106 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
#
# vmail-stack
# https://git.stack-source.com/msb/vmail-stack
# MIT License Copyright (c) 2021 Matthew Saunders Brown
# load config
source /usr/local/etc/vmail.conf
help()
{
thisfilename=$(basename -- "$0")
echo "$thisfilename"
echo "Add email alias to vmail system"
echo ""
echo "usage: $thisfilename email alias [OPTIONS]"
echo ""
echo " -h Print this help."
echo ""
echo " 'email' should be the full address 'alias' just the local part (username)."
echo " .e.g to have info@example.com delivered (aliased) to joe@example.com do:"
echo " $thisfilename joe@example.com info"
exit
}
# set any options that were passed
while getopts "h" opt; do
case "${opt}" in
h )
help
exit;;
\? )
echo "Invalid option: $OPTARG" 1>&2
exit;;
: )
echo "Invalid option: $OPTARG requires an argument" 1>&2
exit;;
esac
done
# check for and set alias & email address & split in to local part & domain
if [ -n "$2" ]; then
if [ $1 == "-h" ] || [ $2 == "-h" ]; then
help
else
email=$1
shift
alias=$1
shift
if [[ $email =~ "@" ]] ; then
mbox=${email%@*}
domain=${email##*@}
if [ -z $mbox ] ; then
echo "ERROR: No local part in $email."
exit 1
elif [ -z $domain ] ; then
echo "ERROR: No domain in $email."
exit 1
elif [[ ! $domain =~ ^(([a-zA-Z](-?[a-zA-Z0-9])*)\.)+[a-zA-Z]{2,}$ ]] ; then
echo "ERROR: $domain is not a valid domain name."
exit 1
fi
else
echo "ERROR: $email is not a valid email."
exit 1
fi
fi
else
help
fi
# get domain_id (and thus 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
echo "ERROR: Domain $domain does not exist."
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';"`
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 '1' ] ; then
# verified mbox, check for existing alias
existing_alias=`mysql --defaults-extra-file=$MYSQL_CONNECTION_INFO_FILE -s -r -N -e "SELECT vm_mboxes.mbox FROM vm_mboxes, vm_aliases WHERE vm_aliases.alias='$alias' AND vm_aliases.mbox_id=vm_mboxes.id AND vm_mboxes.domain_id='$domain_id';"`
if [ -z $existing_alias ]; then
# existing alias does not exist, add new one now
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\";'"
eval $dbcmd
else
if [ "$existing_alias" == "$mbox" ]; then
echo "ERROR: Alias for $alias To $email already exists."
exit 1
else
echo "ERROR: Alias for $alias already points to another address ($existing_alias@$domain). To update delete that alias first, then add a new one."
exit 1
fi
fi
else
# db query error
echo "ERROR: System error querying vmail database."
exit 1
fi