自动发送公网IP至邮箱Python脚本

背景

  • RDP远程家里的服务器下载机
  • 小米路由器重启或者运营商魔法使得外网IP变动
  • 小米路由器APP去除了显示外网IP功能

需求描述

  • 获取家庭网络公网IP
  • 通过邮件发送IP
  • 定时监测IP是否变化,如果变化将发送邮件

解决方案

  • IP获取:
    • 网络上常用方案是通过socket获取本机IP,但在路由器拨号情况下只能获取到192.168.*.*的内网地址,ipconfig同理。
    • 通过浏览器访问ip识别类网站会自动显示公网IP。
    • 访问并抓取网页,拆分提取IP。
    • 此方法跨平台
    • getIP()
  • 邮件发送:
    • 使用内置smtplib模块
    • 写好smtp登录地址端口账号密码,并确认是否SSL(我使用了SSL端口和登录)。
    • sendIP(IP)
  • 定时监测:
    • 线程timer定时启动检查IP是否变动
    • checkIP()

完整代码

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
46
47
48
49
50
51
52
53
#coding=utf-8
import threading
import urllib2,re,smtplib
from email.mime.text import MIMEText

def sendIP(IP):
#config
host = 'smtp.qq.com'
port = 465
sender = '*******@qq.com' #
receiver = '******@qq.com' #
pwd = '****' #Password
#core
msg = MIMEText(IP,_subtype='plain',_charset='gb2312')
msg['subject'] = 'IP changed'
msg['from'] = sender
msg['to'] = receiver

hero = smtplib.SMTP_SSL(host, port)
hero.login(sender, pwd)
hero.sendmail(sender, receiver, msg.as_string())
print 'IP is sended successly.'


def getIP():
response = urllib2.urlopen('http://www.ip.cn/')
html = response.read()
IPlist=re.split('<code>|</code>',html)
return str(IPlist[1])

def checkIP():
global IP
IPnow=getIP()
print "Checking..."
#sendIP()

if IP!=IPnow:
IP=IPnow
print "IP changed "+IP

sendIP(IPnow)

t = threading.Timer(3600.0, checkIP)
t.start()


if __name__=="__main__":
print "start"
IP=getIP()
print IP
sendIP(IP)
t = threading.Timer(3600.0, checkIP)
t.start()

备注

  • 没有try&catch和错误判断,因为懒。
  • 其实装其他第三方远程控制软件也可,也是因为懒。