QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 736|回复: 0

将以前学习bash时写的一个邮件群发的bash脚本放上来

[复制链接]
发表于 2004-12-1 18:07:55 | 显示全部楼层 |阅读模式
下面的脚本只用了一些最基本的bash知识,学习起来简单。
好多东西我也记不起拉,先贴上来吧.
当时自己可能写了很多没用的东西
大家看看而已,高手就算啦
[code:1]
#!/bin/bash

#Author: updatedb
#Date: Feb, 14' 04
#Descritpion: send mail to a group
#Error: delete function have a error

TITLE=test
MAILCONTENT=index.htm
USERLIST=/root/.mailsend.conf
USERADDLIST=""
USERDELLIST=""
LASTERROR=0
MAILADDR=""
OTHERADDR=""
CURSOR=0
SIGN=0
TAIL=0

function help() {
    cat<< _ACEOF
    USAGE: Send mail to a group, please using this command
    as follow:
         
    COMMAND:
   
    mailsend [-h|--help] -[s|S] "subject" -[c|C] fileName -[u|U] unamelistfile -[a|A] useraddlist -[d|D] userdellist
   
    OPTION:
            -h | --help                 print this page
        -a | -A                        user list will be added to mail list
        -d | -D                        user list wlll be deleted from mail list
            -s | -S                 read the subject of the letter, default value is ShenQu e-bussiness
            -c | -C                        file name you want to send
            -u | -U                 mail address list
    EXAMPLE: mailsend -s "Test" -c test.html -u user.conf
   
_ACEOF
    exit 0
}

function quit() {
    echo "user list file check finished!!"
    exit 0
}

function error() {
        cat << _ACEOF
        $1 doesn't exist or the file can't be read.
        You must specified the position of $1
_ACEOF
        exit 1
}

function success() {
    if [ $1 -ne 0 ] ; then
            if [ $1 -eq 2 ] ; then
            exit 2
        fi
            echo Program return code equal to $1, there are some error.
            help
        exit $1
    fi
}

#test the file be specfiied to send can be read
#user list file couldn't be found.
function inputChk() {
  if test -n $1 && ! test "$1" = ""; then
      if ! [ -r $1 ] ; then
                 error $1
      fi
  fi
}

#get all chars but the last char
function chopChar() {
    #remove the last char in string  and return it in $rval
    if test -z "$1" ; then
                 REMAINSTRING=""
                 return
    fi
    #wc put some space behind the output this is why we need sed:
    NUMOFCHAR=`echo -n "$1" | wc -c | sed -e 's/ //g'`
    if test "$NUMOFCHAR" -eq "1" ; then
        REMAINSTRING=""
        return
    fi         
        NUMOFCHARMINUS1=`expr $NUMOFCHAR "-" 1`
        #now we cut all but the last char
        REMAINSTRING=`echo -n $1 | cut -b 0-${NUMOFCHARMINUS1}`
}

#if the line is null, return ""
function chopLine() {
    if test -z "$1" ; then
        MAILADDR=""
        return
    fi

    LINE=`echo -n "$1" | sed -e 's/ //g'`
    LENGHT=`echo -n "$LINE" | wc -c`

    if test $LENGHT -lt 5 ; then
        MAILADDR=""
        echo "The Invalid mail address: $LINE"       
        return
    fi
   
    numOfChar "@" "$1"
    if [ $NUM -ne 1 ] ; then
        echo "The Invalid mail address: $LINE"       
        MAILLADDR=""
        return
    fi

    MAILADDR="$LINE"
    return
}

#get the last char
function lastChar() {
    #remove the last char in string  and return it in $rval
    if test -z "$1" ; then
        LASTCHAR=""
        return
    fi
    #wc put some space behind the output this is why we need sed:
    NUMOFCHAR=`echo -n "$1" | wc -c | sed -e 's/ //g'`
    #now we cut all but the last char
    LASTCHAR=`echo -n $1 | cut -b $NUMOFCHAR`
    return
}

#stastic the line number of the file
function numOfLine() {
    NUMOFLINE=`cat $1 | wc -l | sed -e 's/ //g'`
    return   
}

#stastic the char $1 number of the line $2
function numOfChar() {
    NUM=0
    POSITIONSIGN=1
    NUMOFCHAR=`echo $2 | wc -c | sed -e 's/ //g'`
    FIRSTCHAR=`echo $2 | cut -b $POSITIONSIGN`
    while test $POSITIONSIGN -le $NUMOFCHAR ; do
        if [ "$FIRSTCHAR" = "@" ] ; then
            NUM=`expr $NUM + 1`
        fi
        POSITIONSIGN=`expr $POSITIONSIGN + 1`
        FIRSTCHAR=`echo $2 | cut -b $POSITIONSIGN`
    done
    return
}

#add a line that containes $1 to $2
function addLine() {
    if [ -r $2 ] ; then
        echo $1 >> "$2"
        lineFilter "$2"
        checkUserList "$2"
    fi
    return
}

#add a lot of lines that be contained, $1 is filename
function addLines() {
    cat $1 | while read LINE
        do
            addLine "$LINE" "$USERADDLIST"
            done
}

