Solved

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

Posted on 2014-12-22
6
198 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 28

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 28

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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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 28

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

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

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

Windows 10 came with  a lot of built in applications, Some organisations leave them there, some will control them using GPO's. This Article is useful for those who do not want to have any applications in their image (example:me).
A project that enables an administrator to perform actions within a user session context not just at the time of login but any time later on day(s) or week(s) later.
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…

710 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