用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") = "[email protected]" ‘发件人账号
     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 "[email protected]", "[email protected]", "[email protected]", "提示邮件", "take action"

下面是解析excel的代码:

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=nothing

WScript.Quit(0)

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

时间: 2024-10-16 06:12:50

用VBS脚本发邮件的相关文章

zabbix监控利用Python脚本发邮件

最近实施了zabbix监控,开源软件杠杠的,甩nagios 好几条街-- 环境:centos6.6 + Zabbix 2.4.5 + Python 2.6.6 cd /usr/local/zabbix/share/zabbix/alertscripts #进入脚本存放目录vi SendAlertEmail.sh #编辑,添加以下代码#!/bin/shecho "$3" | mail -s "$2" $1:wq! #保存退出chown zabbix.zabbix /u

【VBS】发邮件

1 Sub SendMail(pMailFrom, pMailTo, pSubject, pMailBody, pMailSmtpServer) 2 On Error Resume Next 3 Dim objShell 4 Dim oMsg 5 6 Set objShell = CreateObject("Wscript.Shell") 7 Set oMsg = CreateObject("CDO.Message") 8 9 oMsg.From = pMailFr

【Python系列】Python自动发邮件脚本

缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月,看看效果再拓展吧. 脚本主要是通过Python写的,调的smtplib库,这些是基础,大家在网上一搜一大堆,今天主要给大家讲解下如何避免进入垃圾邮件系统,以及整个系统搭建时的一些思想.可能刚搞Python不久,有很多可能是错误的写法望大家提出来哈~ 配置 CentOS7.0系统 Python 3.4

python-发邮件脚本

折腾nagios发邮件好几天,终于完成,我的系统环境是ubuntu12.04,安装postfix服务,先贴上脚本,如下: #!/usr/bin/env python#-*- coding:utf-8 -*-''' from: 改成你的邮箱地址 '''import datetime,smtplib,string,sysfrom email.Header import Headerfrom email.MIMEText import MIMETextfrom email.MIMEMultipart

windws下发邮件vbs脚本

NameSpace = "http://schemas.microsoft.com/cdo/configuration/" Set Email = CreateObject("CDO.Message") Email.From = "[email protected]" Email.To = "[email protected],[email protected]" Email.Subject = "MySQL Bak

Blat-windows cmd命令行脚本SMTP模式发邮件的开源工具参数详细说明

blat工具可以在命令行下使用发邮件,所以可能被×××用来盗取计算机文件.所以(1)不建议安装部署到system32目录,也不要去设置环境变量: 建议自己编写的脚本与blat工具放在同一个目录即可:(2)此工具会被360等安全软件报毒,所以安装部署前要先受信文件夹:(3)英文本来源官网,中文版为理解学习对照 不保证翻译的准确性 syntax: Blat <filename> -to <recipient> [optional switches (see below)]Blat -i

vbs脚本实现qq定时发消息(初级)

vbs脚本实现QQ消息定时发送 目标 批处理又称为批处理脚本,强大的强大功能可以高效得实现很多功能,例如批量更改文件格式,批量进行文件读写,今天我们的目标是用vbs脚本编写可以发送qq消息的脚本,并利用c++程序,实现qq消息的定时自动发送 准备 记事本 vbs脚本不需要什么花里花哨的东西,记事本足矣 c++编译器 随便选一个就行 开工 编写vbs脚本 VBS是基于Visual Basic的脚本语言,功能还是很强的,当然我也只会一点点皮毛,因为工作需要,去学习了如何写发送QQ消息的脚本~ 新建一

脚本监控web服务器,工作不正常发邮件提醒

背景介绍公司有多个web网站,没有配置监控服务,每天都需要定时检查服务器是否工作正常.低效耗时. 代码片段 #!/bin/bash # Author Jerry.huang (Email:[email protected]) # Check web Server if [[ -z `curl -I -s "http://www.baidu.com" | grep "200 OK"` ]]; then echo "www.baidu.com server s

Mac下命令行发邮件【搭配php(shell_exec...)等脚本语言,轻松发邮件,告别各种依赖库】

用到的是msmtp,一个smtp客户端,比sendmail,postfix更加轻量.用自己的QQ邮箱(163...)发邮件的话,很适合. Mac下安装很简单,一句话:brew install msmtp 另外需要配置两个文件: ~/.mailrc: ~/.msmtp: 正式发送: 收到洛: PHP发送的话,用shell_exec之类的函数,就不用多说啦,命令当然支持更多的参数,详细可参考相关文档或者Terminal输msmtp --help查看.