【问题标题】:Send mail using VB Script?使用 VB 脚本发送邮件?
【发布时间】:2013-03-13 05:51:00
【问题描述】:

我有以下代码来监控驱动器。现在我为每个文件创建或删除事件获取 Echo。

有没有办法修改 WScript.Echo 以发送邮件通知?

strDrive = "c"
arrFolders(0) = strDrive & "\\\\"
 strComputer = "." 
 Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
 'Loop throught the array of folders setting up the monitor for Each 
 i = 0 
 For Each strFolder In arrFolders 
     'Create the event sink 
     strCommand = "Set EventSink" & i & " = WScript.CreateObject" & "(""WbemScripting.SWbemSink"", ""SINK" & i & "_"")" 
     ExecuteGlobal strCommand 
     'Setup Notification 
     strQuery = "SELECT * FROM __InstanceOperationEvent WITHIN 1 " & "WHERE Targetinstance ISA 'CIM_DirectoryContainsFile'" & " and TargetInstance.GroupComponent = " & "'Win32_Directory.Name=""" & strFolder & """'"
     strCommand = "objWMIservice.ExecNotificationQueryAsync EventSink" & i & ", strQuery"
     ExecuteGlobal strCommand 
     'Create the OnObjectReady Sub 
     strCommand = "Sub SINK" & i & "_OnObjectReady(objObject, " &  "objAsyncContext)" & VbCrLf & vbTab & "Wscript.Echo objObject.TargetInstance.PartComponent" & VbCrLf & "End Sub"
     WScript.Echo strCommand 
     ExecuteGlobal strCommand 
     i = i + 1 
 Next 
 WScript.Echo "Waiting for events..." 

 i = 0 
 While (True) 
     Wscript.Sleep(1000) 
 Wend

而不是像下面这样回显:

strCommand = "Sub SINK" & i & "_OnObjectReady(objObject, " &  "objAsyncContext)" & VbCrLf & vbTab & "Wscript.Echo objObject.TargetInstance.PartComponent" & VbCrLf & "End Sub"

我想发送这样的邮件:

strCommand = "Sub SINK" & i & "_OnObjectReady(objObject, " &  "objAsyncContext)" & VbCrLf & vbTab & "

Set outobj = CreateObject("Outlook.Application")
    Set mailobj = outobj.CreateItem(0)
    With mailobj
        .To = toAddress
        .Subject = Subject
        .HTMLBody = strHTML
        .Send
    End With

" & VbCrLf & "End Sub"

是否有可能或有其他方法可以做到这一点..?

【问题讨论】:

    标签: scripting vbscript wmi wmi-query


    【解决方案1】:

    我不知道您使用什么服务器,但在 Windows 2003 和 2008 上,例如您可以使用 CDO 对象来创建电子邮件。您可以使用智能主机将您的电子邮件发送到。

    查看此链接:http://www.paulsadowski.com/wsh/cdo.htm

    您还可以选择任何免费的电子邮件组件来创建电子邮件并使用 smtp 服务器发送您的电子邮件。或者查看这里您可以使用组件的位置,包括许多示例:http://www.chilkatsoft.com/email-activex.asp

    ** 已更新 **

    此脚本会根据您的要求检查并发送电子邮件:

    strDrive = "d:"
    Dim arrFolders(0) : arrFolders(0) = strDrive & "\\\\"
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
    'Loop throught the array of folders setting up the monitor for Each 
    i = 0 
    For Each strFolder In arrFolders 
      'Create the event sink 
      WScript.Echo "setup for folder: " & strFolder & vbLf
      strCommand = "Set EventSink" & i & " = WScript.CreateObject" & "(""WbemScripting.SWbemSink"", ""SINK" & i & "_"")" 
      ExecuteGlobal strCommand
      'Setup Notification 
      strQuery = "SELECT * " _
              & "FROM __InstanceOperationEvent " _
              & "WITHIN 1 " _
              & "WHERE Targetinstance ISA 'CIM_DirectoryContainsFile'" _
              & "  AND TargetInstance.GroupComponent = " & "'Win32_Directory.Name=""" & strFolder & """'"
      strCommand = "objWMIservice.ExecNotificationQueryAsync EventSink" & i & ", strQuery"
      ExecuteGlobal strCommand 
      'Create the OnObjectReady Sub 
      strCommand = "Sub SINK" & i & "_OnObjectReady(objObject, " &  "objAsyncContext)" & vbLf _
                & "  Wscript.Echo objObject.TargetInstance.PartComponent" & vbLf _
                & "  SendMail(objObject.TargetInstance.PartComponent)" & vbLf _
                & "End Sub"
      'WScript.Echo strCommand 
      ExecuteGlobal strCommand 
      i = i + 1 
    Next 
    
    WScript.Echo "Waiting for events..." 
    i = 0 
    While (True) 
      Wscript.Sleep(1000) 
    Wend
    
    Function SendMail(vBody)
    
      Dim oMail : Set oMail = CreateObject("CDO.Message")
    
      'Name or IP of Remote SMTP Server
      oMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
      oMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "your.smtp.server"
      oMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 
      oMail.Configuration.Fields.Update
    
      oMail.Subject = "Email Watch Info Message"
      oMail.From = "alert@yourdomain.net"
      oMail.To = "target@yourdomain.net"
      oMail.TextBody = vBody
      oMail.Send
    
    End Function
    

    更正发送邮件功能中的设置,你就没事了。

    【讨论】:

    • 如果你想创建一个程序实例来使用它,你需要在你的服务器上安装 Outlook。但是为了什么? CDO 甚至可以为所欲为。
    • @GokulNath 您是否有权访问 SMTP 中继服务器,或者您要发送邮件的电子邮件是您的 Exchange 帐户吗?我可以给您写一个示例,但请先告诉我您使用的是什么环境。
    • @GokulNath 是否如您所愿?如果您不标记答案,您的赏金就会下降:)
    • 我没有时间去看看。无论如何,我会接受这个作为答案。稍后会尝试。
    • 我在我的服务器上运行脚本,它按预期向我发送了一封电子邮件。如果您想添加更多答案,您只需要修改设置和正文。
    【解决方案2】:

    理论上,VBSendMail DLL 应该可以做你想做的事。

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 2013-12-22
      • 2015-10-14
      • 2012-09-16
      • 2014-09-20
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多