<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          發(fā)封郵件就能關(guān)機(jī)?用python實(shí)現(xiàn)遠(yuǎn)程控制電腦

          共 7796字,需瀏覽 16分鐘

           ·

          2021-03-24 13:39


          一、前言

          大家好,歡迎來到 Crossin的編程教室 !

          不知道你有沒有遇到類似的情況:眼看要出門了,結(jié)果一個程序要運(yùn)行很久才能結(jié)束,導(dǎo)致無法立刻關(guān)機(jī)。這種時候就想,如果可以遠(yuǎn)程查看電腦運(yùn)行狀態(tài)甚至控制關(guān)機(jī)就好了。

          類似這樣的“遠(yuǎn)控”軟件有不少,一般需要在電腦端和控制端各安裝一個軟件,即可實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和操作。

          其實(shí)我們也可以用 Python 做一個簡便的小工具,實(shí)現(xiàn)遠(yuǎn)程控制電腦。當(dāng)然,我們需要的操作十分簡單:要能通過郵件和電腦進(jìn)行通訊,讓電腦以截圖的方式為我們顯示程序當(dāng)前運(yùn)行的狀態(tài);還要可以通過郵件發(fā)送一些預(yù)設(shè)好的指令,比如執(zhí)行某個程序,或者遠(yuǎn)程關(guān)機(jī)等等。

          因?yàn)槭峭ㄟ^郵件,所以手機(jī)上無需任何開發(fā)環(huán)境和特殊App,只要能聯(lián)網(wǎng)發(fā)送Email就可以。

          下面我們就來分享下這樣一個“郵件遠(yuǎn)控”工具的Python實(shí)現(xiàn)。

          二、使用 yagmail 進(jìn)行郵件發(fā)送

          使用 yagmail 發(fā)郵件非常簡單,我們首先需要安裝兩個模塊:

          pip install yagmailpip install keyring

          2.1、發(fā)送一個簡單的郵件

          我們用 yagmail 來發(fā)一封簡單的郵件試試:

          import yagmailimport keyring
          sender = '發(fā)件郵箱'password = '發(fā)件人密碼'receiver = '收件郵箱'
          # 注冊yagmail.register(sender, password)
          # 用 SMTP 服務(wù)器發(fā)郵件yag = yagmail.SMTP(user=sender, host='smtp.163.com')
          # 設(shè)置郵件的內(nèi)容contents = ['Do not go gentle into that good night!']
          # 發(fā)送郵件yag.send(receiver, '郵件主題', contents=contents)

          這里密碼可以使用真實(shí)密碼,也可以使用授權(quán)碼。授權(quán)碼的獲得需要到各個郵件的網(wǎng)頁獲取,這里以網(wǎng)易郵箱為例:

          我們進(jìn)入網(wǎng)頁版郵箱,依次點(diǎn)擊 1、2,進(jìn)入如下頁面:

          點(diǎn)擊開啟,然后按照指引獲取授權(quán)碼即可。

          在連接郵箱服務(wù)器的時候,我們設(shè)置的一個 host,這個同樣需要在郵箱網(wǎng)頁中獲取。其中 163 的郵箱地址為 smtp.163.com,QQ 郵箱服務(wù)器地址為 smtp.qq.com,其它郵箱的可以自己查找一下。

          郵箱內(nèi)容是一個列表,我們現(xiàn)在是放入了一句話。

          在調(diào)用 send 方法發(fā)送郵件時,我們需要傳入幾個參數(shù)。第一個是收件人,第二個是郵件的主題,第三個就是郵件的內(nèi)容了。郵件內(nèi)容我們傳入開始的內(nèi)容列表。大家可以使用自己的郵箱測試一下。

          2.2、發(fā)送附件

          yagmail 非常智能,我們不需要像原始的 email 模塊一樣,先將附件上傳到郵箱服務(wù)器,然后再發(fā)給收件人。yagmail 會自動識別內(nèi)容中的資源文件,然后自動上傳:

          import yagmailimport keyring
          sender = '發(fā)件郵箱'password = '發(fā)件人密碼'receiver = '收件郵箱'
          # 注冊yagmail.register(sender, password)
          # 用 SMTP 服務(wù)器發(fā)郵件yag = yagmail.SMTP(user=sender, host='smtp.163.com')
          # 設(shè)置郵件的內(nèi)容contents = ['im.jpg']
          # 發(fā)送郵件yag.send(receiver, '郵件主題', contents=contents)

          其中 im.jpg 是我本地的一張圖片,在發(fā)送的時候 yagmail 會自動識別,然后發(fā)送出去。我們沒做什么修改,就完成了附件的發(fā)送。

          我們也可以直接發(fā)送帶有圖片的郵件,而不是以附件的形式發(fā)送:

          import yagmailimport keyring
          sender = '發(fā)件郵箱'password = '發(fā)件人密碼'receiver = '收件郵箱'
          # 注冊yagmail.register(sender, password)
          yag = yagmail.SMTP(user=sender, host='smtp.163.com')contents = [ '這是一張圖片', yagmail.inline('im.jpg')]yag.send(receiver, '郵件主題', contents=contents)

          我們只要用 yagmail.inline 包含圖片路徑即可。不過需要注意,發(fā)送的內(nèi)容不能單是一張圖片。

          三、郵件讀取

          郵件的讀取需要使用到 imbox 模塊。我們需要先使用 keyring 模塊讀取密碼,keyring 可以讀取到在 yagmail 中注冊了的郵箱密碼:

          import yagmailimport keyringfrom imbox import Imbox
          sender = '你的郵箱'# 獲取郵箱密碼password = keyring.get_password(sender)# 讀取郵箱郵件with Imbox('imap.163.com', sender, password, ssl=True) as imbox: # 讀取所有未讀郵件 all_msg = imbox.messages(unread=True)

          Imbox 對象就是我們的郵箱對象,里面包含了所有郵箱信息。我們調(diào)用 messages 方法就可以獲取所有郵件,如果我們將 unread 設(shè)置為 True,則表示讀取未讀郵件。獲取了所有郵件,我們就可以查看更多信息了:

          import yagmailimport keyringfrom imbox import Imbox
          sender = '你的郵箱'# 獲取郵箱密碼password = keyring.get_password(sender)# 讀取郵箱郵件with Imbox('imap.163.com', sender, password, ssl=True) as imbox: # 讀取所有未讀郵件 all_msg = imbox.messages(unread=True) # 遍歷郵件 for uid, message in all_msg: # 輸出郵件的主題 print(message.subject) # 標(biāo)記已讀 imbox.mark_seen(uid) # 獲取郵件的文本內(nèi)容 msg = message.body['plain']

          我們要實(shí)現(xiàn)控制電腦就需要一直讀取,我們可以使用 schedule 模塊設(shè)置定時任務(wù):

          import timeimport schedule
          def func(): print('test')
          schedule.every(2).seconds.do(func)while True: schedule.run_pending() time.sleep(1)

          這樣的話,可以每兩秒執(zhí)行一次 func 函數(shù)。 

          四、開發(fā)電腦控制工具

          我們定義一個 ComputerController 類,用于控制電腦。該類的最基本方法就發(fā)郵件和收郵件:

          import timeimport yagmailimport keyringimport schedulefrom imbox import Imbox

          class ComputerController():
          TIME_SPACE = 10
          SMTP_163 = 'smtp.163.com'
          SMTP_QQ = 'smtp.qq.com'
          def __init__(self, user, receiver): self.user = user self.receiver = receiver # 注冊 yagmail.register(self.user, '你的密碼')
          def send_main(self, msg): """發(fā)郵件""" yag = yagmail.SMTP(user=self.user, host=self.SMTP_163) contents = [ msg ] yag.send(self.receiver, '來自電腦的郵件', contents=contents)

          def receive_mail(self): """收郵件"""
          # 讀取密碼 password = keyring.get_password('yagmail', self.user) with Imbox('imap.163.com', '[email protected]', password, ssl=True) as imbox: all_msg = imbox.messages(unread=True) for uid, message in all_msg: if '110' == message.subject: # 標(biāo)記已讀 imbox.mark_seen(uid) msg = message.body['plain'] print(msg)
          def run_controller(self): # 定時讀取郵件 schedule.every(self.TIME_SPACE).seconds.do(controller.receive_mail) while True: schedule.run_pending() time.sleep(self.TIME_SPACE)

          我們只需要創(chuàng)建這個類就可以了:

          if __name__ == '__main__':    controller = ComputerController('發(fā)件郵箱', '收件郵箱')    controller.run_controller()

          我們需要傳入收件郵箱和發(fā)件郵箱,另外還需要在 init 方法中,修改密碼即可。

          五、實(shí)現(xiàn)一些預(yù)設(shè)功能

          下面我們實(shí)現(xiàn)一些小功能。

          5.1、截圖

          from PIL import ImageGrabdef grab_windows(self):    im = ImageGrab.grab()    im.save('status.jpg')

          使用 Pillow 模塊需要先安裝:

          pip install pillow

          5.2、關(guān)機(jī)

          import osdef shut_down(self):    """關(guān)機(jī)"""    os.system('shutdown /s /t 0')

          這個是通用的兩個功能。

          另外我們可以使用 pynput 模塊控制鍵盤,進(jìn)行一些操作。這個需要根據(jù)自己電腦的情況操作,比如我使用 PyCharm 運(yùn)行程序的快捷鍵是 shift+f10,所以可以使用下列代碼運(yùn)行程序:

          def run_program(self):    """運(yùn)行程序"""    with self.kb.pressed(Key.shift):        self.kb.press(Key.f10)        self.kb.release(Key.f10)

          類似的方法,大家可以自己定制一些操作。

          整個程序完整代碼如下:

          import osimport timeimport yagmailimport keyringimport schedulefrom imbox import Imboxfrom PIL import ImageGrabfrom pynput.keyboard import *
          class ComputerController():
              TIME_SPACE = 10    SMTP_163 = 'smtp.163.com'    SMTP_QQ = 'smtp.qq.com' kb = Controller()
          def __init__(self, user, receiver): self.user = user self.receiver = receiver # 注冊 yagmail.register(self.user, '授權(quán)碼或密碼')
          def send_main(self, msg): """發(fā)郵件""" yag = yagmail.SMTP(user=self.user, host=self.SMTP_163) contents = [ msg ]        yag.send(self.receiver, '來自電腦的郵件', contents=contents)
          def receive_mail(self): """收郵件"""
          # 讀取密碼 password = keyring.get_password('yagmail', self.user) with Imbox('imap.163.com', '[email protected]', password, ssl=True) as imbox: all_msg = imbox.messages(unread=True) for uid, message in all_msg: if '110' == message.subject: # 標(biāo)記已讀 imbox.mark_seen(uid) msg = message.body['plain'] if msg[0].__contains__('截圖'): # 截圖 self.grab_windows() # 發(fā)送截圖 self.send_main('status.jpg') if msg[0].__contains__('重啟'): self.restart_server() time.sleep(3) self.grab_windows() self.send_main('status.jpg') if msg[0].__contains__('關(guān)機(jī)'): self.shut_down()
          def grab_windows(self): im = ImageGrab.grab() im.save('status.jpg')
          def restart_server(self): time.sleep(3) os.system('shutdown') time.sleep(3) os.system('startup')
          def run_program(self): """運(yùn)行程序""" with self.kb.pressed(Key.shift): self.kb.press(Key.f10) self.kb.release(Key.f10)
          def shut_down(self): """關(guān)機(jī)""" os.system('shutdown /s /t 0')
          def run_controller(self): schedule.every(self.TIME_SPACE).seconds.do(controller.receive_mail) while True: schedule.run_pending() time.sleep(self.TIME_SPACE)

          if __name__ == '__main__': controller = ComputerController('發(fā)件郵箱', '收件郵箱') controller.run_controller(

          這個代碼里我們設(shè)定,在讀取郵件時只讀取主題為“110”的郵件,這樣可以避免干擾郵件。所以我們在發(fā)送郵件時需要將主題設(shè)置為“110”,而郵件內(nèi)容則是一些關(guān)鍵詞。比如“截圖”就是截圖操作,“關(guān)機(jī)”就是關(guān)機(jī)操作。這個可以自己定義。

          以上便實(shí)現(xiàn)了一個通過郵件向遠(yuǎn)程電腦發(fā)送操作指令的工具。大家可以在此基礎(chǔ)上進(jìn)行改進(jìn)和擴(kuò)展。歡迎把你的想法分享在留言中。

          如果文章對你有幫助,歡迎轉(zhuǎn)發(fā)/點(diǎn)贊/收藏~

          作者:ZackSock
          來源:建文件夾X


          _往期文章推薦_

          用Python控制你的鼠標(biāo)和鍵盤




          如需了解付費(fèi)精品課程教學(xué)答疑服務(wù)
          請?jiān)?strong style="max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;">Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 54
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产9在线观看 | 波多野结衣操逼视频 | 国产无遮挡又黄又爽免费网站 | www黄色在线观看 | 亚洲国产欧美在线 |