Send-MailMessage是否具有Integrated Security = SSPI选项?

时间:2018-09-19 00:03:33

标签: powershell

我有一个表,用于存储通过脚本中的Powershell查询调用的电子邮件变量/值。

Send-MailMessage -From $From_Email -To $To_Email -Subject $Job_Success_Email_Subject -Body $Email_Body -SmtpServer $SmtpServer -port $SmtpPort -Credential $SmtpCredentials -usessl

我主要对从数据库传递的用户名/密码凭据感兴趣,但是使用Get-Credential时出现此错误:

$SmtpCredentials = Get-Credential
  

Send-MailMessage:SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器   响应是:需要身份验证

如果我是这样从数据库传递凭据的,则:

$SmtpPassword = $SmtpPassword | ConvertTo-SecureString -AsPlainText -Force

$SmtpCredentials = New-Object System.Management.Automation.PSCredential($SmtpUser,$SmtpPassword)

注意:此密码目前仅出于测试目的而未加密!

我遇到了这两个错误:

  

新对象:找不到“ PSCredential”和   参数计数:“ 2”。

然后我得到一个凭据弹出式登录名,如果我什么都没输入,我得到这个错误:

  

Send-MailMessage:无法验证参数“ Credential”上的参数。   参数为null或为空。提供一个不为null或   清空,然后再次尝试命令。

如果我确实手动输入凭据,则会得到以下信息:

  

Send-MailMessage:SMTP服务器需要安全连接,或者   客户端未通过身份验证。服务器响应为:身份验证   必填

我知道此错误已讨论并回答了一些问题,但是我经历了所有可能的解决方案,例如usesslConvertTo-SecureString -AsPlainText -Force,但它没有用。我也尝试过[string][ValidateNotNullOrEmpty()]$SmtpPassword,但这似乎也没有效果。

因此,现在,为了确保它不是凭据本身的问题,我想使用类似Integrated Security=SSPI的方法(例如sql连接字符串允许但要使用Send-Mail命令进行测试)

2 个答案:

答案 0 :(得分:1)

我已经解决了问题!

因此,显然我使用的ID(用户名)不在Active Directory组中。所以我使用了AD组中的另一个ID,它起作用了!

例如:

我在Dev环境中编写脚本,并认为我只需要使用Dev ID和密码,无论我尝试了什么,都无法使用。

我尝试了测试环境ID /密码,该ID /密码是最近构建/要求添加到使用Dev开发的脚本中的AD组中的,它可以正常工作!

答案 1 :(得分:0)

您应该使用System.Net.NetworkCredential对象来传递凭据。之间尝试一下。每次都能完美地工作。

Function Send-Email {
    Param (
        [Parameter(`
            Mandatory=$true)]
        [String]$SendTo,
        [Parameter(`
            Mandatory=$true)]
        [String]$Subject,
        [Parameter(`
            Mandatory=$true)]
        [String]$Body,
        [Parameter(`
            Mandatory=$true)]
        [String]$EmailFrom="abc@123.com",  #This gives a default value to the $EmailFrom command
        [Parameter(`
            mandatory=$false)]
        [String]$attachment,
        [Parameter(`
            mandatory=$true)]
        [String]$Password
    )

        $SMTPServer = "smtp.gmail.com" 
        $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$SendTo,$Subject,$Body)
        if ($attachment -ne $null) {
            $SMTPattachment = New-Object System.Net.Mail.Attachment($attachment)
            $SMTPMessage.Attachments.Add($SMTPattachment)
        }
        $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
        $SMTPClient.EnableSsl = $true 
        $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom.Split("@")[0], $Password); 
        $SMTPClient.Send($SMTPMessage)
        Remove-Variable -Name SMTPClient
        Remove-Variable -Name Password

}

使用调用

Send-EMail -SendTo "him@hotmail.com" -Body "Test Body" -Subject "Test Subject" -attachment "C:\something.pdf" -password "Password"