一、网页邮箱添加
首先在昨天的网页上简单添加一个邮件列表,所以在昨天的服务器上新增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]=$1
count=0
#抓取第一个页面
touch emailist.txt
curl $base${www[0]} -o data.txt
line=`cat data.txt|wc -l`
for i in `seq 1 $line`
do
tmp=`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" ]
then
echo $tmp >> emailist.txt
fi
#检测链接
link=`cat data.txt |egrep "href=.*>"|cut -d"\"" -f2`
#如果链接不存在则加入数组
for((j=0;j<${#www[*]};j=j+1))
do
if [ ${www[$j]} == $link ]
then
break
fi
done
if [ $j == ${#www[*]} ]
then
let count++
www[$count]=$link
fi
done
k=1
while (( k <= $count ))
do
echo $k
curl $base${www[$k]} -o data.txt
line=`cat data.txt|wc -l`
for i in `seq 1 $line`
do
tmp=`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" ]
then
echo $tmp >> emailist.txt
fi
link=`cat data.txt |egrep "href=.*>"|cut -d"\"" -f2`
for((j=0;j<${#www[*]};j=j+1))
do
if [ ${www[$j]} == $link ]
then
break
fi
done
if [ $j == ${#www[*]} ]
then
let count++
www[$count]=$link
fi
done
let k++
done
grep -v "^$" emailist.txt >> tmp.txt
rm emailist.txt
cp tmp.txt emailist.txt
rm tmp.txt
send.sh
#!/bin/bash
time=`date +%H`
if [ $time -gt 19 ]
then
greet="Evening"
elif [ $time -gt 12 ]
then
greet="Afternoon"
else
greet="Morning"
fi
row=`cat /home/rainturtle/mail/emailist.txt | wc -l`
for((i=1;i<=$row;i=i+1))
do
target=`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=no
done