个人服务器情况
先简单介绍一下我的个人服务器的情况,如果有情况类似的朋友可以参考一下,首先我并没有购买云服务器,而是用一台老旧的笔记本搭建的一台服务器,放在自己家中用来学习和练习项目,幸运的是我家分到了外网公有IP地址,只不过是通过PPPOE拨号进行上网,因此这个地址不是静态IP,是动态IP,然后服务器主机通过一个家用的无线路由器联网。
问题介绍
我在阿里云购买了一个域名,域名解析需要与服务器的外网IP绑定,但是由于我的IP会动态变化,所以每当IP改变,我要手动修改,但再修改之前要查询到外网地址(百度查询ip或者访问ip.cn进行查询,但每次查询需要在连接到家中的网络才能进行查询,而且不知道什么时候IP变动)
解决思路
我的解决思路是让服务器每隔一段时间访问ip.cn查一下ip是否变化,如果变化就用qq邮箱发送一封邮件告诉我IP变为了多少(我有两个qq邮箱,一个用来发送邮件,一个用来接收)
代码实现
我利用python做了个简单的小程序,用来监听ip并发送邮件
import time
import smtplib
import requests
import re
from email.mime.text import MIMEText
from email.header import Header
# 发送邮件的函数,参数是要发送的IP地址
def send_email(ip):
#使用qq邮箱
mail_host = "smtp.qq.com" #设置qq服务器
mail_user = "*********@qq.com" #登录账号
mail_pass = "abcdefghijklmn" #SMTP登录的授权码
#邮件发收方
sender = '*********@qq.com' #发送方地址(可以用上面的mail_user)
receivers = '*********@**.com' #接收方邮件地址
message = MIMEText(ip, 'plain', 'utf-8') #邮件的内容
message['From'] = Header("Leetto", 'utf-8') #发件人
message['To'] = Header("Leon", 'utf-8') #收件人
subject = 'IP变动提醒' #邮件主题
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP_SSL(mail_host, 465) #用SMTP_SSL方式连接服务器(465代表服务器端口,端口一般为465)
smtpObj.login(mail_user, mail_pass) #登录邮箱
smtpObj.sendmail(sender, receivers, message.as_string())
print("Successful")
except smtplib.SMTPException:
print("Error:Fail to send")
if __name__ == '__main__':
ip = ("0.0.0.0") #将ip初始化为0.0.0.0
while True:
text = requests.get("https://ip.cn").text #首先爬取ip.cn
ip_text = re.search(r'\d*\.\d*\.\d*\.\d*', text) #利用正则表达式找到IP地址
if ip != ip_text.group(0): #判断ip中的内容是否与ip.cn上的外网地址相同,若不同就记录到log中,并发送邮件通知IP变动
with open('log.txt', 'a+') as f:
f.write(ip_text.group(0) + '\n')
ip = ip_text.group(0)
send_email(ip)
time.sleep(1800) #每个30分钟监测一次IP是否变动
总结
能力有限,水平一般,我也是参考了别人的代码,并自己做了一下修改和添加,希望能帮助到有需要的同学,其实还有很多方法可以使用,觉得我的方法不够完美的同学可以尝试其他方法。