【问题标题】:Is there an Integrated Security=SSPI option for Send-MailMessage?Send-MailMessage 是否有 Integrated Security=SSPI 选项?
【发布时间】:2019-02-23 01:17:41
【问题描述】:

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

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

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

$SmtpCredentials = Get-Credential

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

如果我像这样从数据库传递我的凭据:

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

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

注意:密码暂时未加密,仅用于测试目的!

我收到这 2 个错误:

New-Object:找不到“PSCredential”的重载和 参数计数:“2”。

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

Send-MailMessage:无法验证参数“凭据”上的参数。 参数为 null 或空。提供一个不为空的参数或 为空,然后重试该命令。

如果我手动输入凭据,我会改为:

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

我知道这个错误有讨论和回答的线程,但我已经尝试了所有可能的解决方案,例如usesslConvertTo-SecureString -AsPlainText -Force,但它不起作用。我也试过[string][ValidateNotNullOrEmpty()]$SmtpPassword,但这似乎也没有效果。

所以现在,为了确保它不是凭据本身的问题,我想使用类似Integrated Security=SSPI 之类的东西进行测试,比如 sql 连接字符串允许但发送邮件命令

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我已经解决了问题!

    很明显,我使用的 ID(用户名)不在 Active Directory 组中。所以我使用了 AD 组中的另一个 ID 并且它有效!

    例如:

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

    我尝试了最近在 Dev 编写的脚本中构建/请求添加到 AD 组中的测试环境 ID/密码,并且成功了!

    【讨论】:

      【解决方案2】:

      您应该使用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"
      

      【讨论】:

      • 在此之前我已经尝试过该示例的类似版本,但仍然收到错误消息。无论如何,我在尝试您的代码时仍然收到错误:使用“1”参数调用“发送”的异常:“SMTP 服务器需要安全连接或客户端未经过身份验证。服务器响应是:需要身份验证”跨度>
      • 好吧,我知道发生了什么,但现在脚本运行良好,但是,我没有收到任何电子邮件
      • 另外,我们的用户名字段在哪里?不知道用户名怎么能接受密码?
      • 邮箱是用户名
      • 真的等一下吗?那么它真正发送的电子邮件呢?如果我不是每次都从同一封电子邮件发送怎么办...
      猜你喜欢
      • 2010-11-16
      • 2010-12-23
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多