【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邮箱为例,网易的和学校公邮一般也有这个功能,代码也是通用的。
第一步:在设置中找到账户
第二步:找到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终止程序,还得加上异常处理,如下图即是工作中可能出现的异常:
# -*- 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()
希望本文对您有帮助,谢谢阅读!
【python】获取PC机公网IP并发送至邮箱相关推荐
- Linux开机自动获取本机公网IP并发送至指定邮箱
前言 当我们需要远程连接自己的Linux计算机时,可以使用ssh命令,但是需要我们获取目标计算机的公网ip.以下是使用Python实现的开机自动获取本地并发送至指定邮箱的小脚本. 实现步骤 1.引入库 ...
- Python获取本机所有IP地址
众所周知,Python标准库socket中有可以获取本机IPV4地址的方法,下面是网上非常常见的一种用法: >>> import socket >>> hostna ...
- 使用Linux curl命令获取本机公网IP地址
使用Linux curl命令获取本机公共IP地址 在本教程中,我们将学习如何使用Linux curl命令查找计算机的公共IP地址. 通常,如果我们想要找到我们使用的公共IP地址,我们会去谷歌并搜索&q ...
- Windows获取本机公网ip脚本
新建txt,重命名为ip.bat 再将下列文本,贴到ip.bat里 @echo offecho Public IP: curl ifconfig.me echo.pause 双击ip.bat,可得本机 ...
- python获取小王的ip地址_用Python获取本机的IP地址
Linux import socket import fcntl import struct def get_ip_address(ifname): s = socket.socket(socket. ...
- Java获取本机公网ip
import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; impo ...
- python 获取本机wifi IP地址
import os,re import webbrowserclass WeNetWork_open_browser():def execCmd(self, cmd): # 返回CMD命令输出的内容r ...
- python项目实战:获取本机所有IP地址的方法
2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家介绍一个利用python获取本机所有IP地址的具体代码,具有一定的参考价值,希望能够帮助到大家,代码如下: 导 ...
- 在Linux上利用python获取本机ip
下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...
最新文章
- 2018-2019-1 20165214 《信息安全系统设计基础》第六周学习总结
- 用jstl截取字符串
- 【转载】设置Windows中gvim的默认配色方案和字体
- 学银在线python课程_Python 从入门到精通:一个月就够了!
- 2021年科研学术海报Poster模板
- OAuth2解决什么问题
- python语言精通_Python语言基础从入门到精通
- 【转】matlab函数编译成dll供Cpp调用的方法
- 腾讯云公布5G产品矩阵;IntelliJ IDEA 2020.2.1发布| 极客头条
- [饭后算法系列] 数组中和非负的最长子数组
- 10g_DBWn_concept
- 【Anylogic智能体状态转移】
- Android Studio Gradle下载慢解决方法
- 插值算法(最邻近差值、双线性插值、双三次插值)
- RPGMakerMV学习笔记(二)—— 制作第一个RPG游戏
- Beyond Compare设置默认编码、每行字符个数、自动换行
- 学习笔记—什么是微数据?itemscope/itemtype/itemprop(搜索引擎seo优化)
- 女孩子录取了计算机类,苏州中学小女生录取藤校康奈尔工程计算机专业!看介绍,学攻略!...
- 编写一个静态方法lg(),接收一个整型参数N,返回不大于log2N(以2为底)的最大整数。不要使用Math库。
- 【k8s的持久化存储】PV、PVC、StorageClass讲解