Solved

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

Posted on 2014-12-22
6
188 Views
Last Modified: 2015-02-18
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
Comment
Question by:Network Zero
  • 3
  • 2
6 Comments
 
LVL 26

Expert Comment

by:Dan McFadden
ID: 40514521
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
 
LVL 26

Accepted Solution

by:
Dan McFadden earned 333 total points
ID: 40514526
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
 
LVL 10

Assisted Solution

by:Michael Ian Claridge
Michael Ian Claridge earned 167 total points
ID: 40515440
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
Does Powershell have you tied up in knots?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
LVL 7

Author Comment

by:Network Zero
ID: 40515925
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
 
LVL 26

Assisted Solution

by:Dan McFadden
Dan McFadden earned 333 total points
ID: 40516124
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
 
LVL 7

Author Comment

by:Network Zero
ID: 40517146
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

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This script checks a path to see if a folder exists. If the folder does exist you will get output "The folder has previously been created. No action taken" If not it will create the folder. Then adds one user modify permission to the folder. It …
A brief introduction to what I consider to be the best editor for PowerShell.
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.
A short film showing how OnPage and Connectwise integration works.

947 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now