是F 发表于 2015-12-2 11:12:40

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变化都会发邮件
http://www.cnblogs.com/lishuai0214/p/data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAACZCAIAAAAgpZCXAAAYjklEQVR4nO2dPZLktrJGuYzZxhjj3JXIblP+RMisTUyEfK1Bfkco5N5FvI3wGezmRecfkiQIglXnBKPEQuEnMwHmR9Z0CdOcY/okWR8AAOClQCABAAAaEAnq4/HoZgcAAMCtMQR10dHl293yFQAAADykUj4ej/f390VBH4/H+u+maCoAXM7giSgwL295Ex87D9cTz2BdbpaUolYStN0QTK+XUkdXiT2J280oAFyCSFDXWuKRqWZ+uhY2t+qk4S7Bkzp97smk/tSsGUyra1v5ZnkkFQ+mosR0L545/VZ7aPaTcUZXTrkdGqwLg4aePeLcHD1jKgAsiEtmwCsoyG/VwuSnWw04dbg+TDXWamUT8ZopFyN6n0amil7e39+FD9VOtYlmK9Pt/NvApUydZM/xeTLE++wBgAB9m3vtXWlSurYq3EHvOg93CbESleemiq0lQR3RyQbbhEHLw+hc/Inv9PmtryipOuNVOENQM563FdTMQAgqQBNE0k9eYt1MCjQprmaWH/Gu83D9ycRZVJucTG76OymZ2BQWw6xFO9e/9f38uvd/Vi7/DezwDNXGxf14rcyetQ36bVwSeCFWZGDMrKbWa2gaE0ynmgWA16K8Fq61JG9DppqXGXa4mRSJVsN1JpZDM1XOViYvE6knMWburVuoDVr/xfTzaXV6PKbitzQfEus5Y7qaL4zn3vZByYy5RDLLKHNetSowY5M95sn4ix7gJIZK/XlBNRH9mJnhDEFtO1xP4nQ6+26KclNuRY71MnY1RK4sr/1aT6j15y1jpJp2moW7BdVbuPqtVyf2KDDME8Kt9uhWg694gFMZ6kLIZIDZycJx8jkoqCYnDdeNrVlaqJguN1/Lal4MK3bGPjwe01Lna6fGQ2rVyaQmBd0GdlbHCnreND0Zw1rZk4wYwItQvWYvMSb4yEzWooJI2Qddi1NN8+H6INTRc0EXeknV+9QcN64jm8RufArnVFSeivL/1Szk1ijRFbSJZqR0K22ktzjMEfXceKMHXgQm6fqmndWxglZBNACelcnJbpOfFjMlTezxPtJ5yaxg9rnPVLPVecNdgudj4I6YiPJtdY6CQQ0zEqYv/4b6MeryzHo8+jeavz4QEACT4EbzwlvMKWT2nws9m+N764NWnTTcJWRMDWakfDtZGlyWbw1O5eFvnst/Q/04WfT1RhMwPrdb0wAAIKg/oa5ivoooqR8AAECQfpLlEQoAAMAHgQQAAGhAJKhsMA4AAJDEEFQ2GAcAANiKVEo2GAeAAdG/ZBjwrzoCezb89KKRU8kojRbDKp7Burzqmhei+G3UoWdBqaNnbzAOABAjUpM+78zkk6lmfroWNrGnWufIcBfiLQB9bkpsHCLRVSaqXxqWbxpuMO7Via0xW21qAgBPhkgvmxJcZ8wMnqmW/3S3JacOdypa1cw1MDmCWp0CUUG32hBM0VGTDcbdwbbP3PiTDQAdCPLmJSSVcqugHrldqEpO2+GuIlai8tz0Kw5OrNN120RfTTYYdwdDUAFgF2uOG0QDktIVVzPL96VyPW7G5lbDdSMTZ1HN8yvw14xJJj6GWcc3GC89zNcxF6UZvriVDms1CgAwMgNeyEl7UlnYyZPNBfW84fpQCmSgQUJKTb8CpTQFyFQio1vd0fENxmdnkqp1zjsBgJsikuPWHHeqVZlqsc066e9LX95AYsRWw/Wnmt69qOpqcXyqEYuM1EaLhbtjg3HTrEydtieDrw8AyDPa1R0YIJKermlKQlUwjpt33nBn4+lIfK41SHw6J7w+JKiio30bjHvDV+u0EtTV4MA7ALgRWlCvvcYzgurl4rKCeK4InkCOm3fecKciZtxzQRfuvnEpl9Y29Y3d2L3BuHZPRMFsGLzV5dU6secAcCNEXjOT4I6Sg/bEH3lZ2EtTZt5vaN55w/XEcy1wJ1ZWUSFQ30OC+tn+lA3G/eGG6woALiS+F7/qSp9CZv8x1LPZfEg4Yli1WpPh+pMxNTkjQbfeequMW7O73wbjreb1XosDAACeg/pdzKrtbDAOAADgkdXF230tAAAA0BMEEgAAoAGRoLLBOAAAQBJDUNlgHAAAYCtSKdlgHACGhUSUJ/6VTlmtm0lN8AzW5ZnfDiV/QpO1zbOg1FE2GAeAERAJClbMX17GddbCvpYeRfw8NDg3JTZzn1EGJ9nko375ZrQNxgEAVnY/N7wgGx6qhg+jVrXqnUEpqN69hXluttoQTNHRaBuM724FAM+E99BwrVVDUZWcapOe1u4mVqLy3PQrDk6s03XbRF+jbTC+uxUAPA0ize1Ldi+Fl6W1ltwrmJ72a6e0g7pJMIquk9I43VGfDcbjGwRdreoJADw390r915JRC/F2/KiWAhlokJDS6hNgUqcySmR0NNQG47oVALwmN0r9/dGp31QCrTF3iWosE7PllCmo1fhUIxYZqY1e23/K6iQKyxPTGdOswP/AmbwnAPDc3CX1j4AZolhHR46qpwjxuVYT8emc8PqQoIqO+mwwHs/oyNMMAN0wEwX5wcTLpeKh5RaRFOrouaAL4wUT6E4pw9vUN3bjvA3G9Xm1q9gTAHhivNQfp8VqybOSeTi5hZpqgnsFr06srKJCsLoOCepn+34bjAMACIKbdW61NcmwxM8wI5MxdVLMNZfjp7hsVGt299tgHAAA4L7U72JWbWeDcQAAAI+sLt7uawEAAICeIJAAAAANiASVDcYBAACSGILKBuMAAABbkUrJBuMAMCyDJ6LAvLzlrXxM/rJo8JBqPIN1eea3Q8mf0GRt8ywodZQNxgFgBESCutYSj0w189O1sIk91TpHhruQ0uD43JTYOESiq0xUvzQs35y3wXierT1k/bzOQgBowrT3uaEbZgbPVMt/utuSU4c7Fa1q1TuDUlCrU2Cuq6BCZKro6NQNxs8jv0DHXz0AoPEeGi63Jy7cKqhHvKtKTtvhriJWovLc9CsOji7fFBbZ16kbjJ9HXlAB4HaINLcv2Z1nUqBJcTWzvIl3XpY+abhuZOIsqnl+Bf6aMcnExzDrjA3GVQ/2d7DmWx0+s6Tipz8HVQvNT3U/OxwBgDxmmruKpA2pLOxksyNuZtSi4XB9KAUy0KAyXZs1RWGgJpOiYqHu6KQNxrXGmA5n+jHdjv0MmngWJsfKWDj+SgUYn6EuqHzOMRH9xKnpyEBixFbD9aeaVzP6Mm/5zkB3VTdSG722X2i1wbhZP5hd8VbUEQbkl0I1cJ6RVQu1edrmpJEAoBkq9Qc2VC98L60FnzYx77zhzsbL9vG5zsPi0znh9SFBFR013GC8laDGa9FzJOgw7iRz65DpJ2MnAATsuPY7GBN85OVi87a+mgyPm3fecKci1NFzQRfGCybWAnMS6+obu9F8g3HhVRARswdRbsbXdGSHhaWdeU9jRzwLASBGZw9xXr14zZIm9ngfTU4W9mz2fGxl3nnD9cRzLXDHDLi3ioLVVY1S5mmXDcYB4DKCW9gLb1L13bwwybyfDmzW9Q8aVq3WZLj+ZExNzkjQrVbWVFRrdrPBOAAAQJ36Xcyq7WwwDgAA4JHVxdt9LQAAANATBBIAAKABkaD+9vOvuPF/f/3n++//8sorr7zyyusrv7qCuujotx9vf/79f99+vC3npqB+//1fDg4ODg6OVz7+++s/tqD+9vOvP379s6jpbz//+vbjrVRW8wmVg4ODg+P77/8Gjxn5J5AmzyqdhxshyLq86pr3fBi/DbqSgrrI56Kg6+sisTyhcnBwcCyH+aWdmZqDOl5hc6tOGu6qyCfPtWtJCfMi5jWxn1CXR1LxYFqWiK7L747L8WJbmwdXDFcN1iCHtjn2a1M0NjVsGK59BlTjw8Fxi8PM4Jlq+U+3GnDqcN2iGqMdmQtBrcZE5964QmDkF0H99uPtj1//rE+oq6yuJYEbwojOk5Rcxzv6udCFffYkp8BcQw1dGP8q5eA4ciQv2K3XtZljm1vVarhxIv/dyj+mX54e60+r0VsP+wl1fRhd/gG1/O73j1//rH/0uypr+W+oZyToIyFGUK8VVA6O5z50XjY1Ka5mlm9K5dcOd2HYA8dFNc+vwF8zJnF8luGMf0NdtHMR1G8/3n77+Sa+Af7z74+vfwPjTLfNQGSCUu3HjK/ZuTdWMFVBk609i5JMxGIvqgtOx9Mcq+qX53vGPNNx0xh9Eoeoag8Hx0lHcuFlqnlX/Y61bTaJs8qR4S6JefnqORLXFIVBfGaFaZj7hFr+ce/n0+rbbz/fVn1d3i6CmnlCDU6SEy+CYvYTBHeTGdUllfGrakzSwmSd6lj7et43g8FAerk3t5CDo9uRF1QT0U98yRy06rzhLgm4Z7Dnpq4WzIhZkgnO0sR4Ql1/e/opq/oJ9eMkmEgvjepkapoVB8VblLE9ZqtgSrZOarXneCyvn6oXsePBqtrql2lhJlDmAt1t4aZocHCcdCSvQXN9xhf7pgtN92xy0nCXRDt/7uWHMuEkc35czf0dasmipn/+/ab+RulDZfc9oebDZ7odL46qPfmpiitnHIxLqhHb5EVcR6+q/HzlpzK+XFtZuCkaHBwnHZmU4uXisoKQvU3pKGnVecP1DLUpUqZ3OvJxajInyJzEeNLnjKAuX/MuOrq8ruWiL88xszywyQyKiIiHuWhiI4U9SQuDJrrnoCRjXlAtY563DnTEzPmK5zSYPtOqpIXVfpIrioPjpCNYdeVVY9YUFcw+961q78I8abhxIq8zQzUC5rnXjzeVy5F6Qp0//lV1+TfUt/VvlNY/SnrB/1PSjZbdE5jNwTHsEWfO7/5zoXcLqOs3tOqk4a6K/I44VF3Wb+evyhpHafm08oS6fru7/nHvoqniCfVFjtutvO9qWXBwcHBwtD02PKGuf6O0/nHvWviCT6gcHBwcHBziSAmqUFbxP0u63AcODg4ODo5rj+wTaswIu9DxyiuvvPLK67WvdUF9PB5H5BYAAOB1MAR10dFpmsQrAAAAeEilfDwe7+/vi4I+Ho9pmtBUABiHkXNRYFve7CYOdh6uJ57Burzq2lQQNNwQTM+CUkdXiQUAuASRmi5n8slUMz9dC5tbddJwl1AaHJ+bEuvNlDlEPLlGw/LN8kgqHkxFiTm2GC8zMADAJnSWHC3PmBk8Uy3/6VYDTh2uD95dQnBnUC6VakxEhSPLTHb0/v4ufKh2apo+/iQBwF3I5NP+JmUKtyrcQdc6D3cJsRKV56Zf8fqJdbpum+hreRidiz/xnT6/9RUlsZN3mRsAuBf7Hh3OMCOj7nE1s3xfKr9kuP5k4iyqeX4F/poxycTHMGvRzvVvfT+/7i2/y7X9Md3ThaJCUCeoBgAviE4Xg1hypJrn1D5Bzfd/fLjOlAIZaJCQ0mpMgviYtyCRhbqj9V9MP59Wp8djKn5L8yGxgX2zNUnixHQ4OAEA8DLGVZZkqpmIfsz8foagth2uJ1V18Nw0n9m8GTFLdCeukdrotf2nrE6isDwxnfGcLw31BNVccIPPNAB0IBaGC40JPjLTlykJVcFIWhWrRdvhumFaXj3XaiI+nRNeHxJU0dHjMS11vlpmPKRmBNWzMjOjI082AHTgdoLqGWk+QujK+wQ1tqftcH0Q6ui5oAt330nou5Cs+sZufArnVFSeivIvw3uOVR3OdDXsZANAB2KpMCtkStraIz7ysrCXyo/LW1VQ2w53CZ6PgTuxsooKgfoeEtTP9su/oX50tzyz3ij6AHBr9P30CDfZU8jsPxd6lpsPHq2sOmm4S8iYmpyRoFtRIRmlyhPq+u3ucr6w6OuNJgAAAOBs6k+oq7avInqv2xkAAIAOZHXxdl8LAAAA9ASBBAAAaEAkqGwwDgAAkMQQVDYYBwAA2IpUSjYYBwB4AuKfzZTVupnUBM9gXV7/lYsTovht1KFnQamjbDAOADAy5i8v4zprYV9LjyJ+HhqcmxKbuc8og5Ns8lG/fNN2g/HU8C3mMj9cHxraM4hHABfiZRizZnfrBiUfivGDplXNFLnJEdTqUhEVdKsNwRQdNd9gPDYlY2i+hz4rYzR7AJ6bOMPASlVyqk16WrubWInKc9OvODixTtdtE30132C8Kj9Vc49LcltGswfgFfAyDJh4WVpryb3uUTzt105pB3WTYBRdJxMfw6zzNhg3m5Smfx3F7Sdz+2B2EpToVqYBSb+8+fY81Ush7kdMc2amAW5NNcNwIZQEodCRrDYZhFIyzNy4nsQ1RaEXkPmrUmQWmNFR2w3Go7H9r6oz3maC1fwk6VrVLz03O3z3WgE8Hzuul5dCp35TCZJZd0CqSU87ZWpENT7ViEVGaqPX9gsHNxiPxnZMn8OLJONnRnjME8+era7t6Nmb+3ho3TPAUxLnAbPOK1PNXXHWHQ1vluNzLzeWybbq9SFBFR0d32C8amh8EvSs/dyto57NOwQ1tqfa8w5BDYwBeBoQ1E0EGaZM5reInlBHzwVdGC+SOD+bQlNX39iN4xuMB52L+qKt7j9+q683L9B6PgLLq52bfnlNhA26rdckKMxEG+DWiEVuXr/mpaH7qZY8B6ZfOpnE9cfEcy1wp1w5Zh2xtLyG1ShlnnbZYBwA4B4k77CDp4jByZg6Keaay+aji+6wMm7NbjYYBwAAqFO/i1m1nQ3GAQAAPLK6eLuvBQAAAHqCQAIAADQgElQ2GAcAAEhiCCobjAMAAGxFKiUbjAMAPAHiRyNBtW4mNcEzWJdnfjuU/AlN1jbPglJH2WAcAGBkzF9exnXWwr6WHkX8PDQ4NyU2c59RBifZ5KN++abnBuNiRvMNy2qxb33IxzrTVROTAJ4JL8OYNbtbNyj5UIwfNK1qpshNjqBWl4qooFttCKboqOcG46JO0oFMz9VPW7Ev6ACQJ84wsFKVnGqTntbuJlai8tz0Kw5OrNN120RfPTcYDwS12qRhzSPcZQkC3B0vw4CJl6W1ltzrHsXTfu2UdlA3CUbRdVIKpTu6cIPxurnh187x6PqmQ4db1FGO14f2+tEnZqHZj2chwOtQzTBcGiUZtRBvx4+el7fLT+evSdWsOau0H3wkqFioO7pqg/F8k9m5AcnESAdaNw9OqoZ5zTOLuFrnRksfoC07rqCXQqd+Uwm0xtwlq1TToHbKFNRqfKoRi4zURq/tF87bYFz0k2niXTwiBKY9XuDMamUneV+CsczKW2OoewZ4EbyrI7jqXxkzFGasNmXgqwgyf3DuZcsy/Va9PiSooqNTNxifc6HxmsQLIiNOXhMt1Zvs98bShTsE1bME4LlBUDcR5Jwymd8iekIdPRd0YbxI4owtPs2qb+zGeRuMm54kG5pSpNuab80wBf3ExpjjzmpqTacyvntOZWIL8DQEGSa40KoXnVnyHJh+6fQS1x8Tz7XAHTOfm+deP6ZeGGYkTH/pDcZfx1MAeAKS99zm3cktyJg6Keaay+bDjO6wMm7N7tfdYPxeiwwAAK4l++XqxAbjAAAAPlldvN3XAgAAAD1BIAEAABoQCSobjAMAACQxBJUNxgEAALYilZINxgFgQOIfOYBG/GgkqNbNpCZ4Butys6QUtSBE4jczWdu8XkodZYNxALgQ/YPCpFq8DpOiWmct7GvpUTyp0+eeTOpPA+ndtMy+VDqywbg+N2tmbLoQEWJh8L4LuPOV32Q4UhWMw2Td5c93yCcXkg/O+GHU2la9M4iFsyqoIvttCKboZccG43PTJd5zdqtjmRV2WNgtBexbBJneAK4imU9hR4juGEnPTlM4tYqtJUEd0ckG24RB+zYYR1CT/fQU1NF6A9hHvA5ZpSZe7tIK2i07NcHTfu2UdnD+qpGZ9L71PsMwa8cG41rSvVsDz39R6LmkLNlwUh3LG9pzNmhoVoj9mq1pjn0PxtJvg2iY8TEtyRgAcAaT4mqLhiZOEebb8UPq5cny0/lrrptVHitfg+Vk5t66hdqgHRuM6ykxJykzkZmedZ0m9rSyUBPPvfnqnWTn1f8GI3mizb7RhQfPh7caYUHfcJiC4WnMPHxI42Q1W06Zzq7R8LKuDlf5UcVIbfQ6wEJmg/GGCVrXCTyslmyyp5WFmqSFOqpV3wMyQdgxX4NfdfCsTBZXGzUuZnCSSXtAvLwUn5tJNXgtq+1bbFGlKb3B+JEEnayzr2STPa0s1OQt3GRePFBzQZ1z92gAZ7DjcnhlPEEVChFf74Mg1NFzQRfGadZMenrcuI5sEruR3GB8/ppqhWMiHEEd3ZVZ0/tU2xM0jM02S6avVG3IWFi+ndW0ZVwIvM5HI+9pMDrAeZhX0KYKZsmzYnoaROxGkfFcC9wR2bV8ayZer4e6bQnTn2GD8dsZfCq7Ew1hhKuYLK42akSSwdF3z+eb1oaMqeZSKR8nZl+DzUeLrG01u59hg/HbrZhT0dHIxIcAAgDE1O9iVjFng3EAAACP/wcGD5gjNWYAbgAAAABJRU5ErkJggg==
  本文利用了前辈的一些代码,就不一一致谢了
页: [1]
查看完整版本: Windows下利用Python动态检测外网IP并发邮件给邮箱