设为首页 收藏本站
查看: 2333|回复: 0

[经验分享] Windows下利用Python动态检测外网IP并发邮件给邮箱

[复制链接]

尚未签到

发表于 2015-12-2 11:12:40 | 显示全部楼层 |阅读模式
  我们知道,运营商给分配的都是动态IP,IP地址过一段时间会自己变化,这就给需要静态地址的应用带来不便,例如搭建服务器或者远程控制电脑,这种情况必须知道自己电脑的IP,利用Python可以方便的自动检测并向邮箱发送邮箱。
  但是,个人网络一般都是通过路由器来上网,直接检测电脑的IP并不可行,需要得到外网的IP。内网电脑可以通过端口映射来映射到外网。检测的原理如下:
  1、通过自己的电脑信息不太好获取外网IP,幸好有一些雷锋网站可以帮助我们来检测,例如
  http://city.ip138.com/ip2city.asp
  http://www.whereismyip.com/
  http://www.net.cn/static/customercare/yourip.asp
  我们只需要抓取到他的网页并把IP提取出来即可
  2、外网IP在动态的变化,但是也不是每一秒都在变,因此我们只需要隔一段时间检测一下有没变化就行
  3、把脚本做成开机启动固然可以,但是在右下角保留个东西实在看着不爽,做成服务就完美了
  下面看代码:
  (1)IP检测的脚本 IP_Detect.py



#coding=utf-8
#IP_Detect.py
import smtplib,email,sys,socket,threading, re, urllib2, time
from email.Message import Message
from threading import Timer
class Mail:
def __init__(self, smtpServer, smtpPort, smtpUser, smtpPwd, sendTo):
self.Server = smtpServer
self.Port = smtpPort
self.User = smtpUser
self.Pwd = smtpPwd
self.To = sendTo
def sendmessage(self, subj, content):
msg = Message()
msg['Mime-Version']='1.0'
msg['From']    = self.User
msg['To']      = self.To
msg['Subject'] = subj
msg.set_payload(content)
try:
server=smtplib.SMTP(self.Server, self.Port)
server.ehlo()
server.login(self.User, self.Pwd)
except Exception:
print 'connect smtp server failed!'
try:
failed = server.sendmail(self.User, self.To,str(msg))
except Exception ,ex:
print Exception,ex
print 'Error - send failed'
else:
print 'send succeed!'
class Getmyip:
def visit(self,url):
opener = urllib2.urlopen(url)
if url == opener.geturl():
str = opener.read()
return re.search('\d+\.\d+\.\d+\.\d+',str).group(0)
def getip(self):
try:
myip = self.visit("http://city.ip138.com/ip2city.asp")
except:
try:
myip = self.visit("http://www.whereismyip.com/")
except:
try:
myip = self.visit("http://www.net.cn/static/customercare/yourip.asp")
except:
myip = "So sorry!!!"
return myip
smtpServer='smtp.XXXX.com' #邮件发送帐户的smtp服务器地址
smtpPort='25' #邮件发送帐户的smtp服务器发送端口
smtpUser='XXXX' #邮件发送帐户名
smtpPwd='XXXX' #邮件发送帐户密码,我这里打X号示例,但老兄得填真的
sendTo='XXXXX' #接收邮箱地址
def run(self):
Body = "None"
while True:
getmyip=Getmyip()
localip = getmyip.getip()
ipList = socket.gethostbyname_ex(socket.gethostname())
MailBody=str(ipList)+" external IP is: "+localip
if MailBody != Body:
Body = MailBody
mymail=Mail(smtpServer, smtpPort, smtpUser, smtpPwd, sendTo)
mymail.sendmessage("IP message", MailBody)
print Body
time.sleep(600)#十分钟够了吧
if __name__=="__main__":
run("")

  (2)做成window服务的脚本 WinService.py
  注意要安装一下相关的模块pywin32 ,否则import win32serviceutil会出错,到这里下载http://sourceforge.net/projects/pywin32/files/pywin32/



#coding=utf-8
# WinService.py
#
# A sample demonstrating the smallest possible service written in Python.
import win32serviceutil
import win32service
import win32event
from IP_Detect import run
class SmallestPythonService(win32serviceutil.ServiceFramework):
_svc_name_ = "SmallestPythonService"
_svc_display_name_ = "The smallest possible Python Service"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
# Create an event which we will use to wait on.
# The "service stop" request will set this event.
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcStop(self):
# Before we do anything, tell the SCM we are starting the stop process.
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
# And set my event.
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
run("")
# 把你的程序代码放到这里就OK了
win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)
if __name__=='__main__':
win32serviceutil.HandleCommandLine(SmallestPythonService)
# 括号里的名字可以改成其他的,必须与class名字一致;

  使用方法:



WinService.py install
WinService.py start
WinService.py stop

  好了,去window的服务管理里看看有没有The smallest possible Python Service服务,然后手动把服务变成自动启动,然后看看能不能收到邮件,每次启动系统或者外部IP变化都会发邮件

  本文利用了前辈的一些代码,就不一一致谢了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146265-1-1.html 上篇帖子: selenium2+python学习笔记(一)自动化测试环境的搭建 下篇帖子: 无需操作系统和虚拟机,直接运行Python代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表