【python】获取PC机公网IP并发送至邮箱

文章目录

  • 0.引言
  • 1.获取外网IP
  • 2.打开SMTP服务
  • 3.python发送邮件
  • 4.完整代码

0.引言

\qquad之前一直使用Putty连接公司的PC机进行远程办公,苦于外网的IP地址不能固定下来,所以购买了内网穿透服务,免费版还会限速。后来转念一想,如果能定时获取PC机的外网IP并发送到自己的设备上,不就不需要内网穿透服务了吗,于是就有了本文。需要远程办公的朋友们建议收藏。

1.获取外网IP

\qquad获取外网IP的方式有很多种,直接通过命令行或者登录网页即可:
Linux下获取外网IP
Windows下获取外网IP
\qquad你可以利用shell命令定时获取IP并执行一个发送邮件的python文件,但是这样太过繁琐,于是我将获取IP的方式整合到了python中(其实是参考了别人的博客,但是回头找真的找不到是哪篇了,在此还是感谢这位博主,因为它的方法确实比其他人的简单)

from urllib.request import urlopen
my_ip = urlopen('http://ip.42.pl/raw').read()
my_ip = my_ip.decode(encoding='utf-8')  # ip str

这样就会返回string类型的IP地址了,需要注意的是获取频次不能太快(>10s),timeout也不宜太小(>3s),否则可能会报urlopen.error。

2.打开SMTP服务

\qquadpython邮件发送属于第三方服务,需要邮箱开启SMTP服务,以QQ邮箱为例,网易的和学校公邮一般也有这个功能,代码也是通用的。
第一步:在设置中找到账户
Step1
第二步:找到SMTP服务,点击开启(需要手机向一个号码发送短信,是要钱的,不过也就一条短信费用)。
SMTP
最好把授权码复制下来,不然还得再花一次冤枉钱再发一次。
授权码
授权码一定不能泄露!不放心的朋友最好设置自己不常用不绑定信息的邮箱作为测试邮箱。

3.python发送邮件

\qquad打开SMTP服务之后的邮箱可以作为发送邮箱,而接收邮箱则不需要其打开SMTP服务,只需要知道邮箱号即可。以下是一个例子,其实发送者不是QQ邮箱也行,只要是打开过SMTP服务的就可以。

def send_email():  host_server = 'smtp.qq.com'  #qq邮箱smtp服务器sender_qq = 'xxxxx@qq.com' #发件人邮箱pwd = "xxxxxxxxxx"  # 授权码 str格式receiver = ['xxxxx@qq.com','xxxxx@qq.com']#收件人邮箱mail_title = 'Python自动发送的邮件' #邮件标题mail_content = "您好,这是python自动发送的邮件,请查收。"#邮件正文内容# 初始化一个邮件主体msg = MIMEMultipart()msg["Subject"] = Header(mail_title,'utf-8')msg["From"] = sender_qq# msg["To"] = Header("测试邮箱",'utf-8')msg['To'] = ";".join(receiver)# 邮件正文内容msg.attach(MIMEText(mail_content,'plain','utf-8'))smtp = SMTP_SSL(host_server) # ssl登录# login(user,password):# user:登录邮箱的用户名。# password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。smtp.login(sender_qq,pwd)# sendmail(from_addr,to_addrs,msg,...):# from_addr:邮件发送者地址# to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'# msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。smtp.sendmail(sender_qq,receiver,msg.as_string())# quit():用于结束SMTP会话。smtp.quit()

4.完整代码

\qquad以下例程,填好抬头的必要信息之后就可以直接运行了。注意文件名不要取email.py,会和email模块冲突!最后提醒大家方便自己远程办公的同时也要保护好自己的个人信息,尤其是授权码。
\qquad获取IP的速度是10s一次,可以通过修改对应注释的Timer定时器的数值(单位:s)调整,默认模式是监测到PC机的外网IP变化时向指定邮箱发送。为防止出现urlopen.error终止程序,还得加上异常处理,如下图即是工作中可能出现的异常:
IP

