【问题标题】:Using powershell function Send-MailMessage getting an error: Cannot find an overload for "PSCredential"使用 powershell 函数 Send-MailMessage 收到错误:找不到“PSCredential”的重载
【发布时间】:2021-11-09 05:31:00
【问题描述】:

我想使用函数 Send-MailMessage 通过 powershell 发送电子邮件。

我的 smtp 服务器需要用户名和密码。

我将它作为参数传递,但出现错误。

 $CredUser = "123UserPass"
 $CredPassword = "1234/5678/999"
 $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $CredUser, $CredPassword
 Send-MailMessage -SmtpServer "smtp.amazonaws.com" -Port 587 -Credential $Credential -UseSsl -From 'DBATeam@email.com' -To 'me@email.com' -Subject 'TEST'

错误信息:

New-Object : Cannot find an overload for "PSCredential" and the argument count: "2".
At line:3 char:16
+ ... redential = New-Object -TypeName System.Management.Automation.PSCrede ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

Send-MailMessage : Cannot process argument transformation on parameter 'Credential'. userName
At line:4 char:90
+ ... tp.us-east-2.amazonaws.com" -Port 587 -Credential $Credential -UseSsl ...
+                                                       ~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Send-MailMessage], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Microsoft.PowerShell.Commands.SendMailMessage

我尝试使用ConvertTo-SecureString -String "mypassword",但也遇到了转换错误。

【问题讨论】:

    标签: powershell smtp cmdlets


    【解决方案1】:

    试试:

    $credpassword = ConvertTo-SecureString -AsPlainText "mypassword" -Force
    

    如果您使用的是 5.1 或更高版本,您还可以使用 ::new() 静态方法代替 New-Object(完全可选)。

    $credpassword = ConvertTo-SecureString -AsPlainText "mypassword" -Force
    [System.Management.Automation.PSCredential]::new( $CredUser, $CredPassword )
    Send-MailMessage -SmtpServer "smtp.amazonaws.com" -Port 587 -Credential $Credential -UseSsl -From 'DBATeam@email.com' -To 'me@email.com' -Subject 'TEST'
    

    如果你想增加一些可读性,你可以合并喷溅:

    $credpassword = ConvertTo-SecureString -AsPlainText "mypassword" -Force
    [System.Management.Automation.PSCredential]::new( $CredUser, $CredPassword )
    
    $SMTPParams = @{
       SmtpServer = 'smtp.amazonaws.com'
       Port       = 587
       Credential = $Credential
       UseSsl     = $true
       From       = 'DBATeam@email.com'
       To         = 'me@email.com'
       Subject    = 'TEST'
    }
    
    Send-MailMessage @SMTPParams
    

    注意:有些人可能会对可见的密码感到不满。您可以将密码安全地存储在一个文件中,然后调用它以供使用。只要是同一台机器上的同一用户。

    $SecurePassword = 读取主机 - 提示“输入密码” -AsSecureString $安全密码 | ConvertFrom-SecureString |输出文件 C:\temp\SecurePasswword.txt

    $CredPassword = Get-Content C:\temp\SecurePasswword.txt | ConvertTo-SecureString 
    [System.Management.Automation.PSCredential]::new( $CredUser, $CredPassword )
    

    显然,您需要更改文件的路径,以免对其进行宣传。使用前 2 行建立密码文件。然后使用当前脚本中的第二个 2 来设置 SMTP 命令的凭据...

    记录在案的here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2020-01-30
      • 2016-09-06
      • 1970-01-01
      • 2023-03-02
      相关资源
      最近更新 更多