简单介绍

本文介绍如何利用微软的 CDO.MESSAGE 服务写一个简单的脚本用来监视多个 IP 的网络状况,当出现网络故障后自动发送邮件提醒。

脚本主要包含 3 个文件: IP.txt、RunMe.bat、SendMe.vbs。

目前的想法是,可以申请一个公共邮箱,然后设置转发规则,公共邮箱收到报警邮件后转发给相关人员,这样貌似比设置多个收件人要 好一点。

IP.txt

包含所有需要监视的 IP,每个 IP 占一行。

IP.txt
192.168.1.1
192.168.1.2
192.168.1.3

RunMe.bat

主程序,用来监视网络状况,当监测到 IP 无法 ping 通后调用 SendMe.vbs 发送邮件。为了防止过多占用网络资源, 采用循环执行的方法,并且每次执行脚本间隔 10s。以后有时间可以完善脚本,将故障原因分开列出。

@echo off
rem 删除中间文件
del timeout.txt

rem 利用for循环ping所有IP,ping不通则将IP输出到timeout.txt
for /f %%i in (IP.txt) do ping -n 2 %%i>nul||(
echo %%i 网络不通------%date% %time% >> timeout.txt
)

rem 如果timeout.txt存在那么调用SendMail.vbs发送邮件
if exist timeout.txt start SendMail.vbs

rem 将所有故障信息总结到total-timeout.txt
cat timeout.txt >> total-timeout.txt

rem 延迟10s防止发送邮件前timeout.txt被删除
ping 127.0.0.1 -n 10 > nul

rem 重新运行脚本
RunMe.bat

SendMe.vbs

用来连接微软服务器并发送邮件,需要在文件第一行依次填写:发信邮箱、邮箱密码、收信邮箱、标题、内容、附件。

注意:引号不可去除。附件需要填写绝对路径,多个附件在引号内用分号分隔。

a = SendMail("mailfrom@xxx.com", "password", "mailto@xxx.com", "网络故障报告", "详情见附件", "F:\timeout.txt")

Function SendMail(SendFrom,Password,SendTo,MailTopic,MailBody,MailAttachment)
    On error resume next
    MS_Space = "http://schemas.microsoft.com/cdo/configuration/"
    Set Email = CreateObject("CDO.Message")
    Email.BodyPart.Charset = "GBK"
    Email.From = SendFrom
    Email.To = SendTo
    Email.Subject = MailTopic
    Email.Htmlbody = MailBody
    If MailAttachment <> "" Then
        For i=0 to Ubound(Split(MailAttachment,";"))
            Email.AddAttachment Split(MailAttachment,";")(i)
        Next
    End If
    With Email.Configuration.Fields
        .Item(MS_Space&"sendusing") = 2
        .Item(MS_Space&"smtpserver") = "smtp."&Split(SendFrom,"@",-1, vbTextCompare)(1)
        .Item(MS_Space&"smtpserverport") = 25
        .Item(MS_Space&"smtpauthenticate") = 1
        .Item(MS_Space&"sendusername") =Split(SendFrom,"@",-1,vbTextCompare)(0)
        .Item(MS_Space&"sendpassword") = Password
        .Update
    End With
    Err.clear
    Email.Send
    If Err.number<>0 Then
        SendMail=False
    Else
        SendMail=True
    End If
    Set Email=Nothing
End Function