程序执行流程:
1. 开始接受邮件。
2. 检查发件人是否在黑名单内,如果是拒绝接受;否则继续
3. 检查发件人是否在白名单内,如果是接收邮件;否则继续
4. 对邮件进行关键字过滤,如果邮件中包含被过滤的关键词信息,则拒绝接收
   该邮件;否则,接收该邮件。

Usage: sh mailfilter.sh  [-r reject-addr] [-a add-addr][-k keywords]
###########################################################################
#/bin/bash;                                                                 
#当有邮件到达时,先拷贝一份用户分析处理
If_Mail()
{
  User=`whoami`;
  if test -s /var/spool/mail/$User;
  then
    `cp /var/spool/mail/$User /var/spool/mail/tmp`;
    return 1;
  else
    # echo '暂无邮件要处理';
    return 0;
  fi
}

#定位制定email行号
Locate()
{
   if [ -f "/var/spool/mail/tmp" ];
   then
     Get_String=`grep -n $1  /var/spool/mail/tmp|head -1`;
     #${varible%%string*}从右向左截取最后一个string后的字符串
     Get_N=${Get_String%%:*};
     #Get_Sting=`sed '$n,touch@localhost.localdomain' /var/spool/mail/tmp|head -1`;
     #echo $Get_Sting;
   else
     Get_N=0;
   fi
  return $Get_N;
}

Deal_Black_List()
{
  #此邮件判断在黑名单中
  Mail_Addr=$1;
  Locate $Mail_Addr;
  #$?显示最后命令的退出状态
  if test $? -eq 1;
  then
    echo "$Mail_Addr 已被列入黑名单,拒收此Email!!!";
    #清空文件
    `echo > /var/spool/mail/$User`;
    # 删除空白行
    ` sed -i '/^$/d' /var/spool/mail/$User`;
    `rm /var/spool/mail/tmp`;
    return 1;
  else
    return 0;
  fi
}

Deal_White_List()
{
  Email_Addr=$1;
  Locate $Email_Addr;
  #$?显示最后命令的退出状态
  if test $? -eq 1;
  then
    return 1;
  else
    return 0;
  fi
}

Filter_Keywords()
{
    if  [ -f "/var/spool/mail/tmp" ] && [ 0 -lt `grep -c $1 /var/spool/mail/tmp` ];
    then
      echo "含有过滤关键词$1,拒收此Email!!!";
      #清空文件
      `echo > /var/spool/mail/$User`;
      # 删除空白行
      `sed -i '/^$/d' /var/spool/mail/$User`;
      `rm /var/spool/mail/tmp`;
      return 1;
    else
      echo "邮件接受";
      return 0;
    fi
}

while getopts :r:a:k:h opt
do  
    case $opt in
        r)
            Black_Addr=$OPTARG;
            ;;
        a)
            White_Addr=$OPTARG;
        ;;
        k)
            Keywords=$OPTARG;
            ;;
        h)
            echo "Usage: sh mail.sh  [-r reject-addr] [-a add-addr]";
            exit 0;
            ;;
        *)
            echo "-$opt 参数输入错误!";
            exit 0;
            ;;
    esac
done

echo '邮件过滤系统启用';
Old_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
New_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
while :
do
  sleep 3;
  n=0;
  If_Mail;
  if test $? -eq 0;
  then
     #邮件为空
     continue;
  else
     New_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;
  fi
  #判断是否有新文件
  if [ "$Old_Hash" = "$New_Hash" ];
  then
    continue;
  else
    echo '新邮件到达,系统即将处理!';
    Old_Hash=`md5sum /var/spool/mail/$USER|cut -d' ' -f1`;  
  fi
#黑名单过滤  
  Deal_Black_List $Black_Addr;
  if test $? -eq 1;
  then
    continue;
  fi
#白名单过滤  
  Deal_White_List $White_Addr;
  if test $? -eq 1;
  then
    echo "$White_Addr的邮件已接收"
    continue;
  fi
#关键词过滤
  Filter_Keywords $Keywords;
done
###########################################################################

这是我的一次作业,第一次写shell脚本,不乏纰漏。望指正!

