2013-07-03 22 views
3

我有很多網站來監視他們的上/下狀態,可能的錯誤,ping和其他事情,我設法得到一個腳本。我的想法如下:該腳本將與任務計劃程序一起運行,獲得結果並向我們(從SQA出版物)發送電子郵件。所以,我設法創建了成功的腳本,他獲得了我需要的所有內容,並在C:驅動器中生成了一個html文件。我的問題是,在得到結果後,發送電子郵件的功能不會發送電子郵件。我沒有收到任何錯誤消息,調試很好,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)Beeing我們的SMTP服務器使用 「587」 的端口。

+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

相關問題