Python监控公网IP变化发QQ邮件通知

本次分享的代码的主要作用是:获取本机(主机可以在内网)的公网IP,并将与上一次记录在文件中的公网IP做比较,如果两个IP不相同,则将新的公网IP记录在文件中,并发送一封包含新的公网IP的电子邮件到指定的QQ邮箱。
注意!代码的调试环境是Windows10、Python 3.10,不同的环境、版本可能会运行失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import smtplib  # 导入邮件发送库
from email.mime.text import MIMEText # 导入邮件正文的MIME类型
from email.utils import formataddr # 导入对邮件地址的格式化函数
import requests # 导入HTTP请求库

my_sender = 'c******g@qq.com' # 发件人邮箱
my_pass = 'z******g' # 发件人邮箱密码
my_user = 'c******g@qq.com' # 收件人邮箱

def mail(): # 定义一个发送邮件的函数
ret = True # 默认邮件发送成功
try:
msg = MIMEText(str(MyNewPublicIP), 'plain', 'utf-8') # 构造邮件正文
msg['From'] = formataddr(["告警邮箱", my_sender]) # 设置发件人地址
msg['To'] = formataddr(["告警邮箱", my_user]) # 设置收件人地址
msg['Subject'] = '******公网IP变更通知' # 设置邮件主题
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 连接QQ邮箱的SMTP服务器
server.login(my_sender, my_pass) # 登录发件人QQ邮箱
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 发送邮件
server.quit() # 关闭SMTP连接
except Exception: # 如果发生异常,则表示邮件发送失败
ret = False
return ret

# 获取本机公网IP,建议先用自己的浏览器访问这个地址,看看能否获取到正确的公网IP地址
MyNewPublicIP = requests.get('http://api.ipify.org').text

# 读取磁盘上的公网IP
with open('D:/MyPublicIP.txt', 'r') as f: # 打开指定的文件,准备读取上次记录的公网IP
MyOldPublicIP = f.read().strip() # 读取文件内容,去除空白符

# 比较新旧IP是否相同
if MyNewPublicIP != MyOldPublicIP: # 如果新旧IP不同
with open('D:/MyPublicIP.txt', 'w') as f: # 打开指定的文件,准备记录新的公网IP
f.write(MyNewPublicIP) # 将新的公网IP写入文件
print('IP有变化。准备发邮件给QQ邮箱。')
ret = mail() # 调用发送邮件函数
if ret:
print("邮件发送成功。")
else:
print("邮件发送失败。")

else: # 如果新旧IP相同
print('IP无变化。退出程序。')
exit() # 退出程序

可以把这段代码保存成脚本文件,用Windows的任务计划来定时执行,如下图所示。

最后,我把QQ邮箱绑定到我的手机微信中,这样就可以很方便地获取到公网IP变更的信息了,如下图所示。