2013-07-03 3 views
3

У меня есть много сайтов для мониторинга их состояния вверх/вниз, возможных ошибок, пинга и других вещей, которые мне удалось получить со сценарием. Моя идея такова: этот скрипт будет запускаться с планировщиком задач, получать результаты и отправлять нам (из публикаций SQA) электронное письмо. Итак, мне удалось создать сценарий с успехом, он получает все, что мне нужно, и генерирует html-файл на диске C :. Моя проблема в том, что после получения результата функция, отправляющая электронное письмо, не отправляет электронное письмо. Я не получаю сообщений об ошибках, отладка в порядке, SMTP и все конфигурации верны. Но он не отправит электронное письмо с прикрепленным файлом html!Скрипт Powershell для мониторинга состояния и отправки результатов электронной почты

Код это:

$URLListFile = "C:\URLList.txt" 
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue 
    $Result = @() 


    Foreach($Uri in $URLList) { 
    $time = try{ 
    $request = $null 

    $result1 = Measure-Command { $request = Invoke-WebRequest -Uri $uri } 
    $result1.TotalMilliSeconds 
    } 
    catch 
    { 

    $request = $_.Exception.Response 
    $time = -1 
    } 
    $result += [PSCustomObject] @{ 
    Time = Get-Date; 
    Uri = $uri; 
    StatusCode = [int] $request.StatusCode; 
    StatusDescription = $request.StatusDescription; 
    ResponseLength = $request.RawContentLength; 
    TimeTaken = $time; 
    } 

} 

if($result -ne $null) 
{ 
    $Outputreport = "<HTML><TITLE>Website Report Status</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Report Status </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B></TD><TD><B> Code </B></TD><TD><B> Status </B></TD><TD><B> Duration </B></TD><TD><B> MS (Ping) </B></TD</TR>" 
    Foreach($Entry in $Result) 
    { 
     if($Entry.StatusCode -ne "200") 
     { 
      $Outputreport += "<TR bgcolor=red>" 
     } 
     else 
     { 
      $Outputreport += "<TR>" 
     } 
     $Outputreport += "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD><TD align=center>$($Entry.StatusDescription)</TD><TD align=center>$($Entry.ResponseLength)</TD><TD align=center>$($Entry.timetaken)</TD></TR>" 
    } 
    $Outputreport += "</Table></BODY></HTML>" 
} 

$Outputreport | out-file C:\URLReport.htm 
Invoke-Expression C:\URLReport.htm 


$EmailFrom = "[email protected]" 
$EmailTo = "[email protected]" 
$EmailSubject = "URL Report" 
$emailbody = " body message " 
$SMTPServer = "smtpserver.company.com" 

$emailattachment = "C:\URLReport.htm" 

function send_email { 
$mailmessage = New-Object system.net.mail.mailmessage 
$mailmessage.from = ($emailfrom) 
$mailmessage.To.add($emailto) 
$mailmessage.Subject = $emailsubject 
$mailmessage.Body = $emailbody 

$attachment = New-Object System.Net.Mail.Attachment($emailattachment, 'html') 
    $mailmessage.Attachments.Add($attachment) 


$mailmessage.IsBodyHTML = $true 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.Send($mailmessage) 
} 

EDIT4:> ($ SmtpServer, 587) неоспоримым "587" порт, который использует наш SMTP-сервер.

+0

Необходимо объяснить, что «не отправляет». Во-первых, вы не вызываете 'send_email', что является препятствием для отправки электронной почты. Любые сообщения об ошибках? Кроме того, есть продукты (некоторые бесплатные, некоторые не бесплатные), которые выполняют мониторинг сайта. Почему бы не использовать один из них вместо того, чтобы кататься самостоятельно? – alroc

+0

Вы пытались использовать существующий Send-MailMessage? – Jimbo

+0

Он просто не отправит электронное письмо, он выполнит первую часть скрипта и похоже, что он не выполнит часть «отправки по электронной почте». О «send_email» я исправил, отсутствовала часть скрипта. Дело в том, что моя компания не использует другие программные продукты, и они не будут платить за лицензию на это программное обеспечение. Кроме того, мой босс попросил меня написать эту книгу, и я использую ее как способ продолжить изучение powershell. – InLoveWithPs1

ответ

8

Поскольку вы используете Powershell v3, вы должны использовать Send-MailMessage вместо того, чтобы иметь дело с System.Net.

$URLListFile = "C:\URLList.txt" 
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue 
    $Result = @() 


    Foreach($Uri in $URLList) { 
    $time = try{ 
    $request = $null 

    $result1 = Measure-Command { $request = Invoke-WebRequest -Uri $uri } 
    $result1.TotalMilliSeconds 
    } 
    catch 
    { 

    $request = $_.Exception.Response 
    $time = -1 
    } 
    $result += [PSCustomObject] @{ 
    Time = Get-Date; 
    Uri = $uri; 
    StatusCode = [int] $request.StatusCode; 
    StatusDescription = $request.StatusDescription; 
    ResponseLength = $request.RawContentLength; 
    TimeTaken = $time; 
    } 

} 

if($result -ne $null) 
{ 
    $Outputreport = "<HTML><TITLE>Website Report Status</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Report Status </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B></TD><TD><B> Code </B></TD><TD><B> Status </B></TD><TD><B> Duration </B></TD><TD><B> MS (Ping) </B></TD</TR>" 
    Foreach($Entry in $Result) 
    { 
     if($Entry.StatusCode -ne "200") 
     { 
      $Outputreport += "<TR bgcolor=red>" 
     } 
     else 
     { 
      $Outputreport += "<TR>" 
     } 
     $Outputreport += "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD><TD align=center>$($Entry.StatusDescription)</TD><TD align=center>$($Entry.ResponseLength)</TD><TD align=center>$($Entry.timetaken)</TD></TR>" 
    } 
    $Outputreport += "</Table></BODY></HTML>" 
} 

$Outputreport | out-file C:\URLReport.htm 
Invoke-Item C:\URLReport.htm 

$EmailFrom = "[email protected]" 
$EmailTo = "[email protected]" 
$EmailSubject = "URL Report" 
$emailbody = " body message " 
$SMTPServer = "smtpserver.company.com" 

$emailattachment = "C:\URLReport.htm" 

Send-MailMessage -Port 587 -SmtpServer $SMTPServer -From $EmailFrom -To $EmailTo -Attachments $emailattachment -Subject $EmailSubject -Body $emailbody -Bodyashtml; 
+0

Это сработало отлично, спасибо. Я не знал об этой функции «Send-MailMessage». Вы, сэр, мне очень помогли. Большое спасибо ! :) – InLoveWithPs1

Смежные вопросы