【问题标题】:Send email once if ping fails如果 ping 失败,请发送一次电子邮件
【发布时间】:2017-05-09 00:08:58
【问题描述】:

我正在使用 VB.net 创建一个监控系统。我希望系统在设备出现故障时发送电子邮件,并在该设备恢复在线时再次发送电子邮件。我使用 Ping 来监控设备。设备的 IP 地址已保存,将显示在lvi.SubItems(5).Text 中。

使用以下代码,如果设备 ping 失败,则始终发送电子邮件。如果 ping 失败,我只想发送一次电子邮件。你能帮我解决这个问题吗?

Private Sub Ping_LV()
    For Each lvi As ListViewItem In LV_Monitoring.Items
        Dim p As New Ping
        AddHandler p.PingCompleted, AddressOf p_PingCompleted
        p.SendAsync(lvi.SubItems(5).Text, lvi)
    Next
End Sub

Private Sub p_PingCompleted(ByVal sender As Object, ByVal e As System.Net.NetworkInformation.PingCompletedEventArgs)
    Dim p As Ping = DirectCast(sender, Ping)
    Dim lvi As ListViewItem = DirectCast(e.UserState, ListViewItem)

    If e.Reply.Status = IPStatus.Success Then
        Console.WriteLine("Ping Success")
        lvi.SubItems(6).Text = "UP"
        lvi.UseItemStyleForSubItems = False
        lvi.SubItems(6).ForeColor = Color.White
        lvi.SubItems(6).BackColor = Color.Green
    Else
        Console.WriteLine("Ping Failed")
        lvi.SubItems(6).Text = "DOWN"
        lvi.UseItemStyleForSubItems = False
        lvi.SubItems(6).ForeColor = Color.White
        lvi.SubItems(6).BackColor = Color.Red
        Sent_Email()
    End If

    RemoveHandler p.PingCompleted, AddressOf p_PingCompleted
    p.Dispose()
    LV_Monitoring.Refresh()

End Sub

Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick
    Ping_LV()
End Sub

Private Sub Form_Monitoring_Devices_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Timer.Start()
End Sub

【问题讨论】:

  • 您可以测试该项目的当前Text,并且仅在它不是“DOWN”时才发送通知。不过,我可能更愿意使用专用的布尔标志,您可以将其存储在项目的 Tag 中。
  • 我不太明白,你想给我看一下那个案例的示例代码吗?

标签: vb.net email monitoring ping


【解决方案1】:

简单的方法就是将已发送邮件的状态保存在变量或属性中。 因此,第一次 ping 失败并发送电子邮件时,您将变量/属性设置为 true,当您的电脑再次联机时,您将其重置。如果您希望使用集合来跟踪这一点,也可以使用例如字典。

根据要求举例:

    Dim mailSent As New Dictionary(Of String, Boolean)
Dim ipList As New List(Of String) From {"192.168.192.1", "192.168.192.110", "192.168.192.105"}

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each ip In ipList
        Dim p As New Ping
        AddHandler p.PingCompleted, AddressOf PingCompleted
        p.SendAsync(ip, ip)
    Next
End Sub

Private Sub PingCompleted(sender As Object, e As PingCompletedEventArgs)
    Dim p = DirectCast(sender, Ping)
    Dim ip = DirectCast(e.UserState, String)

    If e.Reply.Status = IPStatus.Success Then
        If mailSent.Item(ip) Then
            mailSent.Item(ip) = False
        End If
    Else
        If Not mailSent.Item(ip) Then
            Console.WriteLine(ip & " is offline")
            mailSent.Item(ip) = True
        Else
            Console.WriteLine("You know already " & ip & "state")
        End If
    End If
    RemoveHandler p.PingCompleted, AddressOf PingCompleted
    p.Dispose()
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    For Each ip As String In ipList
        mailSent.Add(ip, False)
    Next
End Sub

这是一个示例,你应该努力得到你需要的东西:)

【讨论】:

  • 你想给我看一下这个案例的示例代码吗?因为我之前尝试过这样做,所以如果 Ping 在 1 台 PC 或 IP 地址上失败,它会工作,一旦 ping 失败,它将发送一封电子邮件。但是如果之后第二台 PC 出现故障,它就不会发送电子邮件。
  • 添加示例,它不是您需要的 1:1,但您应该了解您可以做什么。
  • 哇,非常感谢兄弟,我试过了,它成功了。
猜你喜欢
  • 2016-08-20
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多