监测ip变化并发送邮件通知

文章目录

            • 1. 检测此时电脑ip
            • 2. 知道了现在的ip就可以使用 >> 重定向到你自己的文件中
            • 3. 取出你文件中保存的ip,并重新获取你现在的ip 如果ip不一样代表发生了变化,就发送邮件
            • 4. 发送邮件的代码如下:

需求: 宽带没有定制专线服务,ip会定时更新,但是服务端会有白名单,ip变化就无法再连接服务端。开发一个脚本,监测本地ip的变化,发生变化时主动发送邮件给服务端开发人员。

效果如下:
监测ip变化并发送邮件通知_第1张图片

1. 检测此时电脑ip


步骤如下:

2. 知道了现在的ip就可以使用 >> 重定向到你自己的文件中
3. 取出你文件中保存的ip,并重新获取你现在的ip 如果ip不一样代表发生了变化,就发送邮件

脚本如下:

while True; do
	#statements
	last_ip=$(cat /Users/zh/Desktop/zh/my_ip_history.txt | tail -n1 )
	now_ip=$(ifconfig utun2 | tr -s ' ' | cut -d' ' -f2 | tail -n1)
	if [[ $last_ip == $now_ip ]]; then
		echo "ip未发生改变为: $last_ip";
		
	else
		echo "ip已经重置: 当前ip为: $now_ip"
		echo "$now_ip" >> /Users/zh/Desktop/zh/my_ip_history.txt
		# 发送邮件
		python3 /Users/zh/Desktop/py_project/test2.py $now_ip
	fi
	sleep 60;
done
4. 发送邮件的代码如下:
# test2.py
import sys
import time
from email.mime.multipart import MIMEMultipart  # 打包多个部分的邮件内容(正文、附件、图片...)
from email.mime.text import MIMEText  # 邮件的正文内容
from email.mime.application import MIMEApplication  # 用来发送附件
from email.mime.image import MIMEImage  # 用来发送图片
import smtplib  # 发送邮件
from email.utils import parseaddr, formataddr
from email.header import Header


class EmailAlert(object):
    def __init__(self):
        """连接smtp服务器"""
        # 1.邮箱服务地址
        smtp_server = 'smtp.163.com'  # 网易邮箱服务地址:smtp.163.com;QQ邮箱服务地址:smtp.qq.com
        # 2.实例化smtplib模块中的SMTP对象
        self.server = smtplib.SMTP()
        # 3.连接服务器,需要2个参数[邮箱服务地址、SMTP端口号]
        self.server.connect(smtp_server, 25)

        """登录邮箱"""
        # 1.发件人地址
        self.from_addr = '***@163.com'
        # 2.邮箱授权密码 【注意】该密码不是你邮箱的登录密码
        password = '***'  # 替换成自己的邮箱授权密码
        # 3.登录邮箱
        self.server.login(self.from_addr, password)
        # 当前时间(看是实际开发需求)
        self.time1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))

    def _format_addr(self, s):
        name, addr = parseaddr(s)
        # 如果包含中文,需要通过Header对象进行编码。
        return formataddr((Header(name, 'utf-8').encode(), addr))

    def Mail_Notice(self):
        """'编辑发送信息"""
        # 1.收件人/抄送人地址
        # 如果要发给多人,格式为['***@qq.com','***@163.com','***@qq.com']
        to_addrs = ['***@qq.com']  # 收件人地址
        # cc_addrs = ['***@qq.com']  # 抄送人地址

        # 2.构造一个邮件对象
        msg = MIMEMultipart()
        subject = 'ip监测-ip发生变化会主动发送邮件通知'
        msg['Subject'] = Header(subject, 'utf-8').encode()  # 邮件主题
        msg['From'] = self._format_addr('ip监测<%s>' % self.from_addr)  # 发件人名称
        msg['To'] = ','.join(to_addrs)  # 收件人
        # msg['Cc'] = ','.join(cc_addrs)  # 抄送人

        # 3.1.1如果是纯文本邮件 构造MIMEText对象,需要3个参数[邮件正文、MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain'、编码格式]
        # 其中,'_subtype'值默认为'palin'
        now_ip = sys.argv[1]
        text_str = f'{self.time1} - ip为: {now_ip}'
        content = MIMEText(text_str, 'plain', 'utf-8')  # 正文内容

        # 3.1.2有时候我们发送的可能不是纯文本,需要发送HTML邮件,将异常网页信息发送回去。在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由“plain" 变为“html”
        # html_str = f'
Python爬虫运行异常,异常信息为遇到HTTP 403...{self.time1}

send by

'
# content = MIMEText(html_str, 'html', 'utf-8') # 4.添加到 MIMEMultipart msg.attach(content) # # # 3.2如果在HTML邮件中,想添加图片 # file_path = '/Users/zh/competitive_benchmarking/Automator/page0.jpg' # 你本地图片的路径 # img = MIMEImage(open(file_path, 'rb').read()) # 打开读取图片 # img.add_header('Content-ID', 'img1') # 给图片一个ID值 需要跟上面html_str = '...img src="cid:img1">...'中的cid值对应 # msg.attach(img) # 3.3在邮件中添加附件(xlsx、docx、pdf、MP3、MP4...) # file_path = 'C:\\Users\\admin\\Desktop\\租房信息.xlsx' # 本地路径 # app = MIMEApplication(open(file_path, 'rb').read()) # app.add_header('content-disposition', 'attachment', filename='租房信息.xlsx') # msg.attach(app) """发送邮件""" try: # 方法中介绍需要传入msg, from_addr=None, to_addrs=None,mail_options=[], rcpt_options={} # 为什么这里只传入一个msg呢,因为在方法下面还介绍了,如果没有传入会自动去msg中找这些参数 self.server.send_message(msg) # 发送邮件 print('邮件发送 ...OK') except Exception as e: print(f'邮件发送 ...fail\n原因如下:{e}') """退出邮箱""" self.server.quit() if __name__ == '__main__': email_alert = EmailAlert() email_alert.Mail_Notice()

最后我们运行脚本就好了。
我的脚本中sleep 60就是每分钟检验一次,实际需求可能不需要,因为ip可能是一天变化一次或者几天变化一次,自己进行调整即可。
获取ip的方式很多种还可以使用正则的方式,如下:

ifcon_data = os.popen('ifconfig | grep inet').read()

match_data = re.search(r'17\.\d+\.\d+\.\d+', ifcon_data)

发送邮件参考好友代码,传送门: https://blog.csdn.net/qq_45352972/article/details/109280576?spm=1001.2014.3001.5501

如果你觉得对你有帮助请点击关注,留言需求,我们一起写更多实用,好玩的脚本。

你可能感兴趣的:(python,shell,linux)