#delete a line that contains $1 from $2
function deleteLine() {
    cat $2 | sed -e "/$1/d" > $2.cre
    rm $2
    mv $2.cre $2
    return
}

#delete a lot of line , $1 is filename
function deleteLines() {
    cat $1 | while read LINE
        do
            deleteLine "$LINE" "$USERLIST"
        done
}

#check if the user list have some repeated items.
function checkUserList() {
    echo "Start check user list file ..."
    cat $1 | while read MAILADDR
    do
        SIGN=`expr $SIGN + 1`
        TAIL=`expr $NUMOFLINE - $SIGN`
        [ $TAIL -eq 0 ] && echo "End check user list file !!!"
   
        CURSOR=`expr $SIGN + 1`
        tail -n $TAIL $1 | while read OTHERMAIL
        do
            [ "$MAILADDR" = "$OTHERMAIL" ] &&  echo "Warning: There are some item repeatly in  $ $SIGN line with  $CURSOR line" && LASTERROR=2
        CURSOR=`expr $CURSOR + 1`
        done
    done
    return
}

#crean the dupliction of line
function lineFilter() {
    cat $1 | sed -e 's/[[:space:]]*//g' | sort -u | uniq -i > $1.cre
    rm $1 -f
    mv $1.cre $1 -f
    return
}

#now we will must find USER argument, read file echo line every.
function mailsend() {
    cat $1 | while read USER
    do
        #if $USER is a invalid email address, then ignore it.
        chopLine "$USER"
        [ "$MAILADDR" = "" ] && continue   
   
        #send mail to $USE
            mail -s "$TITLE" $USER < $MAILCONTENT || LASTERROR=$?
            success "$LASTERROR"
            echo "mail -s \"$TITLE\" $USER < $MAILCONTENT"
    done
}

#parse the arguments from the command lines.
while test $# -gt 0 ; do
   case "${1}" in
     -h | --help | --h* )                                 # -h for help
             help ;;
     -a | -A )
        shift
        test $# -eq 0 && help
        USERADDLIST=$1
        shift;;
     -d | -D )
        shift
        test $# -eq 0 && help
        USERDELLIST=$1
        shift;;
     -s | -S )                                                      # -s for subject
        shift
        test $# -eq 0 && help
        TITLE=$1
        shift ;;
     -c | -S )                                            # -c for the context file
        shift
        test $# -eq 0 && help
        MAILCONTENT=$1
        shift ;;
     -u | -U )
        shift
        test $# -eq 0 && help
        USERLIST=$1
        shift ;;
    -- )
        shift;
        break ;;                                               # stop option processing
    -* )
        help ;;                                                   # unknown option
    * )
                 help ;;                                        # first non-opt arg
           esac
done

inputChk "$USERLIST"
inputChk  "$MAILCONTENT"
inputChk "$USERADDLIST"
inputChk "$USERDELLIST"
numOfLine "$USERLIST"
lineFilter "$USERLIST"
echo "--------------------------------- USER LIST REPEATED ITEMS LIST ---------------------------------------------"
checkUserList "$USERLIST"
echo "-------------------------------------------------------------------------------------------------------------"
if ! [ "$USERADDLIST" = "" ] ; then
    addLines "$USERADDLIST"   
fi
if ! [ "$USERDELLIST" = "" ] ; then
    deleteLines "$USERDELLIST"
fi
#mailsend "$USERLIST"
success "$LASTERROR"
[/code:1]
这段代码用来检查用户列表的有效唯一性
[code:1]
#!/bin/bash

#first get a line
#compare with other line
USERLIST="test"
MAILADDR=""
OTHERMAIL=""
CURSOR=0
SIGN=0
TAIL=0

function error() {
    echo $1
}

function success() {
   echo $1
   exit 0
}

function numOfLine() {
    NUMOFLINE=`cat $1 | wc -l | sed -e 's/ //g'`
    return   
}
   
function checkUserList() {
    numOfLine "$USERLIST"
    cat $USERLIST | while read  MAILADDR
    do
        SIGN=`expr $SIGN + 1`
        TAIL=`expr $NUMOFLINE - $SIGN`
        [ $TAIL -eq 0 ] && success "Success finished"
   
        CURSOR=`expr $SIGN + 1`

        tail -n $TAIL $USERLIST | while read OTHERMAIL
        do
            if [ "$MAILADDR" = "$OTHERMAIL" ] ; then
                error "these are some item repeatly in  $SIGN line with $CURSOR line"
                break
        fi
        CURSOR=`expr $CURSOR + 1`
    done
done
}

if [ -e $USERLIST.create ] ; then
        rm -f $USERLIST.create
fi
cat $USERLIST | sed -e 's/[[:space:]]*//g' | sort -u > $USERLIST.CRE
rm $USERLIST -f
mv $USERLIST.CRE $USERLIST -f

checkUserList
[/code:1]

用户的邮件列表我放在/root/.mailsend.conf,内容好像是一个邮件
地址的列表,时间太久啦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 15:50 , Processed in 0.154526 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表