【精品教程】让newifi发送IP邮件到指定邮箱

    说明:本文是本人之前在 NBD论坛发过的,今只做搬迁和部分修改

    背景:由于本人搭建个人网站需要,所以需要实时知道newifi所在广域网IP(即公网IP),因为域名解析需要绑定该IP,由此想到让路由器自动发送IP到我的邮箱(也是因为之前一直在玩树莓派,树莓派上有相应的需求,继而移植到路由器)。
    需要:
    1、路由器升级到最新抢先版固件(其他版本未测试,如果可以满足一下几点要求应该也可以);
    2、开启Telnet(安装一键root(Telnet)插件并启动,小云OS固件只需在高级设置里打开ssh);
    3、安装Python(安装Python2插件,小云OS固件只需我适配的Python插件),因为获取IP和发送邮件的脚步要通过Python脚步实现;
    4、安装ftp服务器,并开启,具体安装方法论坛里找下,具体链接我忘记了,知道的坛友麻烦跟帖告知,谢谢;

    5、电脑安装putty(ssh、Telnet等链接工具软件)和FileZilla Client、Winscp(ftp传输工具软件);
    具体步骤:
    a、编写Python脚本ip.py,最好在Linux环境下编写,因为系统差异可能出现各种报错;

    #! /usr/bin/env python
    import socket
    import time
    import smtplib
    import urllib
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    
    def sendEmail(smtpserver,username,password,sender,receiver,subject,msghtml):
        msgRoot = MIMEMultipart('related')
        msgRoot["To"] = ','.join(receiver)
        msgRoot["From"] = sender
        msgRoot['Subject'] = subject
        msgText = MIMEText(msghtml,'html','utf-8')
        msgRoot.attach(msgText)
        
        #sendEmail
        smtp = smtplib.SMTP()
        smtp.connect(smtpserver)
        smtp.login(username, password)
        smtp.sendmail(sender, receiver, msgRoot.as_string())
        smtp.quit()
    
    def check_network():
        while True:
            try:
                result=urllib.urlopen('http://baidu.com').read()
                print result
                print "Network is Ready!"
                break
            except Exception , e:
                print e
                print "Network is not ready,Sleep 5s...."
                time.sleep(5)
        return True
    
    def get_ip_address():
        response = urllib.urlopen('http://www.net.cn/static/customercare/yourip.asp')
        ipaddr = response.read()
        ipaddr = unicode(ipaddr,"gb2312")
        #s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        #s.connect(("1.1.1.1",80))
        #ipaddr=s.getsockname()[0]
        #s.close()
        return ipaddr
    
    if __name__ == '__main__':
        check_network()
        ipaddr=get_ip_address()
        sendEmail('smtp.163.com','你的邮箱','邮箱登录密码','你的邮箱',['你的邮箱'],'IP Address Of newifi',ipaddr)
    

    注:
    i、本脚本使用的是网易163的邮箱,如若改用其他邮箱强自行更改邮箱服务器(脚本最后红色部分改成你自己的邮箱信息),至此ip.py脚本编写完成;
    ii、原理:通过万网提供的查询本地外网ip的网页(http://www.net.cn/static/customercare/yourip.asp),获取外网ip,
    再通过python实现网页抓取;

    b、通过ftp吧改脚本上传到路由器指定目录,我放在/usr/sbin/该目录下,并制定文件可执行(可以直接用FileZilla Client修改——右键选中ip.py更改权限为0755;或者通过ssh命令修改——chmod +x /usr/sbin/ip.py);

    c、关于如何实现开机启动,我的办法是把启动脚本写入环境变量(/etc/profile)里并且把加载环境变量的脚本命令加入LED灯脚本中(/etc/init.d/led),这样做的好处是不仅实现开机启动而且当公网IP变化时会自动发邮件告知IP改变了,这样才正在做到实时掌控,便于及时修改域名解析(要知道固定公网IP是很贵的);

    d、最后我们看下收到的邮件是怎样的:
    1

    最后:触类旁通,不止路由器,其他所有Linux平台或者可运行Python脚本的系统,都可以使用这种方法实现IP变动实时掌控

    本博客所有文章如无特别注明均为原创。
    复制或转载请以超链接形式注明转自陈生手记,原文地址《【精品教程】让newifi发送IP邮件到指定邮箱》
    喜欢 | 0
    分享:

已经有2 条评论抢在你前面了~

  1. 沙发
    gamesh 2016-05-21

    路由器不是有web服务器吗,直接用php实现,然后在路由器添加计划任务不就好咯!
    这个初音太碍事了!

    • 回复
      chen 2016-05-28
      @gamesh: PHP对于路由器来说还是有点太沉重了,最近改用shell发邮件了,比如newifi的新插件——上线提醒 我也发现初音挡住了评论框,我大致调整了下坐标,现在好了,不会挡住了,谢谢!!!