一、网页邮箱添加
首先在昨天的网页上简单添加一个邮件列表,所以在昨天的服务器上新增email1.txt和email2.txt两个文件,返回的HTML如图。

在服务器代码中使用正则添加邮件列表路由/email1和/email2

二、Shell提取邮箱 collect.sh
Shell提取邮箱的思路,通过curl读取网页,egrep正则匹配邮件列表,正则匹配链接,再爬取提取到的链接。代码细节如下。
首先提取邮箱和提取链接的正则为:
邮箱正则: [a-zA-Z0-9_-.]+@[a-zA-Z0-9_-.]+(.[a-zA-Z0-9]+)+
链接正则: href=.*>”|cut -d”\”” -f2
我们在bash脚本中写定了要爬取的网站,而通过命令行参数传入爬取的第一个页面。
www是一个数组变量,用来记录爬取的链接,count记录链接总个数。Line储存HTML代码行数,方便下面用for循环对每行进行提取。
每行提取邮箱和检测链接,如果读取到邮箱则和已经保存的邮箱比较看是否重复,链接也和已存在的链接进行比较,不存在则添加。
K用来记录已经爬取的链接数,while循环控制爬取完所有的链接。
由于提取的邮箱有很多空行,所以最后一段脚本是对邮箱进行清洗去除空行。
脚本运行情况如下。
可以在服务器后台看到有两个请求信息。
查看邮箱列表,两个页面邮箱已经全部录入。
所以邮箱提取页面完成,过程细节和坑多已略过。
三、sendEmail邮件发送 send.sh
这一步骤采用sendEmail命令行工具进行邮箱发送。SendEmail是通过借用外部SMTP服务器来进行垃圾邮件发送的。我们这里注册了一个163邮箱,开启POP/SMTP等功能,设置授权码。垃圾邮件发送脚本如下。
发送邮件内容需要实现根据时间进行不同问候功能,所以前面一段是用来判断时间修改问候语。然后读取邮件列表通过sendEmail程序进行邮件发送。
发送情况如下:

这里为了测试,手动修改了emailist.txt文件邮箱列表,避免发送太多邮箱被封。
四、cron定时任务
这里有个大坑,昨天花费了大量的时间去才爬过去,熬到12点过才搞定。Ubuntu已经自动开启了cron服务,我们可以直接使用crontab指令进行任务设定。直接使用crontab -e即可进行编辑,添加以下代码即可。
这里我设置的是每天凌晨运行邮箱收集脚本进行邮箱列表的更新。每隔一分钟运行垃圾邮件发送脚本。保存后重启cron服务即可。
测试效果如下:

可以看到邮箱差不多一分钟收到一封邮件。测试完成。
这么简单的操作却花费了大量的时间,昨天同样的操作我们设置的cron并没有生效。以为是cron的配置问题,因为我们手动执行脚本并没有错误,也有执行权限。试了无数的cron配置,毫无作用。最后才发现,只要将我们send.sh和collect.sh脚本中所有文件操作都采用全路径方式,cron定时任务就可以实现了。如图。
我想可能cron并没有直接执行改程序,而是将程序拷贝到某个地方进行执行,所以会出现脚本相对路径出错的情况。
代码
download.sh
#!/bin/bash#邮件正则:[a-zA-Z0-9\_\-\.]+@[a-zA-Z0-9\_\-\.]+(\.[a-zA-Z0-9]+)+#记录网址链接及其个数base="http://127.0.0.1:8000"www[0]=$1count=0#抓取第一个页面touch emailist.txtcurl $base${www[0]} -o data.txtline=`cat data.txt|wc -l`for i in `seq 1 $line`dotmp=`cat data.txt | sed -n "$i"p|egrep "[a-zA-Z0-9\_\-\.]+@[a-zA-Z0-9\_\-\.]+(\.[a-zA-Z0-9]+)+"|cut -d">" -f2|cut -d"<" -f1`inaddr=`cat emailist.txt|grep "$tmp"`#如果邮箱不存在则加入邮件列表if [ ! "$inaddr" ]thenecho $tmp >> emailist.txtfi#检测链接link=`cat data.txt |egrep "href=.*>"|cut -d"\"" -f2`#如果链接不存在则加入数组for((j=0;j<${#www[*]};j=j+1))doif [ ${www[$j]} == $link ]thenbreakfidoneif [ $j == ${#www[*]} ]thenlet count++www[$count]=$linkfidonek=1while (( k <= $count ))doecho $kcurl $base${www[$k]} -o data.txtline=`cat data.txt|wc -l`for i in `seq 1 $line`dotmp=`cat data.txt | sed -n "$i"p|egrep "[a-zA-Z0-9\_\-\.]+@[a-zA-Z0-9\_\-\.]+(\.[a-zA-Z0-9]+)+"|cut -d">" -f2|cut -d"<" -f1`inaddr=`cat emailist.txt|grep "$tmp"`if [ ! "$inaddr" ]thenecho $tmp >> emailist.txtfilink=`cat data.txt |egrep "href=.*>"|cut -d"\"" -f2`for((j=0;j<${#www[*]};j=j+1))doif [ ${www[$j]} == $link ]thenbreakfidoneif [ $j == ${#www[*]} ]thenlet count++www[$count]=$linkfidonelet k++donegrep -v "^$" emailist.txt >> tmp.txtrm emailist.txtcp tmp.txt emailist.txtrm tmp.txt
send.sh
#!/bin/bashtime=`date +%H`if [ $time -gt 19 ]thengreet="Evening"elif [ $time -gt 12 ]thengreet="Afternoon"elsegreet="Morning"firow=`cat /home/rainturtle/mail/emailist.txt | wc -l`for((i=1;i<=$row;i=i+1))dotarget=`cat /home/rainturtle/mail/emailist.txt | sed -n "$i"p`echo "$target"/usr/local/bin/sendEmail -f rainturtle@163.com -t $target -s smtp.163.com -u "Good $greet" -o message-content-type=html -o message-charset=utf-8 -xu rainturtle@163.com -xp rainturtle456 -m "<h2>Dear Sir/Madam</h2><br><h3>Good $greet!</h3><h3> Hope you have a good day~~~</h3>" -o tls=nodone
