【问题标题】:Why my Powershell script doesnt work?为什么我的 Powershell 脚本不起作用?
【发布时间】:2016-05-30 19:18:29
【问题描述】:

我创建了用于检查 VPN 连接是否断开并尝试重新连接的脚本。它还发送电子邮件,当 1) 无法用远程 LAN 地址 ping VPN 服务器 2) VPN 连接失败 3) VPN 连接建立。

第一封电子邮件已正确发送和接收,但当 Powershell 必须发送另一封电子邮件时,它会出错。

vpn.ps1 文件内的代码:

$ip = "*.*.*.*"
$result = Get-WmiObject -Query "SELECT * FROM Win32_PingStatus WHERE Address = '$ip'"

if($result.StatusCode -eq 0) {

} else {
    Start-Sleep -s 15

    $EmailFrom = "*@*.*"
    $EmailTo = "*@*.*" 
    $Subject = "###" 
    $Body = "#####################################################"

    $SMTPServer = "*.*.*.*" 
    $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, ***)
    #$SMTPClient.EnableSsl = $true 
    $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("*@*.*", "*************");
    $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

    rasdial.exe ********** /DISCONNECT    
    rasdial.exe ******** ****** ******

    Start-Sleep -Seconds 15

    $ip = "*.*.*.*"
    $result = Get-WmiObject -Query "SELECT * FROM Win32_PingStatus WHERE Address = '$ip'"

    if ($result.StatusCode -eq 0) {
        $EmailFrom = "*@*.*"
        $EmailTo = "*@*.*" 
        $Subject = "########" 
        $Body = "####################################" 
        $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
    } else {
        Start-Sleep -s 15

        $EmailFrom = "*@*.*"
        $EmailTo = "*@*.*" 
        $Subject = "################" 
        $Body = "##########################################" 
        $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
    }
}

运行时记录:

PS Microsoft.PowerShell.Core\FileSystem::***********> *******\vpn.ps1
#FIRST EMAIL SENT
No connections
Command completed successfully.
Connecting to *********...
Verifying username and password...
Registering your computer on the network...
Successfully connected to ******.
Command completed successfully.
Exception calling "Send" with "4" argument(s): "Failure sending mail."
At \\tsclient\C\New folder\vpn.ps1:26 char:9
+         $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SmtpException


PS Microsoft.PowerShell.Core\FileSystem::******

我已感应到用户名、密码、地址等。我的脚本有什么问题?

【问题讨论】:

  • "发送邮件失败。"是一般错误消息,通常表示无法找到或连接到$SmtpServer
  • 但是第一封邮件发送正常。
  • 您是否尝试过暂停几分钟(从 1 开始,然后是 5),然后再发送另一封邮件?也许 SMTP 服务器上有针对垃圾邮件的保护措施?

标签: email powershell smtp vpn


【解决方案1】:

您的 $SMTPClient 对象未在 else 块中声明。 您需要在块内使用该对象的实例,或者在外部声明它,以拥有一个全局 $SMTPClient 对象,该对象存在于块中。您还必须填写$SMTPClient.Credentials

最好的解决方案是在第 3 行的 if 语句之前声明两者。

更新

移动这些行

$SMTPServer = "*.*.*.*" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, ***) 
#$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("*@*.*", "*************"); 

在那些 if .. else .. 中

只需将其移至第 2 行,就在 if 块之前。

【讨论】:

  • 将第 11 到 14 行移到第 3 行上方。
  • 它被声明了,但由于嵌套的If/Else 语句和嵌套的If/Else 缺少缩进,它看起来不像它。由于缩进的方式,脚本有点难以理解,请尝试忽略它并重新阅读脚本。
  • TheMadTechnician 是完全正确的,我们都被缩进所拥有。重新编写问题中的代码以提高可读性和理解性。这个答案现在需要更新......或者是错误的。
猜你喜欢
  • 2016-11-03
  • 2012-10-07
  • 2015-10-14
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2013-04-29
  • 2010-11-16
相关资源
最近更新 更多