需求是這樣的:針對帳號的管理,若是發現該帳號的管理員給帳號加了批註,(好比要過時,修改密碼,完善資料等),就須要找到這樣的帳號及其管理的郵件,而後發郵件給他們的管理員同時抄送給帳號以達到提醒的目的。那麼咱們的實際項目中是這樣管理的:html
有三個表,第一張表用來存放帳號的全部信息,以及這個帳號的備註,第二張表存放了帳號信息以及他的管理員的名字等信息,第三張表就存放管理的信息以及管理員的郵件地址。都是excel表服務器
思路是這樣:首先在表一里找到全部備註欄不爲空的帳號,而後把這些帳號拿到第二張表裏去搜索,若是找到了就繼續找出它對應的管理的名字,最後吧獲得的管理員的名字拿到第三張表去搜索找到它的郵件地址,同時也須要把帳號和管理員郵件記錄下來。網絡
最後使用系統用戶發郵件給全部的管理員,正文裏就列出這些要作修改的帳號的基本信息。函數
其實這裏就有2部分,第一部分主要是excel的處理,這一塊應該不復雜,我會直接貼出代碼,這裏主要說明第二部分,就是郵件的發送。ui
CDO.Messagespa
想經過vbs腳原本發郵件,就須要用到CDO.Message這個對象,而後配置它的屬性,好比郵件服務器,端口,認證方式,帳號密碼等,同時也能夠對郵件自己的屬性作設置,好比郵件緊急度,亂碼等。下面是代碼:excel
function sendEmail(strEmail_From, strEmail_To, strCC_List, strEmail_Subject, strEmail_Body) Set cdoMail = CreateObject("CDO.Message") '建立CDO對象 Set cdoConf = CreateObject("CDO.Configuration") '建立CDO配置文件對象 cdoMail.From = strEmail_From cdoMail.To = strEmail_To cdoMail.CC = strCC_List cdoMail.Subject = strEmail_Subject '郵件正文 cdoMail.HTMLbody = strEmail_Body & "</table></body></html>" cdoConf.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 '使用網絡上的SMTP服務器而不是本地的SMTP服務器 'cdoConf.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "9.56.224.215" cdoConf.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.126.com" 'SMTP服務器地址, 能夠換成其餘你要用的郵箱服務器或者ip cdoConf.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 '郵件服務器端口 cdoConf.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 '服務器認證方式 cdoConf.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx@126.com" '發件人帳號 cdoConf.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "123456" '發件人登錄郵箱密碼 cdoConf.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60 '鏈接服務器的超時時間 cdoConf.Fields.Update Set cdoMail.Configuration = cdoConf '設置郵件的重要度和優先級 cdoMail.Fields.Item("urn:schemas:mailheader:X-MSMail-Priority") = "High" cdoMail.Fields.Item("urn:schemas:mailheader:X-Priority") = 2 cdoMail.Fields.Item("urn:schemas:httpmail:importance") = 2 cdoMail.Fields.Update '發送郵件 dim sleepSeconds sleepSeconds = 5 cdoMail.Send WScript.Sleep(1000 * sleepSeconds) Set cdoMail = nothing Set cdoConf = nothing End function
而後就能夠調用它來發郵件了code
sendEmail "xxx@126.com", "zzz@qq.com", "yyy@qq.com", "提示郵件", "take action"
下面是解析excel的代碼:server
Set oExcel= CreateObject("Excel.Application") Set oWb1 = oExcel.Workbooks.Open("E:\Bluecare\AA team\115531\US-NiS3.20150909150006Copy.csv") Set oSheetUSNi = oWb1.Sheets("US-NiS3.20150909150006Copy") Set oWb2 = oExcel.Workbooks.Open("E:\Bluecare\AA team\115531\IBM Monthly Report.xlsx") Set oSheetIMR = oWb2.Sheets("Sheet1") Set oWb3 = oExcel.Workbooks.Open("E:\Bluecare\AA team\115531\Sponsor email.xls") Set oSheetSPO = oWb3.Sheets("Sheet1") dim Dit1:set Dit1 = CreateObject("Scripting.Dictionary") dim Dit2:set Dit2 = CreateObject("Scripting.Dictionary") '輸出文件路徑 dim directory1, directory2 directory1 = "C:\\temp\\sponsor_mail_found.txt" directory2 = "C:\\temp\\sponsor_withoutMail.txt" directory3 = "C:\\temp\\account_withoutSponsor.txt" 'for function getExpireAcc: 第一個參數是sheetname,第二個是帳號的列號,第三個是備註列號,第四個是查詢帳號的規則(好比查詢以a開頭的帳號) 'for function getData: 第一個是sheetname,第二個是須要查找的帳號,第三個是帳號列號,第三個是管理員列號,第五個是返回值 '下面就能夠調用函數執行了,執行完成後能夠去輸出目錄裏看最終結果 outSpoMail getData(oSheetIMR, getExpireAcc(oSheetUSNi, "C","M","acl"),"A","K",Dit1), oSheetSPO 'Get impending deactivation account list from URT response file '@param oSheet, sheet name '@param colAccount, the 'account' column '@param colAcctMgrAction, the 'account manager action' column '@param strFilter, the string used to filter the accounts that impending deactivation, eg: "U8" Function getExpireAcc(oSheet, colAccount, colAcctMgrAction, strFilter) dim row, i, varacc, varama, temp row=oSheet.usedRange.Rows.count for i=2 to row varacc=oSheet.cells(i,colAccount) varama=CStr(oSheet.cells(i,colAcctMgrAction)) if (instr(varacc,strFilter)=1) then temp = temp + varacc +"&"+varama+"," end if Next dim j,spit, tmp spit=split(temp,",") for j=0 to ubound(spit)-1 tmp = split(spit(j),"&") if tmp(1) = Empty or tmp(1) = "" or IsNull(tmp(1)) then getExpireAcc = getExpireAcc + tmp(0) + "_" end if next end Function '** Get sponsor name list from IBM Monthly Report spreadsheet '@param oSheet, sheet name '@param sourceAcct, the accounts that impending deactivation '@param colAcctID, the account ID column 'Network ID' '@param colSponsorName, the sponsor name column 'Sponsor' '@param dicAcct_SponsorName, the dictionary to store the account ID and its sponsor name Function getData(oSheet, sourceAcct, colAcctID, colSponsorName, dicAcct_SponsorName) dim m,n,roww, expacc,res, out expacc = split(sourceAcct,"_") roww = oSheet.usedRange.Rows.count for m=2 to roww for n=0 to ubound(expacc)-1 if trim((oSheet.cells(m,colAcctID))) = trim(expacc(n)) then if oSheetIMR.cells(m,colSponsorName) = Empty or oSheetIMR.cells(m,colSponsorName) = "" or IsNull(oSheetIMR.cells(m,colSponsorName)) then out = out + expacc(n)&vbcrlf else dicAcct_SponsorName.add expacc(n),oSheetIMR.cells(m,colSponsorName) end if end if next next writeTxt directory3, out set getData = dicAcct_SponsorName end Function 'Get the sponsor mail address list from 'Sponsor_email' spreadsheet and write it out Function outSpoMail(Dict,oSheet) Dim DictKeys, DictItems, Counter, out1, row, k, out2, out3 row=oSheet.usedRange.Rows.count DictKeys = Dict.Keys DictItems = Dict.Items For Counter = 0 To Dict.Count - 1 for k=2 to row if trim(DictItems(Counter))=trim(oSheet.cells(k,"A")) then WScript.Echo _ "key: " & DictKeys(Counter) & _ " value: " & DictItems(Counter) out1 = out1 + oSheet.cells(k,"B")&vbcrlf Dit2.add DictKeys(Counter), oSheet.cells(k,"B") end if out2 = out2 + oSheet.cells(k,"A") + "_" next Next set outSpoMail = Dit2 'writeTxt(out) 'write the sponsor mail to directory1 writeTxt directory1, out1 For Counter = 0 To Dict.Count - 1 if instr(out2,trim(DictItems(Counter)))>0 then 'msgbox "exist:"+ DictItems(Counter) else 'msgbox "not exist:"+ DictItems(Counter) out3 = out3 + DictItems(Counter)&vbcrlf end if next 'write the sponsor name which not found in sponsor file to directory2 writeTxt directory2, out3 End Function '輸出文件 Function writeTxt(directory, content) dim fso set fso = CreateObject("Scripting.FileSystemObject") set f = fso.OpenTextFile(directory, 2, true) f.write(content) f.close set f = nothing set fso = nothing End Function
oWb1.Close
oWb2.Close
oWb3.Close
oExcel.Quit
set oExcel=nothing
set Dit1=nothing
set Dit2=nothinghtm
WScript.Quit(0)
經過這2個vbs就能夠到達需求的目的的,也能夠將他們放在一個vbs裏使用。