Windows批處理實(shí)現(xiàn)郵件遠(yuǎn)程控制電腦的操作方法(第三方批處理)
最近網(wǎng)上看到了電子郵箱的新利用方法如題,下載了幾個(gè)此類軟件,發(fā)現(xiàn)好幾個(gè)不是不好用,就是功能不全。上博客園搜了一下,那么可以看到有使用java和python實(shí)現(xiàn)的,這里我們用Windows的批處理實(shí)現(xiàn)。
我們要實(shí)現(xiàn)的最基礎(chǔ)的功能,自然是執(zhí)行cmd命令,有了這個(gè)其他都好說。
Windows批處理的優(yōu)點(diǎn):
1.一個(gè)批處理文件,配合第三方批處理等,在幾乎所有Windows電腦上,可以直接運(yùn)行。
2.代碼編寫容易,邏輯比較簡(jiǎn)單,基本上都是cmd命令。
批處理的缺點(diǎn):
1.我們遠(yuǎn)程控制,郵件發(fā)送過來的也是命令,由于Windows命令解釋的預(yù)處理機(jī)制,會(huì)把原批處理命令和發(fā)送的命令(變量)混在一起。此處會(huì)涉及到不是非常復(fù)雜、但總是令人暈頭轉(zhuǎn)向的空格問題、引號(hào)問題、轉(zhuǎn)義問題等。
2.上面這步若沒有處理好,很容易發(fā)生語法錯(cuò)誤。如果是較輕的錯(cuò)誤,命令完成還能給你返回一個(gè)errorlevel,若是比較嚴(yán)重的語法錯(cuò)誤,可能直接導(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è)。下面僅簡(jiǎn)單說明一下。
getmail收郵件的用法
幫助文件中的參數(shù)我們不是每一個(gè)都用到。下面介紹的是本例中用到的幾個(gè)。
-u <userid>
指定登錄的郵箱賬號(hào)-pw <password>
登錄密碼。在國(guó)內(nèi)常見的幾個(gè)郵箱都不是使用郵箱賬號(hào)密碼來直接作為pop3/imap的密碼,通常需要你自己到設(shè)置頁面獲取。-s <server>
pop3服務(wù)器。可以在各郵箱有關(guān)設(shè)置頁面找到。-delete
下載后刪除下載的郵件。不加此參數(shù)則不刪除。-xtract
下載郵件帶有的附件,并且解碼郵件內(nèi)容的明文。不加此參數(shù)則不會(huì)下載附件,也不會(huì)解碼明文,只會(huì)下載一個(gè)MSG文件,含有附件的有關(guān)信息,并且保存郵件內(nèi)容經(jīng)過base64編碼后得到的字符串。-headersonly
只下載郵件頭部信息,即發(fā)送者、接收者、郵件subject等。理論上這會(huì)加快獲取的速度。-n <n>
總共獲取n封郵件。貌似是從最早收到的一封郵件開始數(shù)。
getmail還可以將配置寫入注冊(cè)表,以后每次都使用注冊(cè)表中的配置,可以簡(jiǎn)化參數(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ì)的同樣可以去訪問上面說過的頁面,這里只介紹會(huì)用到的。
<filename>
直接寫在命令后面的第一個(gè)參數(shù),指定一個(gè)文本文件,其中的內(nèi)容會(huì)作為郵件的內(nèi)容
若不想從文件指定發(fā)送內(nèi)容,在上面這個(gè)參數(shù)只輸入-
,之后可以在后面加一個(gè)參數(shù)-body "<郵件的內(nèi)容>"
。-to <address>
收件人的電郵地址。-charset <cs>
文本編碼。為了正確發(fā)送中文,我們固定要加的一個(gè)參數(shù)-charset gbk
指定使用GBK編碼。-subject
郵件的主題。-server
輸入smtp服務(wù)器地址,可以在郵箱設(shè)置界面找到。-f
from的縮寫,指定登錄用來發(fā)件的郵箱。-u
登陸郵箱用的用戶名。大部分是你郵件地址@前的部分,若登錄不成功請(qǐng)翻找郵箱的幫助界面。-pw
登錄密碼。與上文getmail的密碼相同。-attach
附加附件到郵件。
2.電腦使用的郵箱
我們的策略是電腦獨(dú)立使用一個(gè)郵箱地址,你可以使用其他的郵箱向這個(gè)地址發(fā)件來實(shí)現(xiàn)控制。
我推薦電腦使用的是新浪郵箱,一個(gè)手機(jī)號(hào)可以注冊(cè)多個(gè)獨(dú)立郵箱。并且連接比較穩(wěn)定,很少出現(xiàn)獲取/發(fā)送不成功的情況,5s的獲取郵件間隔毫無壓力,不會(huì)遭到阻止。
發(fā)件的郵箱幾乎沒有什么限制了,但是釘釘自帶的釘郵在這里無法使用,因?yàn)闀?huì)將郵件的subject也一起加密(或者是使用了utf8編碼什么的,記不清了),批處理直接讀取比較麻煩。目前試過好用的是阿里郵箱和qq郵箱。163應(yīng)該是好用,但是沒試過。
3.原理概述
3.1執(zhí)行命令
由于在getmail接收到的文本文件里,subject沒有加密,而content經(jīng)過base64編碼了。所以一開始的計(jì)劃是只讀取subject,命令全部放到subject里。
程序首先要實(shí)現(xiàn)的功能是執(zhí)行cmd命令,后面我們還會(huì)加幾個(gè)自定義功能,需要通過命令來指定我們這里選擇的功能。這里我的實(shí)現(xiàn)方法是使用#號(hào)分隔,功能選擇用第一個(gè)#包裹,加的參數(shù)放在第二個(gè)#后面。批處理中可以使用for命令分別取得這兩個(gè)字符串。
例如,我們將執(zhí)行cmd命令的功能命名為cmd
,需要執(zhí)行命令start a.exe
那么我們發(fā)郵件的主題會(huì)輸入成:#cmd#start a.exe
這個(gè)郵件經(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í)行這個(gè)命令即可。這里最好是新開一個(gè)cmd。加min最小化運(yùn)行。
start /MIN cmd.exe /c %para%
我們也可以調(diào)用另一個(gè)bat文件,這樣也會(huì)新開一個(gè)cmd窗口。同時(shí)可以寫入一些命令一并執(zhí)行,還可以將回顯輸入到文件中,再利用blat發(fā)送出去,這樣郵件端也可以看到回顯。
同時(shí),執(zhí)行其他功能時(shí)也最好都新開一個(gè)批處理運(yùn)行。這樣若執(zhí)行命令耗時(shí)較長(zhǎng),或者執(zhí)行的命令一直在后臺(tái)運(yùn)行時(shí),不會(huì)阻斷檢查郵件的進(jìn)程,仍然可以郵件執(zhí)行其他命令。
3.2文件傳輸
這就比較簡(jiǎn)單了。getmail只要加上-xtract參數(shù),就會(huì)直接下載附件。要使用blat上傳附件,我們可以將其命名為upfile功能,使用if判斷%mode%
,若為upfile就調(diào)用另一個(gè)批處理執(zhí)行blat,將發(fā)送的文件名附加到-attach
即可。
利用這個(gè)功能,我們也可以發(fā)送批處理文件,將多個(gè)命令寫入文件實(shí)現(xiàn)命令批量執(zhí)行。通過start
命令調(diào)用這個(gè)批處理即可。需要注意的是,一些郵箱(比如新浪郵箱就是)會(huì)自動(dòng)攔截bat擴(kuò)展名等一些可執(zhí)行程序作為附件的郵件。解決方法也很簡(jiǎn)單,可以更改文件擴(kuò)展名再發(fā)送,例如改為.txt。附件接收之后,再通過郵件執(zhí)行重命名命令,改回?cái)U(kuò)展名,即可運(yùn)行。
3.3含有中文的命令
帶有中文subject無法在msg文件中直接顯示。例如會(huì)顯示為:
Subject: =?UTF-8?B?4oCq4oCqZGltb0BhbGl5dW4uY29t4oCs4oCs?=
這樣解碼就比較麻煩。而下面的content使用base64解碼之后就能直接看到中文,getmail的-xtract
參數(shù)添加后也會(huì)自動(dòng)將內(nèi)容給解碼出來,比較方便。因此我們可以在郵件正文中輸入命令,程序讀取后執(zhí)行。
然而getmail解碼出來的內(nèi)容是html(點(diǎn)擊查看詳細(xì)),這個(gè)批處理想要直接讀取文本比較麻煩。前面這個(gè)頁面也有解決方法。
3.4隱藏運(yùn)行
也比較簡(jiǎn)單。使用vbs命令即可實(shí)現(xiàn)完全隱藏cmd的黑框,同時(shí)還能順便獲取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", "此處可以加一個(gè)參數(shù)", "", "runas", 0 >> Getadmin.vbs Getadmin.vbs del /f /q Getadmin.vbs
3.5開機(jī)運(yùn)行&防止關(guān)閉
開機(jī)運(yùn)行可以通過設(shè)置任務(wù)計(jì)劃實(shí)現(xiàn)。可以使用任務(wù)計(jì)劃程序來窗口化配置任務(wù),也可以使用schtasks命令,編寫一個(gè)批處理實(shí)現(xiàn)一鍵添加任務(wù)。同時(shí)我們還可以在程序啟動(dòng)時(shí)發(fā)送提醒郵件,實(shí)現(xiàn)對(duì)開機(jī)時(shí)間的監(jiān)控。
rem 此處需要開機(jī)啟動(dòng)的批處理文件為startgo.bat set file='%~dp0startgo.bat' schtasks /Create /SC ONLOGON /TN \Windows\MailService /TR "%file%" /F /RL HIGHEST /DELAY 0001:00 rem 延時(shí)啟動(dòng)用于防止電腦還未聯(lián)網(wǎng)導(dǎo)致開機(jī)郵件發(fā)送失敗 pause
有關(guān)防止進(jìn)程被殺死,問題,歡迎點(diǎn)擊此處,或者參考。
3.6配置文件
由于許多不同的批處理文件都要實(shí)現(xiàn)接受/發(fā)送郵件,我們需要將郵箱地址、登錄用戶名、密碼都寫入一個(gè)配置文件中,便于郵件收發(fā)。當(dāng)然也可以使用程序?qū)⑴渲脙?chǔ)存在注冊(cè)表的功能。
在配置文件中,我們只需要將不同的配置寫入單獨(dú)一行即可用批處理分別讀取,這樣也便于文件的編輯。
利用for命令可以讀取文件的每一行并對(duì)每行執(zhí)行相同的操作。想要使用for讀取單獨(dú)一行的內(nèi)容,需要在執(zhí)行的末尾添加goto跳出for命令。多次使用這樣的for即可讀取到配置文件各個(gè)行的內(nèi)容。有關(guān)內(nèi)容可見網(wǎng)頁鏈接。
3.7更多功能
我們還可以添加更多實(shí)用的功能,通過if
判斷和goto
跳轉(zhuǎn)到功能。
例如,我們想要通過命令彈出一個(gè)提示框,代碼比較長(zhǎng),輸入不方便。
mshta vbscript:msgbox("content",64,"title")(window.close)
此時(shí)就可以將命令保存到bat中。把功能命名為popup,使用if判斷%mode%
即可。跳轉(zhuǎn)后執(zhí)行對(duì)應(yīng)的bat文件,并將顯示的內(nèi)容作為參數(shù)輸送給bat。例如我們規(guī)定用$作分隔字符,則發(fā)送郵件時(shí)輸入:#popup#title$64$content
主程序按照#分隔輸入,判斷出需要跳轉(zhuǎn)到popup;之后popup.bat會(huì)接收到輸入:"title$64$content"
此時(shí)再按$分割輸入,即可得到每部分內(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.最終代碼
由于使用了不少功能,放在一個(gè)程序文件夾里的第三方和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ā)。下面還有幾個(gè)功能被替換。 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 ::需要顯示中文,保存請(qǐng)使用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
這里僅展示部分文件。想查看所有文件,請(qǐng)下載。
到此這篇關(guān)于Windows批處理實(shí)現(xiàn)郵件遠(yuǎn)程控制電腦(第三方批處理)的文章就介紹到這了,更多相關(guān)Windows批處理郵件遠(yuǎn)程控制電腦內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CMD中使用attrib命令設(shè)置文件只讀、隱藏屬性詳解
這篇文章主要介紹了使用attrib命令設(shè)置文件只讀、隱藏屬性詳解,并用一個(gè)完整流程來說明文件屬性的變化,需要的朋友可以參考下2014-08-08