用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") = '使用网络上的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") = '邮件服务器端口
cdoConf.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = '服务器认证方式
cdoConf.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx@126.com" '发件人账号
cdoConf.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "" '发件人登陆邮箱密码
cdoConf.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = '连接服务器的超时时间
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") =
cdoMail.Fields.Item("urn:schemas:httpmail:importance") =
cdoMail.Fields.Update '发送邮件
dim sleepSeconds
sleepSeconds =
cdoMail.Send
WScript.Sleep( * 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:\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= to row
varacc=oSheet.cells(i,colAccount)
varama=CStr(oSheet.cells(i,colAcctMgrAction))
if (instr(varacc,strFilter)=) then
temp = temp + varacc +"&"+varama+","
end if
Next
dim j,spit, tmp
spit=split(temp,",")
for j= to ubound(spit)-
tmp = split(spit(j),"&")
if tmp() = Empty or tmp() = "" or IsNull(tmp()) then
getExpireAcc = getExpireAcc + tmp() + "_"
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= to roww
for n= to ubound(expacc)-
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 = To Dict.Count -
for k= 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 = To Dict.Count -
if instr(out2,trim(DictItems(Counter)))> 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, , 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里使用。
用VBS脚本发邮件的更多相关文章
- 【VBS】发邮件
Sub SendMail(pMailFrom, pMailTo, pSubject, pMailBody, pMailSmtpServer) On Error Resume Next Dim objS ...
- python smtp 发邮件 添加附件
# -*- coding:utf-8 -*- # __author__ = 'justing' import os import smtplib from email.mime.multipart i ...
- [转]简单三步,用 Python 发邮件
https://zhuanlan.zhihu.com/p/24180606 0. 前言 发送电子邮件是个很常见的开发需求.比如你写了个监控天气的脚本,发现第二天要下雨,或者网站上关注的某个商品降价了, ...
- SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享
SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...
- 【Python系列】Python自动发邮件脚本-html邮件内容
缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月, ...
- vbs脚本实现qq定时发消息(初级)
vbs脚本实现QQ消息定时发送 目标 批处理又称为批处理脚本,强大的强大功能可以高效得实现很多功能,例如批量更改文件格式,批量进行文件读写,今天我们的目标是用vbs脚本编写可以发送qq消息的脚本,并利 ...
- Windows下bat脚本自动发邮件
摘要:说明:很多木马会利用自身的程序截取系统敏感文件或信息发往指定的邮箱,而blat并不是木马,它小巧却有强大的发邮件功能,可不要用它做违法事,感觉和木马功能有一拼!下面先看个具体的实例(在blat同 ...
- #题目:有10 台被监控主机、一台监控机,在监控机上编写脚本,一旦某台被监控机器/ 分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次
#题目:有10 台被监控主机.一台监控机,在监控机上编写脚本,一旦某台被监控机器/ 分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次 #测试机器:虚拟机Linux ...
- 发邮件的python脚本
1. 编写一个最简单的发邮件的python脚本 #coding: utf-8 import smtplib from email.mime.text import MIMEText from em ...
随机推荐
- 220 DIV2 B. Inna and Nine
220 DIV2 B. Inna and Nine input 369727 output 2 input 123456789987654321 output 1 题意:比如例子1:369727--& ...
- *[codility]AscendingPaths
https://codility.com/programmers/challenges/magnesium2014 图形上的DP,先按照路径长度排序,然后依次遍历,状态是使用到当前路径为止的情况:每个 ...
- [Unity菜鸟] 射线
1. 射线用 Physics.Raycast 都可以判断,用 collider.Raycast 只在某些(不明)情况下可以 void Update() { Ray ray = Camera.main. ...
- 使用 Spring 3 来创建 RESTful Web Services(转)
使用 Spring 3 来创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参 ...
- 239. Sliding Window Maximum
题目: Given an array nums, there is a sliding window of size k which is moving from the very left of t ...
- jQuery选择器最佳实践--来自jQ官网
1.基于ID选择器进行查询,并且使用find方法. //快速 $("#container div.footer"); //超快 $("#container"). ...
- kail新手安装
Kali Linux下载链接:http://mirrors.ustc.edu.cn/kali-images/kali-2.0/ (ps:建议用国内镜像源下载,速度有保证) Kali Linux安装之后 ...
- Dozer应用——类之间值的映射
1. Mappings via Annotation public class SourceBean { private Long id; private String name; @Mapping( ...
- Hadoop集群(第7期)_Eclipse开发环境设置
1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...
- MasterPage的自身Bug还是?
如果不想每个页面都设置css样式,那就在MasterPage设置即可,但是有个问题就是路径并不能识别正确,所以必须让你的页面和MasterPage的页面在平级的位置. 例如MasterPage.mas ...