Automatic account expirations
Information
From: http://www.mail-archive.com/qmailtoaster-list@qmailtoaster.com/msg16395.html
Below is a script to delete in-active account autimaticaally deleted from system. When I say in-active, it look from table vpopmail.lastauth.
It's very suitable for enterprise/business mailserver which has many employees and maybe some of them are contract employees with medium turnover, and lacks of IT resource. And may not for ISP / Hosting company which has paying customer whose never login.
Important Note
This script has 2 bugs/holes in it and I dont know how to solve it automatically:
1. If you create a new account and the user never use it, the data won't be available at table vpopmail.lastauth, so the account won't be deleted.
Manual fix: After you create new account, login to webmail to test/verify the new account working and to insert data automatically to
table vpopmail.lastauth.
2. If the user resigned, but he still remember credentials (url/server,user,pass) s/he may still using the account which causing
the account active and won't be deleted.
Manual fix: Inform your HR/Account Dept to notify you any resigned user, so you can deleted it manually or change the password.
How to use
- Copy the script into a file
- Chmod +x accountexpiration.sh
- Added into crontab (daily/weekly/monthly)
The Scripts
#!/bin/bash
# Automatic Account Expiration # deleting user email after some period of time inactivity # (whose never check email via pop3 / imap3) # ver 0.1 # Nov 28, 2007 # PakOgah <pakogah@pala.bo-tak.info>
# === Variables need to be edited === # Exclude some users from deleting (postmaster will be a good one) # Otherwise all users will be checked # separate with space #EXCLUDED_USERS="" EXCLUDED_USERS="postmaster spam notspam pakogah" # List of domains you want to include / exclude from search # separate with space # empty meant all domain are included #DOMAIN_LISTS="" DOMAIN_LISTS="pala.bo-tak.info" # Are above Domain(s) included on search ? DOMAIN_INCLUDED="Y" #DOMAIN_INCLUDED="N" # If records found delete record ? # WARNING: NO Prompt is asked #EXECUTE_DELETE="Y" EXECUTE_DELETE="N" # Delete account after x days of inactivity DAYS="180" # Email you the report ? If yes, then enter your email address # leave blank for not sending the report EMAIL_REPORT="[EMAIL PROTECTED]" #EMAIL_REPORT="" # vpopmail connection # Mysql host MYSQL_HOST="localhost" # Mysql username MYSQL_USERNAME="vpopmail" # Mysql password MYSQL_PASSWORD="SsEeCcRrEeTt" # Mysql database MYSQL_DATABASE="vpopmail" # Verbose ? (output emailaddress to stdout for checking) VERBOSE="Y" #VERBOSE="N" # === Stop editing === # === script parameter === SYSDATE=`date +%Y%m%d` HUMANDATE=`date '+%b %d, %Y'` QMAILDEL="/home/vpopmail/bin/vdeluser" MYSQLCLIENT="/usr/bin/mysql" GREP="/bin/grep" GAWK="/bin/gawk" RM="/bin/rm" MAIL="/bin/mail" TMPFILE="/tmp/$SYSDATE.log" SUBJECT="Account(s) expired due $DAYS days of inactivity per $HUMANDATE"
# construct SQL SQL_QUERY="select concat_ws('@',user,domain) as email from lastauth where timestamp < UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL $DAYS DAY))"
if [ ! "$EXCLUDED_USERS" = "" ] then count=0 for i in $EXCLUDED_USERS do count=$((count + 1)) done SQL_QUERY="$SQL_QUERY and" i=0 for user in $EXCLUDED_USERS do SQL_QUERY="$SQL_QUERY user<>'$user'" i=$((i+1)) if [ "$i" -lt "$count" ] then SQL_QUERY="$SQL_QUERY and" fi done fi if [ ! "$DOMAIN_LISTS" = "" ]; then count=0 for i in $DOMAIN_LISTS do count=$((count + 1)) done SQL_QUERY="$SQL_QUERY and" if [ "$DOMAIN_INCLUDED" = "Y" ]; then SIGN="=" if [ "$count" -eq "1" ]; then SQL_QUERY="$SQL_QUERY domain$SIGN'$DOMAIN_LISTS'" else i=0 SQL_QUERY="$SQL_QUERY (" for domain in $DOMAIN_LISTS do SQL_QUERY="$SQL_QUERY domain$SIGN'$domain'" i=$((i+1)) if [ "$i" -lt "$count" ]; then SQL_QUERY="$SQL_QUERY or" fi done SQL_QUERY="$SQL_QUERY )" fi else SIGN="<>" if [ "$count" -eq "1" ]; then SQL_QUERY="$SQL_QUERY domain$SIGN'$DOMAIN_LISTS'" else i=0 SQL_QUERY="$SQL_QUERY (" for domain in $DOMAIN_LISTS do SQL_QUERY="$SQL_QUERY domain$SIGN'$domain'" i=$((i+1)) if [ "$i" -lt "$count" ]; then SQL_QUERY="$SQL_QUERY and" fi done SQL_QUERY="$SQL_QUERY )" fi fi fi SQL_QUERY="$SQL_QUERY;" #echo $SQL_QUERY # get the output $MYSQLCLIENT -u $MYSQL_USERNAME -p$MYSQL_PASSWORD -h $MYSQL_HOST $MYSQL_DATABASE -E -e "$SQL_QUERY" | $GREP email | \ $GAWK -F' ' '{print $2}' > $TMPFILE # execute it while read email do if [ "$VERBOSE" = "Y" ]; then echo "$email expired" fi if [ "$EXECUTE_DELETE" = "Y" ]; then $QMAILDEL $email fi done < $TMPFILE # report it if [ ! "$EMAIL_REPORT" = "" ]; then $MAIL -s "$SUBJECT" $EMAIL_REPORT < $TMPFILE fi # clean up $RM $TMPFILE