陕西外贸英文网站建设,开封网络营销方式,做招聘网站都需要什么手续,广告发布者是指文章目录0.引言1.获取外网IP2.打开SMTP服务3.python发送邮件4.完整代码0.引言 \qquad之前一直使用Putty连接公司的PC机进行远程办公#xff0c;苦于外网的IP地址不能固定下来#xff0c;所以购买了内网穿透服务#xff0c;免费版还会限速。后来转念一想#xff0c;如果能定…
文章目录0.引言1.获取外网IP2.打开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(encodingutf-8) # ip str这样就会返回string类型的IP地址了需要注意的是获取频次不能太快10stimeout也不宜太小(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 xxxxxqq.com #发件人邮箱pwd xxxxxxxxxx # 授权码 str格式receiver [xxxxxqq.com,xxxxxqq.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,timeout5).read()
my_ip my_ip.decode(encodingutf-8)
sender_qq xxxxqq.com # 发送邮箱
receiver [xxxxqq.com,xxxxqq.com] # 接收邮箱
pwd xxxxx # 授权码
def send_email(my_ip,timeNone): 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(encodingutf-8)if new_ip ! my_ip:my_ip new_ipsend_email(my_ip,timedate_time)print(IP changed:{} -time:{}.format(my_ip,date_time))else:sys.stdout.write(\rIP doesnt 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()
希望本文对您有帮助谢谢阅读