站点图标

Windows IP变化自动发送邮件

2018-12-30折腾记录 / 分享推荐Lab / Python
本文最后更新于 384 天前,文中所描述的信息可能已发生改变

由于学校的机房使用的 IDE 过于坑爹,什么 VC6.0 啦,VS2008 啦,DEV-C++啦,一点补全功能都没有,Java 用的是反人类的 Eclipse,无奈只能远程连接我的工作站,其实就是垃圾笔电啦,这时就需要知道笔电的 IP,然而学校并不提供固定 IP,什么时候变化都不可知,若 IP 变了然而我不知,上课时只能咕咕了,所以只好造个通知的脚本来检查 IP 变化,并在变化时发送邮件通知我

原理

还要什么原理,就是执行 windows 的 ipconfig 命令然后提取其中的 IPv4 地址,与之前检测存储的 IP 进行比较,若相同,则 IP 不变化,若变化就写入新的 IP,同时调用发送邮件的脚本

实现

本文使用 Python3 来开发,所以需要先装好 Python3 的环境,至于为什么要用 python 来开发,请看上一篇文章,其实就是 Java 要导入 jar 包,之前没解决如何 jar 包,无奈只能使用不太熟悉的 Python 来开发

检查脚本


_20
import subprocess
_20
import re
_20
import os
_20
nowip = subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
_20
s = nowip.stdout.read()
_20
s2 = s.decode("GBK")
_20
wlan_index = s2.find("无线局域网适配器 WLAN:")
_20
wlan_str = s2[wlan_index:]
_20
ip_str = wlan_str[wlan_str.find("IPv4 地址"):wlan_str.find("子网掩码")]
_20
ip_str = ip_str[34:]
_20
ip = re.search("([.\d]+)", ip_str).group(1)
_20
ip_log = open("E:/ip_log.txt","r")
_20
if ip_log.readline() == ip:
_20
print("Yes")
_20
else:
_20
print("No")
_20
ip_log2 = open("E:/ip_log.txt","w")
_20
ip_log2.write(ip)
_20
os.system("python E:/ip_notice.py")
_20
ip_log.close()

发送邮件脚本


_66
# coding:utf-8
_66
import smtplib
_66
from email.mime.text import MIMEText
_66
from email.utils import formatdate
_66
from email.header import Header
_66
import sys
_66
import subprocess
_66
_66
# 本地执行获取IP
_66
nowip = subprocess.Popen('ipconfig', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
_66
ip_gbk = nowip.stdout.read()
_66
ip_out = ip_gbk.decode("GBK")
_66
_66
#设置默认字符集为UTF8 不然有些时候转码会出问题
_66
default_encoding = 'utf-8'
_66
if sys.getdefaultencoding() != default_encoding:
_66
reload(sys)
_66
sys.setdefaultencoding(default_encoding)
_66
_66
#发送邮件的相关信息,根据你实际情况填写
_66
smtpHost = 'SMTP地址'
_66
# smtpPort = '25'
_66
sslPort = '465' # 端口
_66
fromMail = '邮件发送方'
_66
toMail = '邮件接收方'
_66
username = '登陆SMTP的用户名'
_66
password = '密码'
_66
_66
#邮件标题和内容
_66
subject = u'Otstar-Laptop-IPNotice'
_66
body = u'' + ip_out
_66
_66
#初始化邮件
_66
encoding = 'utf-8'
_66
mail = MIMEText(body.encode(encoding), 'plain', encoding)
_66
mail['Subject'] = Header(subject, encoding)
_66
mail['From'] = fromMail
_66
mail['To'] = toMail
_66
mail['Date'] = formatdate()
_66
_66
try:
_66
# 连接smtp服务器,明文/SSL/TLS三种方式,根据你使用的SMTP支持情况选择一种
_66
# 普通方式,通信过程不加密
_66
# smtp = smtplib.SMTP(smtpHost, smtpPort)
_66
# smtp.ehlo()
_66
# smtp.login(username, password)
_66
_66
# tls加密方式,通信过程加密,邮件数据安全,使用正常的smtp端口
_66
# smtp = smtplib.SMTP(smtpHost,smtpPort)
_66
# smtp.set_debuglevel(True)
_66
# smtp.ehlo()
_66
# smtp.starttls()
_66
# smtp.ehlo()
_66
# smtp.login(username,password)
_66
_66
# 纯粹的ssl加密方式,通信过程加密,邮件数据安全
_66
smtp = smtplib.SMTP_SSL(smtpHost,sslPort)
_66
smtp.ehlo()
_66
smtp.login(username,password)
_66
_66
# 发送邮件
_66
smtp.sendmail(fromMail, toMail, mail.as_string())
_66
smtp.close()
_66
print ("OK")
_66
except Exception as e:
_66
print (e)

博主偷懒就只发送 ipconfig 的返回值,没切片得出 IP,需要的可以将切片代码从检查脚本复制到通知脚本即可

Windows IP变化自动发送邮件

https://blog.ixk.me/post/windows-ip-changes-to-automatically-send-mail
  • 许可协议

    BY-NC-SA

  • 发布于

    2018-12-30

  • 本文作者

    Otstar Lin

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

VSCode Java手动导入jar和源码包C链表实现重制版