Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 228
  • Last Modified:

powershell wont send email + I want to add a screenshot every 30 seconds saved to a folder

I'm trying to get this code to send out an email and also take a snap shoot - I haven't figured out the screenshot part the code works but wont send an email - I tried fixing the smtp but I still get nothing.

I also wanted to see if I can add a screenshot every 30 seconds to the code.



powershell.exe -noexit -command ". C:\Users\example\Documents\Online.ps1; start-monitor PC,Server1"



function Start-Monitor {
       
      #Requires -Version 2.0            
      [CmdletBinding()]            
      Param              
      (                        
            [Parameter(Position=0,                          
                       ValueFromPipeline=$true,            
                       ValueFromPipelineByPropertyName=$true)]
            [String[]]$ComputerName = $env:COMPUTERNAME,        
             
            # Switch to Enable Email Notifications on First Down
            [Switch]$notifyonServerDown,
             
            # Switch to Enable Email Notifications on Server Online
            [Switch]$notifyonServerBackOnline,
             
            # Switch to Enable Email Notifications on MaxOutageCount
            [Switch]$notifyonMaxOutageCount,
             
            # Switch to Enable all notifications
            [Switch]$notifyAll,
 
            # specify the time you want email notifications resent for hosts that are down
            $EmailTimeOut = 30,
            # specify the time you want to cycle through your host lists.
            $SleepTimeOut = 30,
            # specify the maximum hosts that can be down before the script is aborted
            $MaxOutageCount = 100,
             
            # specify who gets notified  
            $tonotification = @("email@gmail.com"),  
            # specify where the notifications come from  
            $fromnotification = ("email@gmail.com"),  
            # specify the SMTP server  
            $smtpserver = "smtp-relay.gmail.com",
            # reset the lists of hosts prior to looping
            $OutageHosts = @()            
      )#End Param
 
 # Use end block, to ensure all computers are read in at once, even by pipeline      
 end {      
      if ($notifyAll)
      {
            $notifyonMaxOutageCount,$notifyonServerBackOnline,$notifyonServerDown =  $True,$True,$True
      }
 
      Write-Verbose -Message "computername: $computername"
      Write-Verbose -Message "notifyonMaxOutageCount: $notifyonMaxOutageCount"
      Write-Verbose -Message "notifyonServerBackOnline: $notifyonServerBackOnline"
      Write-Verbose -Message "notifyonServerDown: $notifyonServerDown"
 
      # Allow
      if ( $Input )
      {
            Write-Verbose -Message "Input: $Input"
            $ComputerName = $Input
      }
       
      # start looping here
      Do{
            $available = @()
            $notavailable = @()
            Write-Host (Get-Date)
             
            # Read the File with the Hosts every cycle, this way to can add/remove hosts
            # from the list without touching the script/scheduled task,  
            # also hash/comment (#) out any hosts that are going for maintenance or are down.
            $ComputerName | Where-Object {!($_ -match "#")} |  
            #"test1","test2" | Where-Object {!($_ -match "#")} |
            ForEach-Object {
                  if(Test-Connection -ComputerName $_ -Count 1 -ea silentlycontinue)
                  {
                        # if the Host is available then write it to the screen
                        write-host "Available host ---> "$_ -BackgroundColor Green -ForegroundColor White
                        [String[]]$available += $_
                         
                        # if the Host was out and is now backonline, remove it from the OutageHosts list
                        if ($OutageHosts -ne $Null)
                        {
                              if ($OutageHosts.ContainsKey($_))
                              {
                                    $OutageHosts.Remove($_)
                                    $Now = Get-date
                                    if ($notifyonServerBackOnline)
                                    {
                                          $Body = "$_ is back online at $Now"
                                          Send-MailMessage -Body "$body" -to $tonotification -from $fromnotification `
                                          -Subject "Host $_ is up" -SmtpServer $smtpserver
                                    }
                                     
                              }
                        }  
                  }
                  else
                  {
                        # If the host is unavailable, give a warning to screen
                        write-host "Unavailable host ------------> "$_ -BackgroundColor Magenta -ForegroundColor White
                        if(!(Test-Connection -ComputerName $_ -Count 2 -ea silentlycontinue))
                        {
                              # If the host is still unavailable for 4 full pings, write error and send email
                              write-host "Unavailable host ------------> "$_ -BackgroundColor Magenta -ForegroundColor White
                              [Array]$notavailable += $_
                               
                              if ($OutageHosts -ne $Null)
                              {
                                    if (!$OutageHosts.ContainsKey($_))
                                    {
                                          # First time down add to the list and send email
                                          Write-Host "$_ Is not in the OutageHosts list, first time down"
                                          $OutageHosts.Add($_,(get-date))
                                          $Now = Get-date
                                          if ($notifyonServerDown)
                                          {
                                                $Body = "$_ has not responded for 5 pings at $Now"
                                                Send-MailMessage -Body "$body" -to $tonotification -from $fromnotification `
                                                -Subject "Host $_ is down" -SmtpServer $smtpserver
                                          }
                                    }
                                    else
                                    {
                                          # If the host is in the list do nothing for 1 hour and then remove from the list.
                                          Write-Host "$_ Is in the OutageHosts list"
                                          if (((Get-Date) - $OutageHosts.Item($_)).TotalMinutes -gt $EmailTimeOut)
                                          {$OutageHosts.Remove($_)}
                                    }
                              }
                              else
                              {
                                    # First time down create the list and send email
                                    Write-Host "Adding $_ to OutageHosts."
                                    $OutageHosts = @{$_=(get-date)}
                                    $Now = Get-date
                                    if ($notifyonServerDown)
                                    {
                                          $Body = "$_ has not responded for 5 pings at $Now"
                                          Send-MailMessage -Body "$body" -to $tonotification -from $fromnotification `
                                          -Subject "Host $_ is down" -SmtpServer $smtpserver
                                    }
                              }  
                        }
                  }
            }
            # Report to screen the details
            Write-Host "Available count:"$available.count
            Write-Host "Not available count:"$notavailable.count
            if ($OutageHosts)
            {
                  Write-Host "Not available hosts:"
                  $OutageHosts
            }
            Write-Host "" 
            Write-Host "Sleeping $SleepTimeOut seconds"
            Start-Sleep -Seconds $SleepTimeOut
            if ($OutageHosts.Count -gt $MaxOutageCount)
            {
                  # If there are more than a certain number of host down in an hour abort the script.
                  $Exit = $True
                  $body = $OutageHosts | Out-String
                   
                  if ($notifyonMaxOutageCount)
                  {
                        Send-MailMessage -Body "$body" -to $tonotification -from $fromnotification `
                        -Subject "More than $MaxOutageCount Hosts down, monitoring aborted" -SmtpServer $smtpServer
                  }
            }
      }
      while ($Exit -ne $True)
}#End      
}#Start-Monitor
0
Network Zero
Asked:
Network Zero
  • 3
  • 2
3 Solutions
 
Dan McFaddenSystems EngineerCommented:
Are you getting an error message when sending?  Have you tried a simple "Send-MailMessage" to test?

Can you look into the SMTP logs and see if there is any helpful info?

Dan
0
 
Dan McFaddenSystems EngineerCommented:
Can you try this as a test (update corresponding From, To and SmtpServer variables):

Send-MailMessage -from "test@your-domain.com" -to "me@my-domain.com" -subject "Test from PS" -body "Test from PowerShell" -SmtpServer mail.my-domain.com

Open in new window


Do you receive an email with this command?

Dan
0
 
Michael Ian ClaridgeCommented:
Hello,

I can't see any authentication information in this code to allow relay via Google's Service. What authentication have you configured? If its IP based ensure its the external facing IP of your network and not a NAT'd internal one. You can follow Dan's suggestion to see if email messages can relay, if not its likely to be an authentication problem.

I have added a link below regarding SMTP Relay via Google's service if you haven't as of yet read it.

https://support.google.com/a/answer/2956491?hl=en

Regards

Michael Ian Claridge
0
New Tabletop Appliances Blow Competitors Away!

WatchGuard’s new T15, T35 and T55 tabletop UTMs provide the highest-performing security inspection in their class, allowing users at small offices, home offices and distributed enterprises to experience blazing-fast Internet speeds without sacrificing enterprise-grade security.

 
Network ZeroCloud Engineer Author Commented:
Below I have this code that works, how do I integrate this code to my current code and take a screenshot.

I put the output of the code below it gave me an error


##############################################################################$From = "YourEmail@gmail.com"$To = "email@gmail.com"$Cc = "email@gmail.com"$Attachment = "C:\1.txt"$Subject = "test"$Body = "This is a test"$SMTPServer = "smtp.gmail.com"$SMTPPort = "587"

Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl `
-Credential (Get-Credential) -Attachments $Attachment

##############################################################################



The error I get is below:


Send-MailMessage : Unable to connect to the remote server
At line:1 char:1
+ Send-MailMessage -from "email@gmail.com" -to "email@gmail.com" -s ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpExcept
   ion
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage
0
 
Dan McFaddenSystems EngineerCommented:
The code above is correct.  The probable issue is that you are using the wrong host name for the smtp server.

according to the article Michael posted, point 12 states:


12.  Configure your on-premise outbound mail server to point to smtp-relay.gmail.com on port 25, port 465, or port 587. See the sections below for instructions on completing this step for specific mail servers.

I would try updating the SMTPServer variable and try again.

Dan
0
 
Network ZeroCloud Engineer Author Commented:
The problem is this code was written with powershell 2.0 and it does not take in consideration the port  also Gmail requires authentication - if I was doing this from domain I wouldn't have any issues.

     # specify who gets notified  
            $tonotification = @("email@gmail.com"),  
            # specify where the notifications come from  
            $fromnotification = ("email@gmail.com"),  
            # specify the SMTP server  
            $smtpserver = "smtp-relay.gmail.com",
            # reset the lists of hosts prior to looping
            $OutageHosts = @()            
      )#End Param

- This is the part with the issue.
0

Featured Post

What is SQL Server and how does it work?

The purpose of this paper is to provide you background on SQL Server. It’s your self-study guide for learning fundamentals. It includes both the history of SQL and its technical basics. Concepts and definitions will form the solid foundation of your future DBA expertise.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now