# -*- coding: utf-8 -*-
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Headerfrom urllib.request import urlopen
import threading
import datetime
import sys
# smtplib模块主要负责发送邮件:是一个发送邮件的动作,连接邮箱服务器,登录邮箱,发送邮件(有发件人,收信人,邮件内容)。
# email模块主要负责构造邮件:指的是邮箱页面显示的一些构造,如发件人,收件人,主题,正文,附件等。
my_ip = urlopen('http://ip.42.pl/raw',timeout=5).read()
my_ip = my_ip.decode(encoding='utf-8')
sender_qq ='xxxx@qq.com'  # 发送邮箱
receiver = ['xxxx@qq.com','xxxx@qq.com']  # 接收邮箱
pwd = "xxxxx"   # 授权码
def send_email(my_ip,time=None):  host_server = 'smtp.qq.com'  #qq邮箱smtp服务器mail_title = 'Python自动发送的邮件' #邮件标题mail_content = "外网IP:{}\n发送时间:{}".format(my_ip,time) #邮件正文内容# 初始化一个邮件主体msg = MIMEMultipart()msg["Subject"] = Header(mail_title,'utf-8')msg["From"] = sender_qq# msg["To"] = Header("测试邮箱",'utf-8')msg['To'] = ";".join(receiver)# 邮件正文内容msg.attach(MIMEText(mail_content,'plain','utf-8'))smtp = SMTP_SSL(host_server) # ssl登录# login(user,password):# user:登录邮箱的用户名。# password:登录邮箱的密码,像笔者用的是网易邮箱,网易邮箱一般是网页版,需要用到客户端密码,需要在网页版的网易邮箱中设置授权码,该授权码即为客户端密码。smtp.login(sender_qq,pwd)# sendmail(from_addr,to_addrs,msg,...):# from_addr:邮件发送者地址# to_addrs:邮件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'# msg:发送消息:邮件内容。一般是msg.as_string():as_string()是将msg(MIMEText对象或者MIMEMultipart对象)变为str。smtp.sendmail(sender_qq,receiver,msg.as_string())# quit():用于结束SMTP会话。smtp.quit()def ip_render():global my_ipglobal timertry:date_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')new_ip = urlopen('http://ip.42.pl/raw').read()new_ip = new_ip.decode(encoding='utf-8')if new_ip != my_ip:my_ip = new_ipsend_email(my_ip,time=date_time)print('IP changed:{} -time:{}'.format(my_ip,date_time))else:sys.stdout.write("\rIP doesn't change -time:{}".format(date_time))sys.stdout.flush()except Exception as e:print("Exception:{}".format(e))timer = threading.Timer(30, ip_render)  # 30s 获取IP一次timer.start()
if __name__ == "__main__":print('IP:{}'.format(my_ip))timer = threading.Timer(5, ip_render)  # 5s后开始循环线程timer.start()

希望本文对您有帮助,谢谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

List 去重的 6 种方法,这个方法最完美!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景。这个时候可能有同学会问&#xff1a…

Mongodb -(3) replica set+sharding

分片集搭建---何旭东目录分片集搭建...................................................................................................................... 1生态系统...............................................................................................…

electron 菜单栏_如何在Electron JS中添加任务栏图标菜单?

electron 菜单栏If you are new here, please consider checking out my recent articles on Electron JS including Tray Icons. 如果您是新来的,请考虑查看我最近关于Electron JS的文章, 包括托盘图标 。 In this tutorial, we will set up 2 menu it…

【逆强化学习-0】Introduction

文章目录专栏传送门0.引言1.逆强化学习发展历程2.需要准备的专栏传送门 0.简介 1.学徒学习 2.最大熵学习 0.引言 \qquad相比于深度学习,国内强化学习的教程并不是特别多,而相比强化学习,逆强化学习的教程可谓是少之又少。而本人想将整理到的资…

不知道Mysql排序的特性,加班到12点,认了认了!

小弟新写了一个功能,自测和测试环境测试都没问题,但在生产环境会出现偶发问题。于是,加班到12点一直排查问题,终于定位了的问题原因:Mysql Limit查询优化导致。现抽象出问题模型及解决方案,分析给大家&…

js中==与===的区别

