文章目录

  • 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并发送至邮箱相关推荐

  1. Linux开机自动获取本机公网IP并发送至指定邮箱

    前言 当我们需要远程连接自己的Linux计算机时,可以使用ssh命令,但是需要我们获取目标计算机的公网ip.以下是使用Python实现的开机自动获取本地并发送至指定邮箱的小脚本. 实现步骤 1.引入库 ...

  2. Python获取本机所有IP地址

    众所周知,Python标准库socket中有可以获取本机IPV4地址的方法,下面是网上非常常见的一种用法: >>> import socket >>> hostna ...

  3. 使用Linux curl命令获取本机公网IP地址

    使用Linux curl命令获取本机公共IP地址 在本教程中,我们将学习如何使用Linux curl命令查找计算机的公共IP地址. 通常,如果我们想要找到我们使用的公共IP地址,我们会去谷歌并搜索&q ...

  4. Windows获取本机公网ip脚本

    新建txt,重命名为ip.bat 再将下列文本,贴到ip.bat里 @echo offecho Public IP: curl ifconfig.me echo.pause 双击ip.bat,可得本机 ...

  5. python获取小王的ip地址_用Python获取本机的IP地址

    Linux import socket import fcntl import struct def get_ip_address(ifname): s = socket.socket(socket. ...

  6. Java获取本机公网ip

    import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; impo ...

  7. python 获取本机wifi IP地址

    import os,re import webbrowserclass WeNetWork_open_browser():def execCmd(self, cmd): # 返回CMD命令输出的内容r ...

  8. python项目实战:获取本机所有IP地址的方法

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家介绍一个利用python获取本机所有IP地址的具体代码,具有一定的参考价值,希望能够帮助到大家,代码如下: 导 ...

  9. 在Linux上利用python获取本机ip

    下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...

最新文章

  1. 2018-2019-1 20165214 《信息安全系统设计基础》第六周学习总结
  2. 用jstl截取字符串
  3. 【转载】设置Windows中gvim的默认配色方案和字体
  4. 学银在线python课程_Python 从入门到精通:一个月就够了!
  5. 2021年科研学术海报Poster模板
  6. OAuth2解决什么问题
  7. python语言精通_Python语言基础从入门到精通
  8. 【转】matlab函数编译成dll供Cpp调用的方法
  9. 腾讯云公布5G产品矩阵;IntelliJ IDEA 2020.2.1发布| 极客头条
  10. [饭后算法系列] 数组中和非负的最长子数组
  11. 10g_DBWn_concept
  12. 【Anylogic智能体状态转移】
  13. Android Studio Gradle下载慢解决方法
  14. 插值算法(最邻近差值、双线性插值、双三次插值)
  15. RPGMakerMV学习笔记(二)—— 制作第一个RPG游戏
  16. Beyond Compare设置默认编码、每行字符个数、自动换行
  17. 学习笔记—什么是微数据?itemscope/itemtype/itemprop(搜索引擎seo优化)
  18. 女孩子录取了计算机类,苏州中学小女生录取藤校康奈尔工程计算机专业!看介绍,学攻略!...
  19. 编写一个静态方法lg(),接收一个整型参数N,返回不大于log2N(以2为底)的最大整数。不要使用Math库。
  20. 【k8s的持久化存储】PV、PVC、StorageClass讲解

热门文章

  1. Spark-大规模数据处理计算引擎
  2. 4-什么是Image和container
  3. Angular深入理解之指令
  4. Rabbit and Grass【博弈】
  5. 【学习Android NDK开发】Type Signatures(类型签名)
  6. 3- OpenCV+TensorFlow 入门人工智能图像处理-TensorFlow入门
  7. 打击侵犯公民个人信息罪的司法困境
  8. 将String转换成InputStream
  9. oracle中创建游标,oracle 存储过程创建游标
  10. php 异步处理类,php异步处理类