日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2025/3/11 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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并发送至邮箱的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。