#!/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 forward to vmail system" echo "" echo "usage: $thisfilename email forward_to [OPTIONS]" echo "" echo " -h Print this help." echo " -l Save Local (forward & keep local copy). 0 = no/off, 1 = yes/on. Default is 0." echo "" echo " 'email' and 'forward_to' should both be in full email address format." echo " .e.g to have info@example.com delivered (forwarded) to joe@example.com do:" echo " $thisfilename info@example.com joe@example.com" exit } # check for and set forward_to & email address & split email in to mbox (local part) & domain if [ -n "$2" ]; then if [ $1 == "-h" ] || [ $2 == "-h" ]; then help else email=$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 ! vmail::validate_domain $domain; 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 forward_to=$1 shift if [[ $forward_to =~ "@" ]] ; then forward_to_mbox=${forward_to%@*} forward_to_domain=${forward_to##*@} if [ -z $forward_to_mbox ] ; then echo "ERROR: No local part in $forward_to." exit 1 elif [ -z $forward_to_domain ] ; then echo "ERROR: No domain in $forward_to." exit 1 elif ! vmail::validate_domain $forward_to_domain; then echo "ERROR: $forward_to_domain is not a valid domain name." exit 1 fi else echo "ERROR: $forward_to is not a valid email." exit 1 fi fi else help fi # set any options that were passed while getopts "hl:" opt; do case "${opt}" in h ) help exit;; l ) save_local=${OPTARG} if [ "$save_local" != "0" ] && [ "$save_local" != "1" ]; then echo "ERROR: Invalid save local setting: -l $save_local." help exit 1 fi ;; \? ) echo "Invalid option: $OPTARG" 1>&2 exit;; : ) echo "Invalid option: $OPTARG requires an argument" 1>&2 exit;; esac done # 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\"` 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 # 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, add it now dbcommand="INSERT INTO vm_forwards SET mbox_id='$mbox_id', forward_to='$forward_to'" if [ -n $save_local ]; then dbquery="$dbquery, save_local='$save_local'" fi echo $dbcmd $dbcmdopts \"$dbquery;\" else echo "ERROR: Forward for $email already exists. To change either del then add or use mod script." exit 1 fi else # db query error echo "ERROR: System error querying vmail database." exit 1 fi