Windows批處理實(shí)現(xiàn)郵件遠(yuǎn)程控制電腦的操作方法(第三方批處理)
最近網(wǎng)上看到了電子郵箱的新利用方法如題,下載了幾個此類軟件,發(fā)現(xiàn)好幾個不是不好用,就是功能不全。上博客園搜了一下,那么可以看到有使用java和python實(shí)現(xiàn)的,這里我們用Windows的批處理實(shí)現(xiàn)。
我們要實(shí)現(xiàn)的最基礎(chǔ)的功能,自然是執(zhí)行cmd命令,有了這個其他都好說。
Windows批處理的優(yōu)點(diǎn):
1.一個批處理文件,配合第三方批處理等,在幾乎所有Windows電腦上,可以直接運(yùn)行。
2.代碼編寫容易,邏輯比較簡單,基本上都是cmd命令。
批處理的缺點(diǎn):
1.我們遠(yuǎn)程控制,郵件發(fā)送過來的也是命令,由于Windows命令解釋的預(yù)處理機(jī)制,會把原批處理命令和發(fā)送的命令(變量)混在一起。此處會涉及到不是非常復(fù)雜、但總是令人暈頭轉(zhuǎn)向的空格問題、引號問題、轉(zhuǎn)義問題等。
2.上面這步若沒有處理好,很容易發(fā)生語法錯誤。如果是較輕的錯誤,命令完成還能給你返回一個errorlevel,若是比較嚴(yán)重的語法錯誤,可能直接導(dǎo)致命令行閃退。(就什么都沒有了。)for和if命令最易出現(xiàn)此問題。
1.收發(fā)郵件
Windows不自帶能夠通過命令行收發(fā)郵件的程序,因此我們的程序需要自帶第三方命令行。這里我們使用工具getmail來接收郵件。getmail使用pop3協(xié)議,可以將郵件下載為txt,并下載其附件。
發(fā)送郵件則使用blat進(jìn)行。blat使用SMTP發(fā)送郵件,同樣支持上傳附件。
可以通過輸入--help
或/?
來獲取它們的詳細(xì)用法,可以參考這篇或者參考這篇。雖然翻譯不是非常專業(yè)。下面僅簡單說明一下。
getmail收郵件的用法
幫助文件中的參數(shù)我們不是每一個都用到。下面介紹的是本例中用到的幾個。
-u <userid>
指定登錄的郵箱賬號-pw <password>
登錄密碼。在國內(nèi)常見的幾個郵箱都不是使用郵箱賬號密碼來直接作為pop3/imap的密碼,通常需要你自己到設(shè)置頁面獲取。-s <server>
pop3服務(wù)器??梢栽诟鬣]箱有關(guān)設(shè)置頁面找到。-delete
下載后刪除下載的郵件。不加此參數(shù)則不刪除。-xtract
下載郵件帶有的附件,并且解碼郵件內(nèi)容的明文。不加此參數(shù)則不會下載附件,也不會解碼明文,只會下載一個MSG文件,含有附件的有關(guān)信息,并且保存郵件內(nèi)容經(jīng)過base64編碼后得到的字符串。-headersonly
只下載郵件頭部信息,即發(fā)送者、接收者、郵件subject等。理論上這會加快獲取的速度。-n <n>
總共獲取n封郵件。貌似是從最早收到的一封郵件開始數(shù)。
getmail還可以將配置寫入注冊表,以后每次都使用注冊表中的配置,可以簡化參數(shù),不過我這次沒有使用。
因此我們配置好上述參數(shù)后,獲得的回顯如下(此次服務(wù)器上沒有任何郵件):
Failed to open registry key for GetMail profile , using default.
Failed to open registry key for GetMail
Getting *********@sina.cn's mailbox contents from server pop.sina.cn:110
There are 0 messages on the server.
blat發(fā)郵件的使用
參數(shù)非常多。想看詳細(xì)的同樣可以去訪問上面說過的頁面,這里只介紹會用到的。
<filename>
直接寫在命令后面的第一個參數(shù),指定一個文本文件,其中的內(nèi)容會作為郵件的內(nèi)容
若不想從文件指定發(fā)送內(nèi)容,在上面這個參數(shù)只輸入-
,之后可以在后面加一個參數(shù)-body "<郵件的內(nèi)容>"
。-to <address>
收件人的電郵地址。-charset <cs>
文本編碼。為了正確發(fā)送中文,我們固定要加的一個參數(shù)-charset gbk
指定使用GBK編碼。-subject
郵件的主題。-server
輸入smtp服務(wù)器地址,可以在郵箱設(shè)置界面找到。-f
from的縮寫,指定登錄用來發(fā)件的郵箱。-u
登陸郵箱用的用戶名。大部分是你郵件地址@前的部分,若登錄不成功請翻找郵箱的幫助界面。-pw
登錄密碼。與上文getmail的密碼相同。-attach
附加附件到郵件。
2.電腦使用的郵箱
我們的策略是電腦獨(dú)立使用一個郵箱地址,你可以使用其他的郵箱向這個地址發(fā)件來實(shí)現(xiàn)控制。
我推薦電腦使用的是新浪郵箱,一個手機(jī)號可以注冊多個獨(dú)立郵箱。并且連接比較穩(wěn)定,很少出現(xiàn)獲取/發(fā)送不成功的情況,5s的獲取郵件間隔毫無壓力,不會遭到阻止。
發(fā)件的郵箱幾乎沒有什么限制了,但是釘釘自帶的釘郵在這里無法使用,因?yàn)闀⑧]件的subject也一起加密(或者是使用了utf8編碼什么的,記不清了),批處理直接讀取比較麻煩。目前試過好用的是阿里郵箱和qq郵箱。163應(yīng)該是好用,但是沒試過。
3.原理概述
3.1執(zhí)行命令
由于在getmail接收到的文本文件里,subject沒有加密,而content經(jīng)過base64編碼了。所以一開始的計劃是只讀取subject,命令全部放到subject里。
程序首先要實(shí)現(xiàn)的功能是執(zhí)行cmd命令,后面我們還會加幾個自定義功能,需要通過命令來指定我們這里選擇的功能。這里我的實(shí)現(xiàn)方法是使用#號分隔,功能選擇用第一個#包裹,加的參數(shù)放在第二個#后面。批處理中可以使用for命令分別取得這兩個字符串。
例如,我們將執(zhí)行cmd命令的功能命名為cmd
,需要執(zhí)行命令start a.exe
那么我們發(fā)郵件的主題會輸入成:#cmd#start a.exe
這個郵件經(jīng)過getmail下載后,出現(xiàn)在MSG1.TXT文件里的一行是:Subject: #cmd#start a.exe
我們通過for來解讀輸入:
echo off for /f "tokens=2,* delims=#" %%i in ('type MSG1.TXT ^| findstr /b Subject:') do ( set mode=%%i set para="%%j" ) echo mode:%mode% echo command:%para% pause
得到結(jié)果:
mode:cmd
command:"start a.exe"
之后我們調(diào)用cmd執(zhí)行這個命令即可。這里最好是新開一個cmd。加min最小化運(yùn)行。
start /MIN cmd.exe /c %para%
我們也可以調(diào)用另一個bat文件,這樣也會新開一個cmd窗口。同時可以寫入一些命令一并執(zhí)行,還可以將回顯輸入到文件中,再利用blat發(fā)送出去,這樣郵件端也可以看到回顯。
同時,執(zhí)行其他功能時也最好都新開一個批處理運(yùn)行。這樣若執(zhí)行命令耗時較長,或者執(zhí)行的命令一直在后臺運(yùn)行時,不會阻斷檢查郵件的進(jìn)程,仍然可以郵件執(zhí)行其他命令。
3.2文件傳輸
這就比較簡單了。getmail只要加上-xtract參數(shù),就會直接下載附件。要使用blat上傳附件,我們可以將其命名為upfile功能,使用if判斷%mode%
,若為upfile就調(diào)用另一個批處理執(zhí)行blat,將發(fā)送的文件名附加到-attach
即可。
利用這個功能,我們也可以發(fā)送批處理文件,將多個命令寫入文件實(shí)現(xiàn)命令批量執(zhí)行。通過start
命令調(diào)用這個批處理即可。需要注意的是,一些郵箱(比如新浪郵箱就是)會自動攔截bat擴(kuò)展名等一些可執(zhí)行程序作為附件的郵件。解決方法也很簡單,可以更改文件擴(kuò)展名再發(fā)送,例如改為.txt。附件接收之后,再通過郵件執(zhí)行重命名命令,改回擴(kuò)展名,即可運(yùn)行。
3.3含有中文的命令
帶有中文subject無法在msg文件中直接顯示。例如會顯示為:
Subject: =?UTF-8?B?4oCq4oCqZGltb0BhbGl5dW4uY29t4oCs4oCs?=
這樣解碼就比較麻煩。而下面的content使用base64解碼之后就能直接看到中文,getmail的-xtract
參數(shù)添加后也會自動將內(nèi)容給解碼出來,比較方便。因此我們可以在郵件正文中輸入命令,程序讀取后執(zhí)行。
然而getmail解碼出來的內(nèi)容是html(點(diǎn)擊查看詳細(xì)),這個批處理想要直接讀取文本比較麻煩。前面這個頁面也有解決方法。
3.4隱藏運(yùn)行
也比較簡單。使用vbs命令即可實(shí)現(xiàn)完全隱藏cmd的黑框,同時還能順便獲取UAC管理員權(quán)限。
此處假設(shè)我們要運(yùn)行的是run.bat:
REM 僅隱藏運(yùn)行 echo set ws=WScript.CreateObject("WScript.Shell") > start.vbs echo ws.Run "%~dp0run.bat /start",0 >> start.vbs start.vbs del /f /q start.vbs REM 隱藏運(yùn)行并獲取管理員權(quán)限 ECHO SET UAC = CreateObject^("Shell.Application"^) > Getadmin.vbs ECHO UAC.ShellExecute "run.bat", "此處可以加一個參數(shù)", "", "runas", 0 >> Getadmin.vbs Getadmin.vbs del /f /q Getadmin.vbs
3.5開機(jī)運(yùn)行&防止關(guān)閉
開機(jī)運(yùn)行可以通過設(shè)置任務(wù)計劃實(shí)現(xiàn)??梢允褂萌蝿?wù)計劃程序來窗口化配置任務(wù),也可以使用schtasks命令,編寫一個批處理實(shí)現(xiàn)一鍵添加任務(wù)。同時我們還可以在程序啟動時發(fā)送提醒郵件,實(shí)現(xiàn)對開機(jī)時間的監(jiān)控。
rem 此處需要開機(jī)啟動的批處理文件為startgo.bat set file='%~dp0startgo.bat' schtasks /Create /SC ONLOGON /TN \Windows\MailService /TR "%file%" /F /RL HIGHEST /DELAY 0001:00 rem 延時啟動用于防止電腦還未聯(lián)網(wǎng)導(dǎo)致開機(jī)郵件發(fā)送失敗 pause
有關(guān)防止進(jìn)程被殺死,問題,歡迎點(diǎn)擊此處,或者參考。
3.6配置文件
由于許多不同的批處理文件都要實(shí)現(xiàn)接受/發(fā)送郵件,我們需要將郵箱地址、登錄用戶名、密碼都寫入一個配置文件中,便于郵件收發(fā)。當(dāng)然也可以使用程序?qū)⑴渲脙Υ嬖谧员淼墓δ堋?br />在配置文件中,我們只需要將不同的配置寫入單獨(dú)一行即可用批處理分別讀取,這樣也便于文件的編輯。
利用for命令可以讀取文件的每一行并對每行執(zhí)行相同的操作。想要使用for讀取單獨(dú)一行的內(nèi)容,需要在執(zhí)行的末尾添加goto跳出for命令。多次使用這樣的for即可讀取到配置文件各個行的內(nèi)容。有關(guān)內(nèi)容可見網(wǎng)頁鏈接。
3.7更多功能
我們還可以添加更多實(shí)用的功能,通過if
判斷和goto
跳轉(zhuǎn)到功能。
例如,我們想要通過命令彈出一個提示框,代碼比較長,輸入不方便。
mshta vbscript:msgbox("content",64,"title")(window.close)
此時就可以將命令保存到bat中。把功能命名為popup,使用if判斷%mode%
即可。跳轉(zhuǎn)后執(zhí)行對應(yīng)的bat文件,并將顯示的內(nèi)容作為參數(shù)輸送給bat。例如我們規(guī)定用$作分隔字符,則發(fā)送郵件時輸入:#popup#title$64$content
主程序按照#分隔輸入,判斷出需要跳轉(zhuǎn)到popup;之后popup.bat會接收到輸入:"title$64$content"
此時再按$分割輸入,即可得到每部分內(nèi)容,并用于彈窗:
echo off for /f "tokens=1,2,3 delims=$" %%i in ('echo %~1') do ( set tit=%%i set num=%%j set text=%%k ) mshta vbscript:msgbox("%text%",%num%,"%tit%")(window.close) exit
4.最終代碼
由于使用了不少功能,放在一個程序文件夾里的第三方和bat文件也有不少。
點(diǎn)擊查看代碼
下面的代碼都可以這樣點(diǎn)擊展開。
start.bat
echo off cd /d "%~dp0" echo set ws=WScript.CreateObject("WScript.Shell") > start.vbs echo ws.Run "%~dp0run.bat /start",0 >> start.vbs start.vbs rem 發(fā)送開機(jī)提醒郵件;讀取配置文件 :euser for /f "eol=# tokens=* delims=" %%i in (mail.cfg) do ( set euser=%%i goto ename ) :ename for /f "eol=# skip=4 tokens=* delims=" %%i in (mail.cfg) do ( set ename=%%i goto epw ) :epw for /f "eol=# skip=6 tokens=* delims=" %%i in (mail.cfg) do ( set epw=%%i goto smtp ) :smtp for /f "eol=# skip=10 tokens=* delims=" %%i in (mail.cfg) do ( set smtp=%%i goto eto ) :eto for /f "eol=# skip=12 tokens=* delims=" %%i in (mail.cfg) do ( set eto=%%i goto getcfgend ) :getcfgend set subj="[MailCTRL]%DATE% %TIME% %COMPUTERNAME%" echo host has started.>hello.txt echo for more info:>> hello.txt echo date and time:%DATE% %TIME%>> hello.txt echo computer:%COMPUTERNAME%>> hello.txt echo userdomain:%USERDOMAIN%>> hello.txt echo username:%USERNAME%>> hello.txt echo -------------------->>hello.txt systeminfo >> hello.txt ipconfig >> hello.txt set content=hello.txt ::------------------ blat %content% -to %eto% -charset gbk -subject %subj% -server %smtp% -f %euser% -u %ename% -pw %epw% del /f /q %content% del /f /q start.vbs exit
run.bat
cd /d "%~dp0" del /F /Q z*.todo del /F /Q Extract*.out del /F /Q html*.out @echo off timeout /t 3 cls echo "mail.cfg"> usedcfg.cfg ::echo %~dp0> dir.cfg echo ########################## echo setting email service...... :euser for /f "tokens=* delims=" %%i in (usedcfg.cfg) do set cfgfile=%%~i echo setted cfgfile:%cfgfile% for /f "eol=# tokens=* delims=" %%i in (%cfgfile%) do ( set euser=%%i goto epw ) :epw for /f "eol=# skip=6 tokens=* delims=" %%i in (%cfgfile%) do ( set epw=%%i goto pop ) :pop for /f "eol=# skip=8 tokens=* delims=" %%i in (%cfgfile%) do ( set pop=%%i goto getcfgend ) :getcfgend echo service started successfully AT %DATE% %TIME% echo ------------------------------------ :see TIMEOUT /T 5 echo checking new messages at %TIME% for /f "skip=3 tokens=3 delims=# " %%i in ('getmail -u %euser% -pw %epw% -s %pop% -headersonly') do set newmsg=%%i echo new message received:%newmsg% if %newmsg% GEQ 1 goto get goto see :get set mode= set para= del /F /Q MSG*.TXT del /F /Q Extract*.out echo downloading the new messages... getmail -u %euser% -pw %epw% -s %pop% -delete -xtract -n 1 :: -delete :tell for /f "tokens=2,* delims=#" %%i in ('type MSG1.TXT ^| findstr /b Subject:') do ( set mode=%%i set para="%%j" ) set htext=%RANDOM% del /f /q html%htext%.out echo use html2txt.exe------------------------ html2txt Extract1.out html%htext%.out echo ---------------------------------------- echo information read from MSG.TXT: echo mode: %mode% echo command: %para% echo html file:html%htext%.out echo RUNNING THE PROGRAM...... ::if %mode%==cmd goto directcmd ::if %mode%==back goto backcmd ::if %mode%==xcmd goto xcmd ::if %mode%==xback goto xbackcmd if %mode%==cmd goto textcmd if %mode%==back goto textback if %mode%==xcmd goto textX if %mode%==xback goto textXback if %mode%==popup goto popup if %mode%==poptext goto poptext if %mode%==upfile goto upfile if %mode%==use goto changecfg ::if %mode%==dir goto changedir rem 還有一些功能未開發(fā)。下面還有幾個功能被替換。 goto see :directcmd start /MIN cmdDirect.bat %para% goto see :backcmd start /MIN backDirect.bat %para% goto see :xcmd set xmark=%RANDOM% echo %para%> z%xmark%.todo ECHO SET UAC = CreateObject^("Shell.Application"^) > Getadmin.vbs ECHO UAC.ShellExecute "cmdAdmin.bat", "z%xmark%", "", "runas", 0 >> Getadmin.vbs echo using vbs to run an admin command. Getadmin.vbs del /f /q Getadmin.vbs goto see :xbackcmd set xmark=%RANDOM% echo %para%> z%xmark%.todo ECHO SET UAC = CreateObject^("Shell.Application"^) > Getadmin.vbs ECHO UAC.ShellExecute "backAdmin.bat", "z%xmark%", "", "runas", 0 >> Getadmin.vbs echo using vbs to run an admin command. Getadmin.vbs del /f /q Getadmin.vbs goto see :textcmd start /MIN cmdText.bat %htext% goto see :textback start /MIN backText.bat %htext% goto see :textX ECHO SET UAC = CreateObject^("Shell.Application"^) > Getadmin.vbs ECHO UAC.ShellExecute "cmdText.bat", "%htext%", "", "runas", 0 >> Getadmin.vbs echo using vbs to run an admin command. Getadmin.vbs del /f /q Getadmin.vbs goto see :textXback ECHO SET UAC = CreateObject^("Shell.Application"^) > Getadmin.vbs ECHO UAC.ShellExecute "backText.bat", "%htext%", "", "runas", 0 >> Getadmin.vbs echo using vbs to run an admin command. Getadmin.vbs del /f /q Getadmin.vbs goto see :popup start /MIN popup.bat %para% goto see :poptext start /MIN poptext.bat %htext% goto see :upfile start /MIN upfile.bat %para% goto see :changecfg echo %para%> usedcfg.cfg goto euser :changedir start /MIN changeDir.bat %htext% goto see
backText.bat
rem 用于命令回顯。 echo off cd /d "%~dp0" :euser for /f "tokens=* delims=" %%i in (usedcfg.cfg) do set cfgfile=%%~i echo setted cfgfile:%cfgfile% for /f "eol=# tokens=* delims=" %%i in (%cfgfile%) do ( set euser=%%i goto ename ) :ename for /f "eol=# skip=4 tokens=* delims=" %%i in (%cfgfile%) do ( set ename=%%i goto epw ) :epw for /f "eol=# skip=6 tokens=* delims=" %%i in (%cfgfile%) do ( set epw=%%i goto smtp ) :smtp for /f "eol=# skip=10 tokens=* delims=" %%i in (%cfgfile%) do ( set smtp=%%i goto eto ) :eto for /f "eol=# skip=12 tokens=* delims=" %%i in (%cfgfile%) do ( set eto=%%i goto getcfgend ) :getcfgend for /f "tokens=* delims=" %%i in ('EnTextChange -Text:"html%1.out"') do ( set todo=%%i goto out ) :out del /f /q html%1.out set remark=re%RANDOM% %todo%> %remark%.txt echo ----------------------------->> %remark%.txt echo the cmd you run BY ADMIN: %todo%>> %remark%.txt blat %remark%.txt -to %eto% -charset gbk -subject [MailCTRL]command"%TIME%" -server %smtp% -f %euser% -u %ename% -pw %epw% timeout /t 5 del /f /q %remark%.txt exit
poptext.bat
echo off ::需要顯示中文,保存請使用ANSI編碼 cd /d "%~dp0" for /f "tokens=1,2,3 delims=$" %%i in ('EnTextChange -Text:"html%1.out"') do ( set tit=%%i set num=%%j set text=%%k ) ::del /f /q html%1.out mshta vbscript:msgbox("%text%",%num%,"%tit%")(window.close) pause exit
upfile.bat
rem 用于上傳文件 echo off cd /d "%~dp0" :euser for /f "tokens=* delims=" %%i in (usedcfg.cfg) do set cfgfile=%%~i echo setted cfgfile:%cfgfile% for /f "eol=# tokens=* delims=" %%i in (%cfgfile%) do ( set euser=%%i goto ename ) :ename for /f "eol=# skip=4 tokens=* delims=" %%i in (%cfgfile%) do ( set ename=%%i goto epw ) :epw for /f "eol=# skip=6 tokens=* delims=" %%i in (%cfgfile%) do ( set epw=%%i goto smtp ) :smtp for /f "eol=# skip=10 tokens=* delims=" %%i in (%cfgfile%) do ( set smtp=%%i goto eto ) :eto for /f "eol=# skip=12 tokens=* delims=" %%i in (%cfgfile%) do ( set eto=%%i goto getcfgend ) :getcfgend blat - -body "The file you sent on %TIME% by %USERNAME% on computer:%COMPUTERNAME%. Used email address:%euser%" -to %eto% -charset gbk -subject [MailCTRL]file:%1 -server %smtp% -f %euser% -u %ename% -pw %epw% -attach %~1 exit
這里僅展示部分文件。想查看所有文件,請下載。
到此這篇關(guān)于Windows批處理實(shí)現(xiàn)郵件遠(yuǎn)程控制電腦(第三方批處理)的文章就介紹到這了,更多相關(guān)Windows批處理郵件遠(yuǎn)程控制電腦內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CMD中使用attrib命令設(shè)置文件只讀、隱藏屬性詳解
這篇文章主要介紹了使用attrib命令設(shè)置文件只讀、隱藏屬性詳解,并用一個完整流程來說明文件屬性的變化,需要的朋友可以參考下2014-08-08