文章目录
需求: 宽带没有定制专线服务,ip会定时更新,但是服务端会有白名单,ip变化就无法再连接服务端。开发一个脚本,监测本地ip的变化,发生变化时主动发送邮件给服务端开发人员。
效果如下:
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'<h5>Python爬虫运行异常,异常信息为遇到HTTP 403...{self.time1}</h5><p>send by <a href="http://www.python.org"><img src="cid:img1" width="400px"></a></p>'
# 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
如果你觉得对你有帮助请点击关注,留言需求,我们一起写更多实用,好玩的脚本。