Windows下利用Python动态检测外网IP并发邮件给邮箱

我们知道,运营商给分配的都是动态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变化都会发邮件

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

时间: 2024-08-26 14:09:43

Windows下利用Python动态检测外网IP并发邮件给邮箱的相关文章

python获取外网IP并发邮件

第一步:通过ip138来爬取外网ip 第二部:通过python的smtplib模块和email来发送邮件,具体用法去网上搜索,下面是代码示例: #!/usr/bin/env python #coding:utf-8 import urllib2 import re import smtplib from email.MIMEText import MIMEText from email.Header import Header ##################################

windows下安装redis并配置外网访问

windows下安装redis已经配置外网访问 下载windows版本redis 官网无法下载windows版本的redis,需要到此链接下载https://github.com/microsoftarchive/redis/releases 选择 .msi 结尾的进行下载 双击运行,直接安装.根据提示进行安装即可.可以选择安装的端口 进入安装目录 ? 选择安装的目录(根据自己实际情况选择) ? 选择运行的端口(根据自己实际情况安装) 设置redis运行的最大内存 设置配置文件(进入安装目录)

windows下安装python模块

如何在windows下安装python模块 1. 官网下载安装包,比如(pip : https://pypi.python.org/pypi/pip#downloads) pip-9.0.1.tar.gz 2.解压 3.打开cmd窗口,进入解压目录 4.输入命令  "python setup.py install"

Windows Azure 保留已存在的虚拟网络外网IP(云服务)

我们之前文章中有介绍过通过Azure Powershell来绑定vm的内部虚拟地址,现在我们可以通过powershell来绑定vm的外部ip地址了,因为近期世界互联更新了azure的部分功能,其中今天介绍的windows azure设置保留已存在的虚拟网络的外网IP(云服务地址),我们都知道在azure服务内部都有一个dhcp服务器来分发vm内部虚拟网络地址,同时还有分发云服务的外网地址:内部的虚拟地址保留我们在此不说,如果有需要可访问博客中的windows azure相关的文章中有介绍,那为什

windows下安装python +eclipse pydev 插件

目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(IDE) 1. 在Eclipse中安装PyDev插件 2. 配置Python Interpreters 四. 创建Python Project 五. 编写HelloWorld 六. 小结 一. Python简介: Python在Linux.windows.Mac os等操作系统下都有相应的版本,不管在什么操作系统下,它都能够正常工作

【转】 详细介绍windows下使用python pylot进行网站压力测试

windows下使用python进行网站压力测试,有两个必不可少的程序需要安装,一个是python,另一个是pylot.python是一个安装软件,用来运行python程序,而pylot则是python的一个功能插件,作用是进行网站压力测试.本文将介绍在windows下如何使用python pylot进行网站压力测试. 一.安装python 如果你已经成功安装了python,那么可以忽略这步.否则,请首先正确安装python,确保能运行正常.可以看看这里,windows安装python详细教程

Windows 下让 Python 多个版本共存(支持 pip)

转载自 http://blog.kgzx.net/index.php/archives/40/ 因为类库兼容性的关系,写实际项目时都是用 Python 2,但自己试验性的写点小东西还是喜欢用 Python 3在这记录一下在 windows 下让这两个版本共存的配置步骤 在官网下载两个版本的 exe 文件并安装.因为我主要用 v2,所以把它放在 后面 安装.这样在调用 python 命令时,默认执行的就行 v2 版本的 进入 v3 的安装文件夹,把 python.exe 和 pythonw.exe

如何获取本机内网和外网IP(windows+linux)

1:场景描述 在做Netty相关项目的时候,我们往往需要绑定本机的IP和端口号,如果我们把它写在配置文件中,那么我们每次换电脑运行或者部署到其他环境时候都需要修改配置文件.这样就会比较麻烦,如果我们把它做成智能的获取本机的IP,这样我们的代码的可移植性就提高了.下面就介绍一种在windows和linux下面可以智能获取我们本机的局域网IP和外网IP的方法,不妥之处还请大家多多指教. 2:解决方法以及代码 首先贴上获取IP的工具类 /** * Copyright (C) 2015 Raxtone

linux和windows下安装python拓展包及requirement.txt安装类库

http://blog.csdn.net/pipisorry/article/details/39902327 python拓展包安装 直接安装拓展包默认路径: Unix(Linux)默认路径:/usr/local/lib/pythonX.Y/site-packagesWindows默认路径:C:\PythonXY\Lib\site-packages 測试和升级python拓展安装包pip 查看pip安装时相应的python版本号 which pip /d/python3.4.2/Scripts