Shell 脚本模拟 milter 实现黑白名单及关键词过滤的更多相关文章

  1. Android随笔之——用shell脚本模拟用户按键、触摸操作

    之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...

  2. Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试

    需求 在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面.不断循环. 思路 一开始想到的就是按键精灵,下了 mac 版使 ...

  3. DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现

    在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中,笔者阐述了一个防御状态机,它可用来抵御来自应用层的DDoS攻击,但是该状态机依赖一个能应对大量条目快速增删的ip黑白 ...

  4. ip黑白名单防火墙frdev的原理与实现

    汤之盘铭曰 苟日新 日日新 又日新 康诰曰 作新民 诗曰 周虽旧邦 其命维新 是故 君子无所不用其极 ——礼记·大学 在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中 ...

  5. Linux系统防CC攻击自动拉黑IP增强版Shell脚本 《Linux系统防CC攻击自动拉黑IP增强版Shell脚本》来自张戈博客

    前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原因是因为360网站卫士的缓存黑名单突然无法过滤后台,导致WordPress无法登录!虽然,可以通过修改本地hosts文件来解决这个 ...

  6. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  7. shell脚本(管理守护进程)

    工作中常常会遇到处理消息队列的消费者进程,这样的进程是一个守护进程,即一个服务.服务通常写个shell脚本来管理,查询服务的status  ,启动start 关闭stop  重启reload.最近在学 ...

  8. Android自动化压力测试之Monkey Test Android常见的错误类型及黑白名单的使用方法(四)

    Android常见的错误类型有两种 1.ANR类型 1)在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2)BroadcastReceiver在10秒内没有执行完毕 2.Crash类型 1)异 ...

  9. Hadoop的shell脚本分析

    你会发现hadoop-daemon.sh用于启动单独的本机节点 而hadoop-daemons.sh 会批量的ssh到别的机器启动 前记: 这些天一直学习hadoop,学习中也遇到了许多的问题,主要是 ...

随机推荐

  1. PHP Cookie学习

    <?php /* Cookie在计算机中保存的格式 用户名@网站地址[数字].txt Cookie在文件夹下,每个Cookie文件都是一个简单而又普通的文件件而不是程序,Cookie中的内容大多 ...

  2. 去除VS2010中中文注释下的红色波浪线

    1,中文注释以分号结尾 2,Assist X 菜单栏->Assist X Option->Underline 选择“min”.

  3. 安装search everything中文语言包

    Everything 作为很多人的必备工具,特写这篇文章,一方面让想使用国外优秀软件的英语小白有一段过渡期,另一方面也为自己整理下资料.当然,这个可不是不学好英语的正当理由. 步骤: 1. 下载好se ...

  4. bzoj2734: [HNOI2012]集合选数

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  5. glide简介

    golang包管理工具glide简介   golang包管理工具glide简介 前言 golang是一个十分有趣,简洁而有力的开发语言,用来开发并发/并行程序是一件很愉快的事情.在这里我感受到了其中一 ...

  6. 一篇旧文章,结合汇编探索this指针

    //VC6.0下成功编译 #include <iostream.h> class X{ public: void foo(int b,int c){ this->a=b*c; cou ...

  7. 【转】nodejs

    Node.JS + MongoDB技术讲座            云计算 + 大数据 = 未来. 在中国的云计算上基本上是一个概念,个人感觉与当初的SOA没有太大的区别,空泛的理论. 中小型开发的未来 ...

  8. Unity3d 读取网络xml

    Unity3d 读取网络xml Unity3d 读取网络xml,这个xml文件需要不包含BOM信息,可以用UltraEdit打开xml文件,并且另存为的时候,选择不包含BOM的utf-8格式存储!

  9. codeforces Dima and Bacteria

    题意:给出n,m和k,表示有n个细菌,m种仪器和k种细菌,给出k种细菌的数量ci,然后每个细菌按照种类排成一排(所以有第i种细菌的序号从∑(1≤j≤i-1)cj + 1 到∑(1≤j≤i)cj):接下 ...

  10. memcached采用的网络模型

    memcached采用的网络模型是早前提到的半同步半异步的网络模型. 简 单的说,大致流程就是:主线程负责接收新的连接,接收到新的连接之后,选择一个worker副线程,将该新连接push到副线程的连接 ...