2019独角兽企业重金招聘Python工程师标准>>> 1、对于string,number等基础类型,和是有区别的 1)不同类型间比较,之比较“转化成同一类型后的值”看“值”是否相等,如果类型不同,其结果就是不等 2&#xff09…

【逆强化学习-1】学徒学习(Apprenticeship Learning)

文章目录0.引言1.算法原理2.仿真环境3.运行4.补充(学徒学习深度Q网络)本文为逆强化学习系列第1篇,没有看过逆强化学习介绍的那篇的朋友,可以看一下:Inverse Reinforcement Learning-Introduction 传送门 0.引言 \qquad…

面试官:HashMap有几种遍历方法?推荐使用哪种?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其中 JDK 8 就提供了 3 种 HashMa…

【逆强化学习-2】最大熵学习(Maximum Entropy Learning)

文章目录0.引言1.算法原理2.仿真0.引言 \qquad本文是逆强化学习系列的第2篇,其余博客传送门如下: 逆强化学习0-Introduction 逆强化学习1-学徒学习 \qquad最大熵学习是2008年出现的方法,原论文(链接见【逆强化学习0】的博客&#…

面试官又整新活,居然问我for循环用i++和++i哪个效率高?

前几天,一个小伙伴告诉我,他在面试的时候被面试官问了这么一个问题:在for循环中,到底应该用 i 还是 i ?听到这,我感觉这面试官确实有点不按套路出牌了,放着好好的八股文不问,净整些幺…

面试官:如何实现 List 集合去重?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)本文已收录《Java常见面试题》系列,开源地址:https://gitee.com/mydb/interviewList 去重指的…

Windows重装Anaconda3失败解决方案【重装失败10来次首次成功的案例!】

文章目录0.环境1.原因2.解决方案0.环境 Win10 Anaconda3 2018版 python 3.7.1 注意!此种情况只会在windows上发生,因为在linux上你只需要删除anaconda3整个文件夹,重新安装一定会成功! 1.原因 Anaconda肯定是没有成功安装的&am…

python读取pcd点云/转numpy(python2+python3,非ROS环境)

0.引言 \qquadROS的PCL库支持python读取点云,ROS1关联的是python2(2.7),ROS2关联的是python3(>3.5),但这对于windows的用户和没装ROS的ubuntu用户似乎不够友好。下面就介绍两种不需要ros的方…

Java中List排序的3种方法!

作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表&…

Spring 事务失效的 8 种场景!

在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。点击上方卡片关注我今天,我们就一起梳理下有哪些场景会导致Spring…

vscode无法识别constexpr

问题 vscode 无法识别constexpr(常指针类型) 方法 打开工程路径下的.vscode文件夹(一般是自动隐藏的,CtrlH显示隐藏)设置c_cpp_properties.json文件如下: {"configurations": [{"name…

三流Java搞技术,二流Java搞框架,一流Java…

如何反驳“99% 的 Java 程序员都是 Spring 程序员”这句话?答案是不能。互联网发展至今,站在巨人肩膀上编程像一日三餐一样寻常。Spring Boot 的确凭一己之力拉低了 Java 开发的门槛,可普通开发与高开之间,真就因为一个…

【Ubuntu】vscode配置PCL库/vscode无法导入PCL库

问题 PCL库是ROS框架自带的点云处理库,可以通过find_package(PCL REQUIRED)在CMakeLists.txt中导入,但是vscode却无法识别,出现问题如下: 注意,本文解决方案仅限Ubuntu! 解决方案 打开工程路径下的.vsc…

面试官:HashSet是如何保证元素不重复的?

作者 | 磊哥来源 | Java面试真题解析(ID:aimianshi666)转载请联系授权(微信ID:GG_Stone)本文已收录《Java常见面试题》系列,开源地址:https://gitee.com/mydb/interviewHashSet 实现…

【Ubuntu】Ubuntu 20.04无法识别网口/以太网/有线网卡

这里写自定义目录标题0.症状1.查看网卡类型2.下载网卡驱动3.安装网卡驱动0.症状 \qquad表现为插入以太网网口后右上角没有显示网络,即没有下图的音量左侧的标志 打开设置的【网络】选项没有以太网接入,然而以太网口信号灯仍然正常闪烁。这种情况基本可以…