zoukankan      html  css  js  c++  java
  • 用VBS脚本发邮件

    需求是这样的:针对账号的管理,如果发现该账号的管理员给账号加了批注,(比如要过期,修改密码,完善资料等),就需要找到这样的账号及其管理的邮件,然后发邮件给他们的管理员同时抄送给账号以达到提醒的目的。那么我们的实际项目中是这样管理的:

    有三个表,第一张表用来存放账号的所有信息,以及这个账号的备注,第二张表存放了账号信息以及他的管理员的名字等信息,第三张表就存放管理的信息以及管理员的邮件地址。都是excel表

    思路是这样:首先在表一里找到所有备注栏不为空的账号,然后把这些账号拿到第二张表里去搜索,如果找到了就继续找出它对应的管理的名字,最后吧得到的管理员的名字拿到第三张表去搜索找到它的邮件地址,同时也需要把账号和管理员邮件记录下来。

    最后使用系统用户发邮件给所有的管理员,正文里就列出这些要做修改的账号的基本信息。

    其实这里就有2部分,第一部分主要是excel的处理,这一块应该不复杂,我会直接贴出代码,这里主要说明第二部分,就是邮件的发送。

    CDO.Message

    想通过vbs脚本来发邮件,就需要用到CDO.Message这个对象,然后配置它的属性,比如邮件服务器,端口,认证方式,账号密码等,同时也可以对邮件本身的属性做设置,比如邮件紧急度,乱码等。下面是代码:

    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

    然后就可以调用它来发邮件了

    sendEmail "xxx@126.com", "zzz@qq.com", "yyy@qq.com", "提示邮件", "take action"

    下面是解析excel的代码:

    Set oExcel= CreateObject("Excel.Application")
    
    Set oWb1 = oExcel.Workbooks.Open("E:BluecareAA team115531US-NiS3.20150909150006Copy.csv")
    Set oSheetUSNi = oWb1.Sheets("US-NiS3.20150909150006Copy")
    
    Set oWb2 = oExcel.Workbooks.Open("E:BluecareAA team115531IBM Monthly Report.xlsx")
    Set oSheetIMR = oWb2.Sheets("Sheet1")
    
    Set oWb3 = oExcel.Workbooks.Open("E:BluecareAA team115531Sponsor 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=nothing

    WScript.Quit(0)

    通过这2个vbs就可以到达需求的目的的,也可以将他们放在一个vbs里使用。

  • 相关阅读:
    C#的默认访问权限
    隐藏基类成员
    索引指示器的重载
    索引指示器
    vector
    string 函数
    细胞个数
    计蒜客 T1096 石头剪刀布
    计蒜客 T1125 判断字符串是否为回文
    计蒜客 T1152 成绩排序
  • 原文地址:https://www.cnblogs.com/jingwei/p/4877513.html
Copyright © 2011-2022 走看看