Payton Flint's Tech Blog
Menu
  • Home
  • Blog
  • Categories
  • Resources
  • About
  • Contact
Menu

PowerShell – Send Email Notifications for VPN Connectivity Loss & Restoration

Posted on September 2, 2023September 2, 2023 by paytonflint

I’ve put together a simple script to perform a ping test against an endpoint across a VPN connection to confirm VPN connectivity. If the endpoint can’t be pinged, it sends an email notification to your desired internal email address. I’ve built in a notification interval so that you are not spammed with notification emails. And, once connection is restored, an email notification is sent as well.

Here is the GitHub link: https://github.com/p8nflnt/SysAdmin-Toolbox/blob/main/Test-VPN.ps1

And here is the script:

<#
.SYNOPSIS
    Send email notification upon failure and restoration of connectivity test to endpoint across VPN
    
.NOTES
    Name: Test-VPN
    Author: Payton Flint
    Version: 1.0
    DateCreated: 2023-Sep

.LINK
    https://github.com/p8nflnt/SysAdmin-Toolbox/blob/main/Test-VPN.ps1
#>

# Clear variables for repeatability
Get-Variable -Exclude PWD,*Preference | Remove-Variable -EA 0

# specify device on other side of tunnel (NetBIOS name recommended)
$endpoint = "<INSERT NAME>"

# specify ping frequency (in # of seconds)
$seconds = 300

# specify email notification frequency (in # of seconds)
$notifyFreq = 1800

# specify number attempts before notification
$attempts = 3

# Email notification parameters
$failParams = @{
    SmtpServer                 = '<INSERT SMTP SERVER>'
    Port                       = '25'
    UseSSL                     = $true   
    From                       = '<INSERT ADDRESS>'
    To                         = '<INSERT ADDRESS>'
    Subject                    = "FAILURE - VPN TEST - $(Get-Date -Format g)"
    Body                       = "VPN connection test from $env:COMPUTERNAME to $endpoint unsuccessful $(Get-Date -Format g)"
    DeliveryNotificationOption = 'OnFailure'#, 'OnSuccess'
    ErrorAction                = 'SilentlyContinue'
}

$restoredParams = @{
    SmtpServer                 = '<INSERT SMTP SERVER>'
    Port                       = '25'
    UseSSL                     = $true   
    From                       = '<INSERT ADDRESS>'
    To                         = '<INSERT ADDRESS>'
    Subject                    = "RESTORED - VPN TEST - $(Get-Date -Format g)"
    Body                       = "VPN connection from $env:COMPUTERNAME to $endpoint restored $(Get-Date -Format g)"
    DeliveryNotificationOption = 'OnFailure'#, 'OnSuccess'
    ErrorAction                = 'SilentlyContinue'
}

# infinite loop
While ($true) {
    # perform single, small, quiet ping of endpoint
    $Response = Test-Connection -ComputerName $endpoint -Count 1 -BufferSize 1 -Quiet

    # if pinging the endpoint is successful...
    If ($Response -eq $true) {
        Write-Host -ForegroundColor Green "Connection from $env:COMPUTERNAME to $endpoint successful   $(Get-Date -Format g)"

        # if in failure status, indicating connectivity restoration...
        If ($failure -eq $true) {
            Write-Host -ForegroundColor Green "Connection from $env:COMPUTERNAME to $endpoint restored     $(Get-Date -Format g)"
            # send email notification w/ above params
            Send-MailMessage @restoredParams
            Write-Host -ForegroundColor Green "Email notification sent"
            # get unix timestamp for email being sent
            $emailSent = [DateTimeOffset]::Now.ToUnixTimeSeconds()
            # determine time of next email notification
            $nextMail = $emailSent + $notifyFreq
            # reset failure status
            $failure = $null
        }

    # if not...
    } Else {
        # count up
        $count++
        Write-Host -ForegroundColor Red "Connection from $env:COMPUTERNAME to $endpoint unsuccessful $(Get-Date -Format g)"
        # if current unix time is ≥ the next mail notification time and attempt threshold has been reached...
        if (([DateTimeOffset]::Now.ToUnixTimeSeconds()) -ge $nextMail -and $count -ge $attempts) {
            # set failure status
            $failure = $true
            # send email notification w/ above params
            Send-MailMessage @failParams
            Write-Host -ForegroundColor Red "Email notification sent"
            # get unix timestamp for email being sent
            $emailSent = [DateTimeOffset]::Now.ToUnixTimeSeconds()
            # determine time of next email notification
            $nextMail = $emailSent + $notifyFreq
            # reset count
            $count = $null
        }
    }

    # wait number of seconds specified above
    Start-Sleep -Seconds $seconds
}

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

About The Author

Author's Portrait

In my journey as a technologist and 11 years of experience as an IT professional, I have found my niche as Director of Infrastructure Services; developing my skillsets in management, scripting, cloud infrastructure, identity management, and networking.

I have experience as a Systems Administrator and Engineer for large enterprises including the DoD, government agencies, and a nuclear-generation site.

I've been blessed to collaborate with engineers at esteemed Fortune 50 corporations, and one of Africa's largest, to ensure successful implementation of my work.

GitHub Button

Credentials

M365 Endpoint Administrator Associate
M365 Fundamentals
Microsoft AZ-900
CompTIA CSIS
CompTIA CIOS
CompTIA Security+
CompTIA Network+
CompTIA A+
  • April 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
© 2022 Payton Flint | The views and opinions expressed on this website belong solely to the author/owner and do not represent the perspectives of any individuals, institutions, or organizations, whether affiliated personally or professionally, unless explicitly stated otherwise. The content and products on this website are provided as-is with no warranties or guaranties, are for informational/demonstrative purposes only, do not constitute professional advice, and are not to be used maliciously. The author/owner is not responsible for any consequences arising from actions taken based on information provided on this website, nor from the use/misuse of products from this site. All trademarks are the property of their respective owners.