Solved

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

Posted on 2014-12-22
6
192 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 27

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 27

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
Are your AD admin tools letting you down?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
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 27

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

Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

Question has a verified solution.

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

In this previous article (https://oddytee.wordpress.com/2016/05/05/provision-new-office-365-user-and-mailbox-from-exchange-hybrid-via-powershell/), we made basic license assignments to users in O365. When I say basic, the method is the simplest way …
I thought I'd write this up for anyone who has a request to create an anonymous whistle-blower-type submission form created using SharePoint 2010 (this would probably work the same for 2013). It's not 100% fool-proof but it's as close as you can get…
This Micro Tutorial demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…

815 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

9 Experts available now in Live!

Get 1:1 Help Now